diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
index d64b336c7..c057d41a7 100644
--- a/RELEASE_NOTES.txt
+++ b/RELEASE_NOTES.txt
@@ -5,7 +5,7 @@ This is a development version of RawTherapee. We update the code every day, whic
While we only commit tested and relatively stable code and so the development versions should be fairly stable, you should be aware that:
- They only had limited testing, so there may be bugs unknown to us.
-- You should report these bugs so they get fixed for the stable release. See www.rawpedia.rawtherapee.com/How_to_write_useful_bug_reports The way tools work in the development versions is likely to change as we tweak and tune them, so your processing profiles may produce different results when used in a future stable versions.
+- You should report these bugs so they get fixed for the stable release. See www.rawpedia.rawtherapee.com/How_to_write_useful_bug_reports The way new tools work in the development versions is likely to change as we tweak and tune them, so your processing profiles may produce different results when used in a future stable versions.
- Bugs present in the stable versions get fixed, and until a new stable version is released these fixes are present in these development versions, thereby making the development version "more stable" than the previous stable version. At the same time, new features may introduce new bugs :) This is a trade-off you should be aware of.
In order to use RawTherapee efficiently you should know that:
@@ -19,7 +19,7 @@ Refer to RawPedia for information about RawTherapee's tools and how to use them.
DOCUMENTATION
-------------
-http://rawtherapee.com/documentation
+http://rawtherapee.com/blog/documentation
http://rawpedia.rawtherapee.com/
REPORTING BUGS
@@ -44,5 +44,5 @@ http://plus.google.com/106783532637761598368
REVISION HISTORY
----------------
The complete changelog is available at:
-https://code.google.com/p/rawtherapee/source/list
+https://github.com/Beep6581/RawTherapee/commits/master
diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala
index f8e21bdc1..7a7d4e400 100644
--- a/rtdata/languages/Catala
+++ b/rtdata/languages/Catala
@@ -495,7 +495,6 @@ PARTIALPASTE_FLATFIELDBLURRADIUS;Radi borrositat CP
PARTIALPASTE_FLATFIELDBLURTYPE;Tipus borrositat CP
PARTIALPASTE_FLATFIELDFILE;Fitxer de camp pla
PARTIALPASTE_HSVEQUALIZER;Equalitzador HSV
-PARTIALPASTE_ICMGAMMA;Sortida gama
PARTIALPASTE_ICMSETTINGS;Ajustos gestió de color
PARTIALPASTE_IMPULSEDENOISE;Impuls de reducció de soroll
PARTIALPASTE_IPTCINFO;Dades IPTC
@@ -1274,6 +1273,26 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_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
@@ -1306,6 +1325,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter
!PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_WAVELETGROUP;Wavelet Levels
!PREFERENCES_AUTLISLOW;Low
!PREFERENCES_AUTLISMAX;Max - Average of all tiles
@@ -1590,7 +1610,7 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1722,6 +1742,54 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix
!TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.
!TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_LUMAMODE;Luminosity mode
!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
@@ -1751,7 +1819,6 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1765,7 +1832,6 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1777,9 +1843,9 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1842,7 +1908,6 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1889,10 +1954,6 @@ ZOOMPANEL_ZOOMOUT;Allunya\nDrecera: -
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified)
index 11c13d31a..38a6e31f8 100644
--- a/rtdata/languages/Chinese (Simplified)
+++ b/rtdata/languages/Chinese (Simplified)
@@ -402,7 +402,6 @@ PARTIALPASTE_EXIFCHANGES;对exif所做的修改
PARTIALPASTE_EXPOSURE;曝光
PARTIALPASTE_GRADIENT;渐变过滤
PARTIALPASTE_HSVEQUALIZER;HSV均衡
-PARTIALPASTE_ICMGAMMA;到处伽吗值
PARTIALPASTE_ICMSETTINGS;ICM 设置
PARTIALPASTE_IPTCINFO;IPTC 信息
PARTIALPASTE_LABCURVE;Lab调整
@@ -1188,6 +1187,26 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!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).
@@ -1234,6 +1253,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!PARTIALPASTE_RAW_DMETHOD;Demosaic method
!PARTIALPASTE_RAW_FALSECOLOR;False color suppression
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_WAVELETGROUP;Wavelet Levels
!PREFERENCES_AUTLISLOW;Low
!PREFERENCES_AUTLISMAX;Max - Average of all tiles
@@ -1522,7 +1542,7 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1689,6 +1709,54 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.
!TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix
!TP_RESIZE_APPLIESTO;Applies to:
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!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
@@ -1734,7 +1802,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1748,7 +1815,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1760,9 +1826,9 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1825,7 +1891,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1872,10 +1937,6 @@ ZOOMPANEL_ZOOMOUT;缩放拉远\n快捷键: -
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional)
index 710706d1b..55433c068 100644
--- a/rtdata/languages/Chinese (Traditional)
+++ b/rtdata/languages/Chinese (Traditional)
@@ -922,6 +922,26 @@ TP_WBALANCE_TEMPERATURE;色溫
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_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
@@ -1002,7 +1022,6 @@ TP_WBALANCE_TEMPERATURE;色溫
!PARTIALPASTE_FLATFIELDFILE;Flat-field file
!PARTIALPASTE_GRADIENT;Graduated filter
!PARTIALPASTE_HSVEQUALIZER;HSV equalizer
-!PARTIALPASTE_ICMGAMMA;Output gamma
!PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction
!PARTIALPASTE_LABCURVE;L*a*b* adjustments
!PARTIALPASTE_LENSPROFILE;Lens correction profile
@@ -1024,6 +1043,7 @@ TP_WBALANCE_TEMPERATURE;色溫
!PARTIALPASTE_RAW_DMETHOD;Demosaic method
!PARTIALPASTE_RAW_FALSECOLOR;False color suppression
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_RGBCURVES;RGB curves
!PARTIALPASTE_SHARPENEDGE;Edges
!PARTIALPASTE_SHARPENMICRO;Microcontrast
@@ -1399,7 +1419,7 @@ TP_WBALANCE_TEMPERATURE;色溫
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1656,6 +1676,54 @@ TP_WBALANCE_TEMPERATURE;色溫
!TP_RESIZE_FITBOX;Bounding Box
!TP_RESIZE_FULLIMAGE;Full Image
!TP_RESIZE_LANCZOS;Lanczos
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_BLUE;B
!TP_RGBCURVES_CHANNEL;Channel
!TP_RGBCURVES_GREEN;G
@@ -1719,7 +1787,6 @@ TP_WBALANCE_TEMPERATURE;色溫
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1733,7 +1800,6 @@ TP_WBALANCE_TEMPERATURE;色溫
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1745,9 +1811,9 @@ TP_WBALANCE_TEMPERATURE;色溫
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1810,7 +1876,6 @@ TP_WBALANCE_TEMPERATURE;色溫
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1857,10 +1922,6 @@ TP_WBALANCE_TEMPERATURE;色溫
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech
index 8deab96b5..c1610bb87 100644
--- a/rtdata/languages/Czech
+++ b/rtdata/languages/Czech
@@ -747,7 +747,6 @@ PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field kontrola oříznutí
PARTIALPASTE_FLATFIELDFILE;Flat Field soubor
PARTIALPASTE_GRADIENT;Přechodový filtr
PARTIALPASTE_HSVEQUALIZER;HSV korekce
-PARTIALPASTE_ICMGAMMA;Výstupní gama
PARTIALPASTE_ICMSETTINGS;Nastavení správy barev
PARTIALPASTE_IMPULSEDENOISE;Redukce impulzního šumu
PARTIALPASTE_IPTCINFO;IPTC
@@ -1604,7 +1603,6 @@ TP_WAVELET_6;Úroveň 6
TP_WAVELET_7;Úroveň 7
TP_WAVELET_8;Úroveň 8
TP_WAVELET_9;Úroveň 9
-TP_WAVELET_ALL;Všechny úrovně ve všech směrech
TP_WAVELET_APPLYTO;Použít na
TP_WAVELET_AVOID;Zabránit posunu barev
TP_WAVELET_CH1;Všechny barvy
@@ -1621,7 +1619,6 @@ TP_WAVELET_CONTRA;Kontrast
TP_WAVELET_CONTRA_TOOLTIP;Změní kontrast zůstatku obrazu\nFunkce maximálních úrovní
TP_WAVELET_CONTR;Paleta - nastavení
TP_WAVELET_DALL;Všechny směry
-TP_WAVELET_DISP;Nastavení náhledu
TP_WAVELET_DONE;Svisle
TP_WAVELET_DTHR;Napříč
TP_WAVELET_DTWO;Vodorovně
@@ -1637,7 +1634,6 @@ TP_WAVELET_HUESKIN;Rozsah odstínů (pleť)
TP_WAVELET_HUESKIN_TOOLTIP;Pyramida je pro horní část, kde je algoritmus nejvíce efektivní.\nKe spodní části, tranzitním zónám.\nPokud potřebujete posunout oblast hodně doleva nebo doprava - nebo pokud se vyskytnou artefakty = vyvážení bílé není správné, můžete mírně zmenšit zónu aby jste zabránili ovlivnění ostatních částí obrázku.
TP_WAVELET_HUESKY;Rozsah odstínů (obloha)
TP_WAVELET_HUESKY_TOOLTIP;Pyramida je pro horní část, kde je algoritmus nejvíce efektivní.\nKe spodní části, tranzitním zónám.\nPokud potřebujete posunout oblast hodně doleva nebo doprava - nebo pokud se vyskytnou artefakty = vyvážení bílé není správné, můžete mírně zmenšit zónu aby jste zabránili ovlivnění ostatních částí obrázku.
-TP_WAVELET_INF;Méně nebo shodně s úrovní
TP_WAVELET_LABEL;Úrovně vlnky
TP_WAVELET_LARGEST;Nejhrubší
TP_WAVELET_LEVCH;Barevnost
@@ -1648,10 +1644,8 @@ TP_WAVELET_LEVLABEL;Náhled maximálně dostupné úrovně=%1
TP_WAVELET_LOWLIGHT;Rozsah projasnění stínů
TP_WAVELET_MEDI;Omezení artefaktů na modré obloze
TP_WAVELET_NEUTRAL;Neutrální
-TP_WAVELET_ONE;Jedna úroveň
TP_WAVELET_OPACITY;Neprůhlednost modrá-žlutá Úrovně
TP_WAVELET_PASTEL;Barevnost pastelů
-TP_WAVELET_PREVIEWLEVELS;Náhled
TP_WAVELET_RESCHRO;Barevnost
TP_WAVELET_RESCONH;Světla
TP_WAVELET_RESCON;Stíny
@@ -1814,8 +1808,29 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: -
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!MAIN_TAB_WAVELET;Wavelet
!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_WAVELETGROUP;Wavelet Levels
!PREFERENCES_CURVEBBOXPOS;Position of curve copypasta buttons
!PREFERENCES_CURVEBBOXPOS_ABOVE;Above
@@ -1848,6 +1863,54 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: -
!TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions.
!TP_RAW_HD;Threshold
!TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, but false positives may lead to artifacts. If you notice any artifacts appearing when enabling the Hot/Dead Pixel Filters, gradually increase the threshold value until they disappear.
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_WAVELET_B0;Black
!TP_WAVELET_B1;Grey
!TP_WAVELET_B2;Residual
@@ -1861,22 +1924,20 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: -
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CHCU;Curve
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
!TP_WAVELET_COMPTM;Tone mapping
!TP_WAVELET_CONTEDIT;'After' contrast curve
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1916,7 +1977,6 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: -
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
!TP_WAVELET_MEDILEV_TOOLTIP;When you enable Edge Detection, it is recommanded:\n- to disabled low contrast levels to avoid artifacts,\n- to use high values of gradient sensitivity.\n\nYou can modulate the strength with 'refine' from Denoise and Refine.
@@ -1934,10 +1994,6 @@ ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: -
!TP_WAVELET_RE1;Reinforced
!TP_WAVELET_RE2;Unchanged
!TP_WAVELET_RE3;Reduced
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk
index 66acbfb22..8c3c0d651 100644
--- a/rtdata/languages/Dansk
+++ b/rtdata/languages/Dansk
@@ -918,6 +918,26 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_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
@@ -1000,7 +1020,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!PARTIALPASTE_FLATFIELDFILE;Flat-field file
!PARTIALPASTE_GRADIENT;Graduated filter
!PARTIALPASTE_HSVEQUALIZER;HSV equalizer
-!PARTIALPASTE_ICMGAMMA;Output gamma
!PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction
!PARTIALPASTE_LABCURVE;L*a*b* adjustments
!PARTIALPASTE_LENSPROFILE;Lens correction profile
@@ -1022,6 +1041,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!PARTIALPASTE_RAW_DMETHOD;Demosaic method
!PARTIALPASTE_RAW_FALSECOLOR;False color suppression
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_RGBCURVES;RGB curves
!PARTIALPASTE_SHARPENEDGE;Edges
!PARTIALPASTE_SHARPENMICRO;Microcontrast
@@ -1397,7 +1417,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1655,6 +1675,54 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_RESIZE_LANCZOS;Lanczos
!TP_RESIZE_SPECIFY;Specify:
!TP_RESIZE_WIDTH;Width
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_BLUE;B
!TP_RGBCURVES_CHANNEL;Channel
!TP_RGBCURVES_GREEN;G
@@ -1718,7 +1786,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1732,7 +1799,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1744,9 +1810,9 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1809,7 +1875,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1856,10 +1921,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch
index 362879fa6..a7afd6fdc 100644
--- a/rtdata/languages/Deutsch
+++ b/rtdata/languages/Deutsch
@@ -818,7 +818,6 @@ PARTIALPASTE_FLATFIELDCLIPCONTROL;Weißbild: Kontrolle zu heller Bereiche
PARTIALPASTE_FLATFIELDFILE;Weißbild: Datei
PARTIALPASTE_GRADIENT;Grauverlaufsfilter
PARTIALPASTE_HSVEQUALIZER;Farbton (H) / Sättigung (S) / Dynamik (V)
-PARTIALPASTE_ICMGAMMA;Ausgabe-Gamma
PARTIALPASTE_ICMSETTINGS;ICM-Einstellungen
PARTIALPASTE_IMPULSEDENOISE;Impulsrauschreduzierung
PARTIALPASTE_IPTCINFO;IPTC-Informationen
@@ -1722,7 +1721,6 @@ TP_WAVELET_BANONE;Keine
TP_WAVELET_BASLI;Regler
TP_WAVELET_BATYPE;Kontrastmethode
TP_WAVELET_CBENAB;Farbausgleich
-TP_WAVELET_CBTYPE;Farbausgleich
TP_WAVELET_CCURVE;Lokaler Kontrast
TP_WAVELET_CH1;Gesamter Farbbereich
TP_WAVELET_CH2;Sättigung/Pastell
@@ -1735,7 +1733,6 @@ TP_WAVELET_CHR_TOOLTIP;Farbton als Funktion des Kontrasts und der Farbton-Kontra
TP_WAVELET_CHSL;Regler
TP_WAVELET_CHTYPE;Chrominanzmethode
TP_WAVELET_COLORT;Deckkraft Rot/Grün
-TP_WAVELET_COMBOTH;Beide
TP_WAVELET_COMPCONT;Kontrast
TP_WAVELET_COMPGAMMA;Gammakompression
TP_WAVELET_COMPGAMMA_TOOLTIP;Das Anpassen des Gammawerts des Nachbildes ermöglicht das Angleichen der Daten und des Histogramms
@@ -1812,7 +1809,6 @@ TP_WAVELET_LEVTWO;Ebene 3
TP_WAVELET_LEVZERO;Ebene 1
TP_WAVELET_LINKEDG;Mit der Kantenschärfungsstärke verlinken
TP_WAVELET_LIPST;Erweiterter Algorithmus
-TP_WAVELET_LIPST_TOOLTIP;Dieser Algorithmus verwendet einen Pixel und acht seiner Nachbarn. Sind die Unterschiede gering, werden die Ränder verstärkt.
TP_WAVELET_LOWLIGHT;Schatten-Luminanzbereich
TP_WAVELET_MEDGREINF;Erste Ebene
TP_WAVELET_MEDILEV;Kantenerkennung
@@ -1859,10 +1855,6 @@ TP_WAVELET_TILESFULL;Ganzes Bild
TP_WAVELET_TILESIZE;Kachelgröße
TP_WAVELET_TILESLIT;Kleine Kacheln
TP_WAVELET_TILES_TOOLTIP;“Ganzes Bild“ (empfohlen) liefert eine bessere Qualität.\n“Kacheln“ benötigen weniger Speicher und sind nur für Computer mit wenig RAM zu empfehlen.
-TP_WAVELET_TMHIGH;Hoch
-TP_WAVELET_TMLOWHIGH;Niedrig + Hoch
-TP_WAVELET_TMNONE;Keine
-TP_WAVELET_TMSTD;Standard
TP_WAVELET_TMSTRENGTH;Stärke
TP_WAVELET_TMSTRENGTH_TOOLTIP;Kontrolliert die Stärke der Dynamik- oder Kontrastkompression des Nachbildes. Ist der Wert ungleich 0, werden die Stärke- und Gammaregler des Dynamikkompressions-Werkzeugs im Belichtungsreiter deaktiviert.
TP_WAVELET_TMTYPE;Kompression
@@ -1925,4 +1917,73 @@ ZOOMPANEL_ZOOMOUT;Herauszoomen\nTaste: -
! Untranslated keys follow; remove the ! prefix after an entry is translated.
!!!!!!!!!!!!!!!!!!!!!!!!!
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
+!PARTIALPASTE_RETINEX;Retinex
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK)
index 9df9ea9b6..e30422f98 100644
--- a/rtdata/languages/English (UK)
+++ b/rtdata/languages/English (UK)
@@ -20,6 +20,7 @@ HISTORY_MSG_257;Colour Toning
HISTORY_MSG_258;CT - Colour curve
HISTORY_MSG_322;W - Gamut - Avoid colour shift
HISTORY_MSG_385;W - Residual - Colour Balance
+HISTORY_MSG_419;Retinex - Colour space
MAIN_TAB_COLOR;Colour
MAIN_TOOLTIP_BACKCOLOR0;Background colour of the preview: Theme-based\nShortcut: 9
MAIN_TOOLTIP_BACKCOLOR1;Background colour of the preview: Black\nShortcut: 9
@@ -96,7 +97,6 @@ TP_VIGNETTING_CENTER_X;Centre X
TP_VIGNETTING_CENTER_Y;Centre Y
TP_WAVELET_AVOID;Avoid colour shift
TP_WAVELET_CBENAB;Toning and Colour Balance
-TP_WAVELET_CBTYPE;Toning and Colour Balance
TP_WAVELET_CB_TOOLTIP;For strong values product colour-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
TP_WAVELET_CHRO_TOOLTIP;Sets the wavelet level which will be the threshold between saturated and pastel colours.\n1-x: saturated\nx-9: pastel\n\nIf the value exceeds the amount of wavelet levels you are using then it will be ignored.
TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "white balance" by modulating the blue/red balance.\nThis can be useful when shooting conditions:\na) are far from the standard illuminant (e.g. underwater),\nb) are far from conditions where calibrations were performed,\nc) where the matrices or ICC profiles are unsuitable.
@@ -716,6 +716,25 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_NEWSNAPSHOT;Add
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!HISTORY_SNAPSHOTS;Snapshots
@@ -872,7 +891,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!PARTIALPASTE_FLATFIELDFILE;Flat-field file
!PARTIALPASTE_GRADIENT;Graduated filter
!PARTIALPASTE_HSVEQUALIZER;HSV equalizer
-!PARTIALPASTE_ICMGAMMA;Output gamma
!PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction
!PARTIALPASTE_IPTCINFO;IPTC
!PARTIALPASTE_LABCURVE;L*a*b* adjustments
@@ -897,6 +915,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!PARTIALPASTE_RAW_DMETHOD;Demosaic method
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
!PARTIALPASTE_RESIZE;Resize
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_RGBCURVES;RGB curves
!PARTIALPASTE_ROTATION;Rotation
!PARTIALPASTE_SHADOWSHIGHLIGHTS;Shadows/highlights
@@ -1354,7 +1373,7 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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
@@ -1622,6 +1641,54 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!TP_RESIZE_SPECIFY;Specify:
!TP_RESIZE_WIDTH;Width
!TP_RESIZE_W;Width:
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_BLUE;B
!TP_RGBCURVES_CHANNEL;Channel
!TP_RGBCURVES_GREEN;G
@@ -1717,7 +1784,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1729,9 +1795,9 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1794,7 +1860,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1841,10 +1906,6 @@ TP_WBALANCE_EQBLUERED_TOOLTIP;Allows to deviate from the normal behaviour of "wh
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US)
index 34413967d..9edc36113 100644
--- a/rtdata/languages/English (US)
+++ b/rtdata/languages/English (US)
@@ -636,6 +636,26 @@
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_NEWSNAPSHOT;Add
!HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
!HISTORY_SNAPSHOTS;Snapshots
@@ -798,7 +818,6 @@
!PARTIALPASTE_FLATFIELDFILE;Flat-field file
!PARTIALPASTE_GRADIENT;Graduated filter
!PARTIALPASTE_HSVEQUALIZER;HSV equalizer
-!PARTIALPASTE_ICMGAMMA;Output gamma
!PARTIALPASTE_ICMSETTINGS;Color management settings
!PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction
!PARTIALPASTE_IPTCINFO;IPTC
@@ -825,6 +844,7 @@
!PARTIALPASTE_RAW_FALSECOLOR;False color suppression
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
!PARTIALPASTE_RESIZE;Resize
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_RGBCURVES;RGB curves
!PARTIALPASTE_ROTATION;Rotation
!PARTIALPASTE_SHADOWSHIGHLIGHTS;Shadows/highlights
@@ -1319,7 +1339,7 @@
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1611,6 +1631,54 @@
!TP_RESIZE_SPECIFY;Specify:
!TP_RESIZE_WIDTH;Width
!TP_RESIZE_W;Width:
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_BLUE;B
!TP_RGBCURVES_CHANNEL;Channel
!TP_RGBCURVES_GREEN;G
@@ -1702,7 +1770,6 @@
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1716,7 +1783,6 @@
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1728,9 +1794,9 @@
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1793,7 +1859,6 @@
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1840,10 +1905,6 @@
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol
index 05611d2da..a8777b87e 100644
--- a/rtdata/languages/Espanol
+++ b/rtdata/languages/Espanol
@@ -722,7 +722,6 @@ PARTIALPASTE_FLATFIELDBLURTYPE;Tipo de difuminado de campo plano
PARTIALPASTE_FLATFIELDCLIPCONTROL;Control de recorte de Campo Plano
PARTIALPASTE_FLATFIELDFILE;Archivo de campo plano
PARTIALPASTE_HSVEQUALIZER;Ecualizador HSV
-PARTIALPASTE_ICMGAMMA;Gamma de salida
PARTIALPASTE_ICMSETTINGS;Ajustes de Gestión de Color
PARTIALPASTE_IMPULSEDENOISE;Impulsar Reducción de ruido
PARTIALPASTE_IPTCINFO;Información IPTC
@@ -1678,6 +1677,26 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: -
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!MAIN_TAB_INSPECT; Inspect
!MAIN_TAB_WAVELET;Wavelet
!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w
@@ -1692,6 +1711,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: -
!NAVIGATOR_V;V:
!PARTIALPASTE_EQUALIZER;Wavelet levels
!PARTIALPASTE_GRADIENT;Graduated filter
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_WAVELETGROUP;Wavelet Levels
!PREFERENCES_AUTLISLOW;Low
!PREFERENCES_AUTLISMAX;Max - Average of all tiles
@@ -1760,7 +1780,7 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: -
!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1795,6 +1815,54 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: -
!TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions.
!TP_RAW_HD;Threshold
!TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, but false positives may lead to artifacts. If you notice any artifacts appearing when enabling the Hot/Dead Pixel Filters, gradually increase the threshold value until they disappear.
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_WAVELET_1;Level 1
!TP_WAVELET_2;Level 2
!TP_WAVELET_3;Level 3
@@ -1819,7 +1887,6 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: -
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1833,7 +1900,6 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: -
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1845,9 +1911,9 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: -
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1910,7 +1976,6 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: -
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1957,10 +2022,6 @@ ZOOMPANEL_ZOOMOUT;Reducir Zoom\nAtajo: -
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara
index e2365b060..bc4f034f8 100644
--- a/rtdata/languages/Euskara
+++ b/rtdata/languages/Euskara
@@ -918,6 +918,26 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_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
@@ -1000,7 +1020,6 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!PARTIALPASTE_FLATFIELDFILE;Flat-field file
!PARTIALPASTE_GRADIENT;Graduated filter
!PARTIALPASTE_HSVEQUALIZER;HSV equalizer
-!PARTIALPASTE_ICMGAMMA;Output gamma
!PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction
!PARTIALPASTE_LABCURVE;L*a*b* adjustments
!PARTIALPASTE_LENSPROFILE;Lens correction profile
@@ -1022,6 +1041,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!PARTIALPASTE_RAW_DMETHOD;Demosaic method
!PARTIALPASTE_RAW_FALSECOLOR;False color suppression
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_RGBCURVES;RGB curves
!PARTIALPASTE_SHARPENEDGE;Edges
!PARTIALPASTE_SHARPENMICRO;Microcontrast
@@ -1397,7 +1417,7 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1655,6 +1675,54 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!TP_RESIZE_LANCZOS;Lanczos
!TP_RESIZE_SPECIFY;Specify:
!TP_RESIZE_WIDTH;Width
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_BLUE;B
!TP_RGBCURVES_CHANNEL;Channel
!TP_RGBCURVES_GREEN;G
@@ -1718,7 +1786,6 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1732,7 +1799,6 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1744,9 +1810,9 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1809,7 +1875,6 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1856,10 +1921,6 @@ TP_WBALANCE_TEMPERATURE;Tenperatura
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais
index 56c7a7fa3..e49957537 100644
--- a/rtdata/languages/Francais
+++ b/rtdata/languages/Francais
@@ -796,7 +796,6 @@ PARTIALPASTE_FLATFIELDCLIPCONTROL;Contrôle de l'écrêtage du Champs Uniforme
PARTIALPASTE_FLATFIELDFILE;Fichier de Champ Uniforme
PARTIALPASTE_GRADIENT;Filtre Dégradé
PARTIALPASTE_HSVEQUALIZER;Égaliseur TSV
-PARTIALPASTE_ICMGAMMA;Gamma de sortie
PARTIALPASTE_ICMSETTINGS;Réglages ICM
PARTIALPASTE_IMPULSEDENOISE;Réduction du bruit d'impulsion
PARTIALPASTE_IPTCINFO;Infos IPTC
@@ -1700,7 +1699,6 @@ TP_WAVELET_BANONE;Aucun
TP_WAVELET_BASLI;Curseur
TP_WAVELET_BATYPE;Bal. du contraste par
TP_WAVELET_CBENAB;Virage Partiel et Balance Couleur
-TP_WAVELET_CBTYPE;Virage Partiel et Balance Couleur
TP_WAVELET_CB_TOOLTIP;Pour les valeurs élevées, produit un virage partiel en les combinant ou non avec les valeurs (courbes) spécifiées dans 'Virage'\nPour les faible valeurs, vous pouvez changer la balance des blancs du fond (ciel, ...) sans changer celui du premier plan, généralement plus contrasté.
TP_WAVELET_CCURVE;Contraste local
TP_WAVELET_CH1;Plage chromatique complète
@@ -1714,7 +1712,6 @@ TP_WAVELET_CHR_TOOLTIP;Ajuste le chroma en fonction des "niveaux de contraste" e
TP_WAVELET_CHSL;Curseurs
TP_WAVELET_CHTYPE;Méthode de chrominance
TP_WAVELET_COLORT;Opacité Rouge-Vert
-TP_WAVELET_COMBOTH;Les deux
TP_WAVELET_COMPCONT;Contraste
TP_WAVELET_COMPGAMMA;Compression gamma
TP_WAVELET_COMPGAMMA_TOOLTIP;Ajuster le gamma de l'image résiduelle vous permet d'équiilibrer les données de l'histograme.
@@ -1791,7 +1788,6 @@ TP_WAVELET_LEVTWO;Niveau 3
TP_WAVELET_LEVZERO;Niveau 1
TP_WAVELET_LINKEDG;Lier à la 'Force' de la 'Netteté des bords'
TP_WAVELET_LIPST;Algorithme amélioré
-TP_WAVELET_LIPST_TOOLTIP;Cet algorithme utilise la proximité d'un pixel et huit de ses voisins. Si moins de différence, les bords sont renforcés.
TP_WAVELET_LOWLIGHT;Plage de luminance des ombres
TP_WAVELET_MEDGREINF;Premier niveau
TP_WAVELET_MEDILEV;Détection des bords
@@ -1838,10 +1834,6 @@ TP_WAVELET_TILESFULL;Image entière
TP_WAVELET_TILESIZE;Méthode de découpage
TP_WAVELET_TILESLIT;Petites tuiles
TP_WAVELET_TILES_TOOLTIP;Traiter l'image entière donnera les meilleurs résulats et est l'option recommandé, l'usage des tuiles étant une solution alternative recommandé pour les utilisateurs disposant de peu de RAM. Cf. RawPedia pour la configuration mémoire requise.
-TP_WAVELET_TMHIGH;Haut
-TP_WAVELET_TMLOWHIGH;Bas+Haut
-TP_WAVELET_TMNONE;Aucun
-TP_WAVELET_TMSTD;Standard
TP_WAVELET_TMSTRENGTH;Force de la compression
TP_WAVELET_TMSTRENGTH_TOOLTIP;Contrôle la force de la compression tonale ou de la compression de contraste de l'image résiduelle. Lorsque la valeur est différente de 0, les curseurs Force et Gamma de l'outil Compression Tonale dans l'onglet Exposition seront grisés.
TP_WAVELET_TMTYPE;Méthode de compression
@@ -1901,3 +1893,76 @@ ZOOMPANEL_ZOOMFITSCREEN;Ajuster à la fenêtre\nRaccourci: f
ZOOMPANEL_ZOOMIN;Zoom Avant\nRaccourci: +
ZOOMPANEL_ZOOMOUT;Zoom Arrière\nRaccourci: -
+!!!!!!!!!!!!!!!!!!!!!!!!!
+! Untranslated keys follow; remove the ! prefix after an entry is translated.
+!!!!!!!!!!!!!!!!!!!!!!!!!
+
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
+!PARTIALPASTE_RETINEX;Retinex
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek
index 1529e40c4..a02384e50 100644
--- a/rtdata/languages/Greek
+++ b/rtdata/languages/Greek
@@ -917,6 +917,26 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_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
@@ -999,7 +1019,6 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!PARTIALPASTE_FLATFIELDFILE;Flat-field file
!PARTIALPASTE_GRADIENT;Graduated filter
!PARTIALPASTE_HSVEQUALIZER;HSV equalizer
-!PARTIALPASTE_ICMGAMMA;Output gamma
!PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction
!PARTIALPASTE_LABCURVE;L*a*b* adjustments
!PARTIALPASTE_LENSPROFILE;Lens correction profile
@@ -1021,6 +1040,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!PARTIALPASTE_RAW_DMETHOD;Demosaic method
!PARTIALPASTE_RAW_FALSECOLOR;False color suppression
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_RGBCURVES;RGB curves
!PARTIALPASTE_SHARPENEDGE;Edges
!PARTIALPASTE_SHARPENMICRO;Microcontrast
@@ -1396,7 +1416,7 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1654,6 +1674,54 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!TP_RESIZE_LANCZOS;Lanczos
!TP_RESIZE_SPECIFY;Specify:
!TP_RESIZE_WIDTH;Width
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_BLUE;B
!TP_RGBCURVES_CHANNEL;Channel
!TP_RGBCURVES_GREEN;G
@@ -1717,7 +1785,6 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1731,7 +1798,6 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1743,9 +1809,9 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1808,7 +1874,6 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1855,10 +1920,6 @@ TP_WBALANCE_TEMPERATURE;Θερμοκρασία
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew
index a2cd5a37f..4d17da309 100644
--- a/rtdata/languages/Hebrew
+++ b/rtdata/languages/Hebrew
@@ -918,6 +918,26 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_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
@@ -1000,7 +1020,6 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!PARTIALPASTE_FLATFIELDFILE;Flat-field file
!PARTIALPASTE_GRADIENT;Graduated filter
!PARTIALPASTE_HSVEQUALIZER;HSV equalizer
-!PARTIALPASTE_ICMGAMMA;Output gamma
!PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction
!PARTIALPASTE_LABCURVE;L*a*b* adjustments
!PARTIALPASTE_LENSPROFILE;Lens correction profile
@@ -1022,6 +1041,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!PARTIALPASTE_RAW_DMETHOD;Demosaic method
!PARTIALPASTE_RAW_FALSECOLOR;False color suppression
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_RGBCURVES;RGB curves
!PARTIALPASTE_SHARPENEDGE;Edges
!PARTIALPASTE_SHARPENMICRO;Microcontrast
@@ -1397,7 +1417,7 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1655,6 +1675,54 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!TP_RESIZE_LANCZOS;Lanczos
!TP_RESIZE_SPECIFY;Specify:
!TP_RESIZE_WIDTH;Width
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_BLUE;B
!TP_RGBCURVES_CHANNEL;Channel
!TP_RGBCURVES_GREEN;G
@@ -1718,7 +1786,6 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1732,7 +1799,6 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1744,9 +1810,9 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1809,7 +1875,6 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1856,10 +1921,6 @@ TP_WBALANCE_TEMPERATURE;מידת חום
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano
index 253ce2f50..520011c11 100644
--- a/rtdata/languages/Italiano
+++ b/rtdata/languages/Italiano
@@ -627,7 +627,6 @@ PARTIALPASTE_FLATFIELDBLURTYPE;Flat Field - Modalità di sfocamento
PARTIALPASTE_FLATFIELDFILE;File Flat Field
PARTIALPASTE_GRADIENT;Filtro Graduato
PARTIALPASTE_HSVEQUALIZER;Equalizzatore HSV
-PARTIALPASTE_ICMGAMMA;Gamma di uscita
PARTIALPASTE_ICMSETTINGS;Impostazioni Gestione Colore
PARTIALPASTE_IMPULSEDENOISE;Riduzione Rumore Puntuale
PARTIALPASTE_IPTCINFO;Informazioni IPTC
@@ -1542,6 +1541,26 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!MAIN_TAB_INSPECT; Inspect
!MAIN_TAB_WAVELET;Wavelet
!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w
@@ -1551,6 +1570,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control
!PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter
!PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_WAVELETGROUP;Wavelet Levels
!PREFERENCES_AUTLISLOW;Low
!PREFERENCES_AUTLISMAX;Max - Average of all tiles
@@ -1661,7 +1681,7 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1737,6 +1757,54 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix
!TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.
!TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_WAVELET_1;Level 1
!TP_WAVELET_2;Level 2
!TP_WAVELET_3;Level 3
@@ -1761,7 +1829,6 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1775,7 +1842,6 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1787,9 +1853,9 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1852,7 +1918,6 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1899,10 +1964,6 @@ ZOOMPANEL_ZOOMOUT;Rimpicciolisci.\nScorciatoia: -
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese
index 206228497..55a737344 100644
--- a/rtdata/languages/Japanese
+++ b/rtdata/languages/Japanese
@@ -829,7 +829,6 @@ PARTIALPASTE_FLATFIELDCLIPCONTROL;フラットフィールド クリップコ
PARTIALPASTE_FLATFIELDFILE;フラットフィールド ファイル
PARTIALPASTE_GRADIENT;グラデーションフィルター
PARTIALPASTE_HSVEQUALIZER;HSV イコライザ
-PARTIALPASTE_ICMGAMMA;出力ガンマ
PARTIALPASTE_ICMSETTINGS;ICM 設定
PARTIALPASTE_IMPULSEDENOISE;インパルス・ノイズ低減
PARTIALPASTE_IPTCINFO;IPTC 情報
@@ -1733,7 +1732,6 @@ TP_WAVELET_BANONE;なし
TP_WAVELET_BASLI;スライダー
TP_WAVELET_BATYPE;バランス方式
TP_WAVELET_CBENAB;カラートーンとカラーバランス
-TP_WAVELET_CBTYPE;カラートーンとカラーバランス
TP_WAVELET_CB_TOOLTIP;高い値は、’カラートーン’と併用するか、或いはカラートーンは使わないで単独で使います。\n低い値の場合は前景の色合いを変えずに背景(sky, ...) のホワイトバランスを変えるような効果を得られます。一般的にはコントラストが高くなる印象があります。
TP_WAVELET_CCURVE;ローカルコントラスト
TP_WAVELET_CH1;全ての色
@@ -1747,7 +1745,6 @@ TP_WAVELET_CHR_TOOLTIP;色度を”コントラストレベル”と”色度と
TP_WAVELET_CHSL;スライダー
TP_WAVELET_CHTYPE;調整の方法
TP_WAVELET_COLORT;レッド/グリーンの不透明度
-TP_WAVELET_COMBOTH;両方
TP_WAVELET_COMPCONT;コントラスト
TP_WAVELET_COMPGAMMA;ガンマの圧縮
TP_WAVELET_COMPGAMMA_TOOLTIP;残差画像のガンマを調整することで、画像データとヒストグラムの均衡を図ります。
@@ -1824,7 +1821,6 @@ TP_WAVELET_LEVTWO;レベル3
TP_WAVELET_LEVZERO;レベル1
TP_WAVELET_LINKEDG;エッジのシャープネスの強さとリンク
TP_WAVELET_LIPST;高度なアルゴリズム
-TP_WAVELET_LIPST_TOOLTIP;リプシッツ連続というアルゴリズムを使います。処理時間とメモリー消費量は増えますが、エッジ検出の精度は上がります
TP_WAVELET_LOWLIGHT;シャドウの輝度範囲
TP_WAVELET_MEDGREINF;最初のレベル
TP_WAVELET_MEDILEV;エッジ検出
@@ -1871,10 +1867,6 @@ TP_WAVELET_TILESFULL;画像全体
TP_WAVELET_TILESIZE;タイルのサイズ
TP_WAVELET_TILESLIT;小さいタイル
TP_WAVELET_TILES_TOOLTIP;画像全体を処理する方が良い結果をもたらすので、推奨される選択です。タイルによる処理はRAMの容量が小さいユーザー向けです。必要なメモリー容量に関してはRawPediaを参照して下さい。
-TP_WAVELET_TMHIGH;高
-TP_WAVELET_TMLOWHIGH;低と高に偏重
-TP_WAVELET_TMNONE;なし
-TP_WAVELET_TMSTD;標準
TP_WAVELET_TMSTRENGTH;残差の効力を圧縮
TP_WAVELET_TMSTRENGTH_TOOLTIP;トーンマッピングの強さや残差画像のコントラストの圧縮を加減します。値が0以外の場合、露光補正パネルのトーンマッピングでは、強さとガンマのスライダー無効となります
TP_WAVELET_TMTYPE;圧縮の方法
@@ -1933,3 +1925,76 @@ ZOOMPANEL_ZOOMFITSCREEN;画像全体を画面に合わせる\nショートカッ
ZOOMPANEL_ZOOMIN;ズームイン\nショートカット: +
ZOOMPANEL_ZOOMOUT;ズームアウト\nショートカット: -
+!!!!!!!!!!!!!!!!!!!!!!!!!
+! Untranslated keys follow; remove the ! prefix after an entry is translated.
+!!!!!!!!!!!!!!!!!!!!!!!!!
+
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
+!PARTIALPASTE_RETINEX;Retinex
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian
index 934ded58e..67b4580ce 100644
--- a/rtdata/languages/Latvian
+++ b/rtdata/languages/Latvian
@@ -918,6 +918,26 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_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
@@ -1000,7 +1020,6 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!PARTIALPASTE_FLATFIELDFILE;Flat-field file
!PARTIALPASTE_GRADIENT;Graduated filter
!PARTIALPASTE_HSVEQUALIZER;HSV equalizer
-!PARTIALPASTE_ICMGAMMA;Output gamma
!PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction
!PARTIALPASTE_LABCURVE;L*a*b* adjustments
!PARTIALPASTE_LENSPROFILE;Lens correction profile
@@ -1022,6 +1041,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!PARTIALPASTE_RAW_DMETHOD;Demosaic method
!PARTIALPASTE_RAW_FALSECOLOR;False color suppression
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_RGBCURVES;RGB curves
!PARTIALPASTE_SHARPENEDGE;Edges
!PARTIALPASTE_SHARPENMICRO;Microcontrast
@@ -1397,7 +1417,7 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1655,6 +1675,54 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!TP_RESIZE_LANCZOS;Lanczos
!TP_RESIZE_SPECIFY;Specify:
!TP_RESIZE_WIDTH;Width
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_BLUE;B
!TP_RGBCURVES_CHANNEL;Channel
!TP_RGBCURVES_GREEN;G
@@ -1718,7 +1786,6 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1732,7 +1799,6 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1744,9 +1810,9 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1809,7 +1875,6 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1856,10 +1921,6 @@ TP_WBALANCE_TEMPERATURE;Temperatūra
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar
index e2390022a..d2073c56f 100644
--- a/rtdata/languages/Magyar
+++ b/rtdata/languages/Magyar
@@ -477,7 +477,6 @@ PARTIALPASTE_FLATFIELDBLURRADIUS;FF elmosás sugara
PARTIALPASTE_FLATFIELDBLURTYPE;FF elmosás típusa
PARTIALPASTE_FLATFIELDFILE;Flat field (FF) állomány
PARTIALPASTE_HSVEQUALIZER;HSV Equalizer
-PARTIALPASTE_ICMGAMMA;Kimeneti gamma
PARTIALPASTE_ICMSETTINGS;ICM beállítások
PARTIALPASTE_IMPULSEDENOISE;Impulse zajszűrés
PARTIALPASTE_IPTCINFO;IPTC információk
@@ -1202,6 +1201,26 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_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
@@ -1242,6 +1261,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter
!PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_WAVELETGROUP;Wavelet Levels
!PREFERENCES_AUTLISLOW;Low
!PREFERENCES_AUTLISMAX;Max - Average of all tiles
@@ -1543,7 +1563,7 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1716,6 +1736,54 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix
!TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.
!TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_LUMAMODE;Luminosity mode
!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
@@ -1755,7 +1823,6 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1769,7 +1836,6 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1781,9 +1847,9 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1846,7 +1912,6 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1893,10 +1958,6 @@ ZOOMPANEL_ZOOMOUT;Kicsinyítés -
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands
index ef344a423..6d8204721 100644
--- a/rtdata/languages/Nederlands
+++ b/rtdata/languages/Nederlands
@@ -727,7 +727,6 @@ PARTIALPASTE_FLATFIELDCLIPCONTROL;Vlakveld clip controle
PARTIALPASTE_FLATFIELDFILE;Vlakveldopname
PARTIALPASTE_GRADIENT;Grijsverloop Filter
PARTIALPASTE_HSVEQUALIZER;HSV-balans
-PARTIALPASTE_ICMGAMMA;Uitvoer gamma
PARTIALPASTE_ICMSETTINGS;ICM-instellingen
PARTIALPASTE_IMPULSEDENOISE;Spot ruisonderdrukking
PARTIALPASTE_IPTCINFO;IPTC-informatie
@@ -1580,7 +1579,6 @@ TP_WAVELET_5;Niveau 5
TP_WAVELET_6;Niveau 6
TP_WAVELET_7;Niveau 7
TP_WAVELET_8;Niveau 8
-TP_WAVELET_ALL;Alle niveau-richtingen
TP_WAVELET_APPLYTO;Toepassen
TP_WAVELET_AVOID;Vermijd kleurverschuiving
TP_WAVELET_CH1;Alle chroma's
@@ -1597,7 +1595,6 @@ TP_WAVELET_CONTRA;Contrast
TP_WAVELET_CONTRA_TOOLTIP;Wijzig contrast in de rest van de afbeelding
TP_WAVELET_CONTR;Gamut - controle
TP_WAVELET_DALL;Alle richtingen
-TP_WAVELET_DISP;Wavelet niveau's
TP_WAVELET_DONE;Richting: Vertikaal
TP_WAVELET_DTHR;Richting: Diagonaal
TP_WAVELET_DTWO;Richting: Horizontaal
@@ -1611,7 +1608,6 @@ TP_WAVELET_HS1;Alle luminanties
TP_WAVELET_HS2;Hoge lichten/Schaduwen
TP_WAVELET_HUESKIN;Tint reeks (huid)
TP_WAVELET_HUESKY;Tint Reeks (lucht)
-TP_WAVELET_INF;Onder of gelijk aan het niveau
TP_WAVELET_LABEL;Wavelet niveau's
TP_WAVELET_LARGEST;grof
TP_WAVELET_LEVCH;Chromaticiteit
@@ -1622,10 +1618,8 @@ TP_WAVELET_LEVLABEL;Voorbeeld maximum mogelijke niveau's=%1
TP_WAVELET_LOWLIGHT;Schaduwen: Luminantie Reeks (0..100)
TP_WAVELET_MEDI;Verminder artefacten in blauwe lucht
TP_WAVELET_NEUTRAL;Neutraal
-TP_WAVELET_ONE;Eén niveau
TP_WAVELET_OPACITY;Dekking Blauw-Geel Niveau
TP_WAVELET_PASTEL;Pastel chromaciteit
-TP_WAVELET_PREVIEWLEVELS;Voorbeeld
TP_WAVELET_RESCHRO;Chromaticiteit
TP_WAVELET_RESCONH;Hoge lichten
TP_WAVELET_RESCON;Schaduwen
@@ -1792,8 +1786,29 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: -
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!MAIN_TAB_WAVELET;Wavelet
!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_WAVELETGROUP;Wavelet Levels
!PREFERENCES_AUTLISSTD;High
!PREFERENCES_CURVEBBOXPOS;Position of curve copypasta buttons
@@ -1829,6 +1844,54 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: -
!TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions.
!TP_RAW_HD;Threshold
!TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, but false positives may lead to artifacts. If you notice any artifacts appearing when enabling the Hot/Dead Pixel Filters, gradually increase the threshold value until they disappear.
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_WAVELET_9;Level 9
!TP_WAVELET_B0;Black
!TP_WAVELET_B1;Grey
@@ -1843,22 +1906,20 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: -
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CHCU;Curve
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
!TP_WAVELET_COMPTM;Tone mapping
!TP_WAVELET_CONTEDIT;'After' contrast curve
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1898,7 +1959,6 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: -
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
!TP_WAVELET_MEDILEV_TOOLTIP;When you enable Edge Detection, it is recommanded:\n- to disabled low contrast levels to avoid artifacts,\n- to use high values of gradient sensitivity.\n\nYou can modulate the strength with 'refine' from Denoise and Refine.
@@ -1916,10 +1976,6 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: -
!TP_WAVELET_RE1;Reinforced
!TP_WAVELET_RE2;Unchanged
!TP_WAVELET_RE3;Reduced
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM
index f6a598b5e..028fb69ea 100644
--- a/rtdata/languages/Norsk BM
+++ b/rtdata/languages/Norsk BM
@@ -917,6 +917,26 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_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
@@ -999,7 +1019,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!PARTIALPASTE_FLATFIELDFILE;Flat-field file
!PARTIALPASTE_GRADIENT;Graduated filter
!PARTIALPASTE_HSVEQUALIZER;HSV equalizer
-!PARTIALPASTE_ICMGAMMA;Output gamma
!PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction
!PARTIALPASTE_LABCURVE;L*a*b* adjustments
!PARTIALPASTE_LENSPROFILE;Lens correction profile
@@ -1021,6 +1040,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!PARTIALPASTE_RAW_DMETHOD;Demosaic method
!PARTIALPASTE_RAW_FALSECOLOR;False color suppression
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_RGBCURVES;RGB curves
!PARTIALPASTE_SHARPENEDGE;Edges
!PARTIALPASTE_SHARPENMICRO;Microcontrast
@@ -1396,7 +1416,7 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1654,6 +1674,54 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_RESIZE_LANCZOS;Lanczos
!TP_RESIZE_SPECIFY;Specify:
!TP_RESIZE_WIDTH;Width
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_BLUE;B
!TP_RGBCURVES_CHANNEL;Channel
!TP_RGBCURVES_GREEN;G
@@ -1717,7 +1785,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1731,7 +1798,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1743,9 +1809,9 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1808,7 +1874,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1855,10 +1920,6 @@ TP_WBALANCE_TEMPERATURE;Temperatur
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish
index 63d153c25..1657da6f2 100644
--- a/rtdata/languages/Polish
+++ b/rtdata/languages/Polish
@@ -677,7 +677,6 @@ PARTIALPASTE_FLATFIELDCLIPCONTROL;Puste pole - Zabezp. przed obcinaniem
PARTIALPASTE_FLATFIELDFILE;Puste pole - Wybór
PARTIALPASTE_GRADIENT;Filtr połówkowy
PARTIALPASTE_HSVEQUALIZER;Ekwalizator HSV
-PARTIALPASTE_ICMGAMMA;Gamma wyjściowa
PARTIALPASTE_ICMSETTINGS;Ustawienia ICM
PARTIALPASTE_IMPULSEDENOISE;Redukcja szumów impulsowych
PARTIALPASTE_IPTCINFO;IPTC
@@ -1634,10 +1633,31 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: -
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!MAIN_TAB_INSPECT; Inspect
!MAIN_TAB_WAVELET;Wavelet
!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w
!PARTIALPASTE_EQUALIZER;Wavelet levels
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_WAVELETGROUP;Wavelet Levels
!PREFERENCES_AUTLISLOW;Low
!PREFERENCES_AUTLISMAX;Max - Average of all tiles
@@ -1706,7 +1726,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: -
!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1741,6 +1761,54 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: -
!TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions.
!TP_RAW_HD;Threshold
!TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, but false positives may lead to artifacts. If you notice any artifacts appearing when enabling the Hot/Dead Pixel Filters, gradually increase the threshold value until they disappear.
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_WAVELET_1;Level 1
!TP_WAVELET_2;Level 2
!TP_WAVELET_3;Level 3
@@ -1765,7 +1833,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: -
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1779,7 +1846,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: -
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1791,9 +1857,9 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: -
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1856,7 +1922,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: -
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1903,10 +1968,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: -
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters)
index 0289fb0f6..0381c2395 100644
--- a/rtdata/languages/Polish (Latin Characters)
+++ b/rtdata/languages/Polish (Latin Characters)
@@ -677,7 +677,6 @@ PARTIALPASTE_FLATFIELDCLIPCONTROL;Puste pole - Zabezp. przed obcinaniem
PARTIALPASTE_FLATFIELDFILE;Puste pole - Wybor
PARTIALPASTE_GRADIENT;Filtr polowkowy
PARTIALPASTE_HSVEQUALIZER;Ekwalizator HSV
-PARTIALPASTE_ICMGAMMA;Gamma wyjsciowa
PARTIALPASTE_ICMSETTINGS;Ustawienia ICM
PARTIALPASTE_IMPULSEDENOISE;Redukcja szumow impulsowych
PARTIALPASTE_IPTCINFO;IPTC
@@ -1634,10 +1633,31 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: -
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!MAIN_TAB_INSPECT; Inspect
!MAIN_TAB_WAVELET;Wavelet
!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w
!PARTIALPASTE_EQUALIZER;Wavelet levels
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_WAVELETGROUP;Wavelet Levels
!PREFERENCES_AUTLISLOW;Low
!PREFERENCES_AUTLISMAX;Max - Average of all tiles
@@ -1706,7 +1726,7 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: -
!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1741,6 +1761,54 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: -
!TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions.
!TP_RAW_HD;Threshold
!TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, but false positives may lead to artifacts. If you notice any artifacts appearing when enabling the Hot/Dead Pixel Filters, gradually increase the threshold value until they disappear.
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_WAVELET_1;Level 1
!TP_WAVELET_2;Level 2
!TP_WAVELET_3;Level 3
@@ -1765,7 +1833,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: -
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1779,7 +1846,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: -
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1791,9 +1857,9 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: -
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1856,7 +1922,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: -
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1903,10 +1968,6 @@ ZOOMPANEL_ZOOMOUT;Oddal\nSkrot: -
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil)
index 26060cd9b..3bd28c81f 100644
--- a/rtdata/languages/Portugues (Brasil)
+++ b/rtdata/languages/Portugues (Brasil)
@@ -918,6 +918,26 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_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
@@ -1000,7 +1020,6 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!PARTIALPASTE_FLATFIELDFILE;Flat-field file
!PARTIALPASTE_GRADIENT;Graduated filter
!PARTIALPASTE_HSVEQUALIZER;HSV equalizer
-!PARTIALPASTE_ICMGAMMA;Output gamma
!PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction
!PARTIALPASTE_LABCURVE;L*a*b* adjustments
!PARTIALPASTE_LENSPROFILE;Lens correction profile
@@ -1022,6 +1041,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!PARTIALPASTE_RAW_DMETHOD;Demosaic method
!PARTIALPASTE_RAW_FALSECOLOR;False color suppression
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_RGBCURVES;RGB curves
!PARTIALPASTE_SHARPENEDGE;Edges
!PARTIALPASTE_SHARPENMICRO;Microcontrast
@@ -1397,7 +1417,7 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1655,6 +1675,54 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!TP_RESIZE_LANCZOS;Lanczos
!TP_RESIZE_SPECIFY;Specify:
!TP_RESIZE_WIDTH;Width
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_BLUE;B
!TP_RGBCURVES_CHANNEL;Channel
!TP_RGBCURVES_GREEN;G
@@ -1718,7 +1786,6 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1732,7 +1799,6 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1744,9 +1810,9 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1809,7 +1875,6 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1856,10 +1921,6 @@ TP_WBALANCE_TEMPERATURE;Temperatura
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian
index d75ed6995..465e9c781 100644
--- a/rtdata/languages/Russian
+++ b/rtdata/languages/Russian
@@ -611,7 +611,6 @@ PARTIALPASTE_FLATFIELDBLURTYPE;Тип размытия ПП
PARTIALPASTE_FLATFIELDFILE;Файл плоского поля (ПП)
PARTIALPASTE_GRADIENT;Градиентный фильтр
PARTIALPASTE_HSVEQUALIZER;HSV Эквалайзер
-PARTIALPASTE_ICMGAMMA;Выходная гамма
PARTIALPASTE_ICMSETTINGS;Параметры ICM
PARTIALPASTE_IMPULSEDENOISE;Подавление импульсного шума
PARTIALPASTE_IPTCINFO;Данные IPTC
@@ -1485,6 +1484,26 @@ ZOOMPANEL_ZOOMOUT;Удалить -
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!MAIN_TAB_INSPECT; Inspect
!MAIN_TAB_WAVELET;Wavelet
!MAIN_TAB_WAVELET_TOOLTIP;Shortcut: Alt-w
@@ -1505,6 +1524,7 @@ ZOOMPANEL_ZOOMOUT;Удалить -
!PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control
!PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter
!PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_WAVELETGROUP;Wavelet Levels
!PREFERENCES_AUTLISLOW;Low
!PREFERENCES_AUTLISMAX;Max - Average of all tiles
@@ -1655,7 +1675,7 @@ ZOOMPANEL_ZOOMOUT;Удалить -
!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1739,6 +1759,54 @@ ZOOMPANEL_ZOOMOUT;Удалить -
!TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix
!TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.
!TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_WAVELET_1;Level 1
!TP_WAVELET_2;Level 2
!TP_WAVELET_3;Level 3
@@ -1763,7 +1831,6 @@ ZOOMPANEL_ZOOMOUT;Удалить -
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1777,7 +1844,6 @@ ZOOMPANEL_ZOOMOUT;Удалить -
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1789,9 +1855,9 @@ ZOOMPANEL_ZOOMOUT;Удалить -
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1854,7 +1920,6 @@ ZOOMPANEL_ZOOMOUT;Удалить -
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1901,10 +1966,6 @@ ZOOMPANEL_ZOOMOUT;Удалить -
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters)
index f2c537d7c..344818259 100644
--- a/rtdata/languages/Serbian (Cyrilic Characters)
+++ b/rtdata/languages/Serbian (Cyrilic Characters)
@@ -1123,6 +1123,26 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_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
@@ -1167,12 +1187,12 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!PARTIALPASTE_FILMSIMULATION;Film simulation
!PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control
!PARTIALPASTE_GRADIENT;Graduated filter
-!PARTIALPASTE_ICMGAMMA;Output gamma
!PARTIALPASTE_LENSPROFILE;Lens correction profile
!PARTIALPASTE_PCVIGNETTE;Vignette filter
!PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter
!PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_RGBCURVES;RGB curves
!PARTIALPASTE_VIBRANCE;Vibrance
!PARTIALPASTE_WAVELETGROUP;Wavelet Levels
@@ -1484,7 +1504,7 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1673,6 +1693,54 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix
!TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.
!TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_BLUE;B
!TP_RGBCURVES_CHANNEL;Channel
!TP_RGBCURVES_GREEN;G
@@ -1724,7 +1792,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1738,7 +1805,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1750,9 +1816,9 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1815,7 +1881,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1862,10 +1927,6 @@ ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters)
index 049923837..dab79ad6b 100644
--- a/rtdata/languages/Serbian (Latin Characters)
+++ b/rtdata/languages/Serbian (Latin Characters)
@@ -1123,6 +1123,26 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_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
@@ -1167,12 +1187,12 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
!PARTIALPASTE_FILMSIMULATION;Film simulation
!PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control
!PARTIALPASTE_GRADIENT;Graduated filter
-!PARTIALPASTE_ICMGAMMA;Output gamma
!PARTIALPASTE_LENSPROFILE;Lens correction profile
!PARTIALPASTE_PCVIGNETTE;Vignette filter
!PARTIALPASTE_PREPROCESS_DEADPIXFILT;Dead pixel filter
!PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_RGBCURVES;RGB curves
!PARTIALPASTE_VIBRANCE;Vibrance
!PARTIALPASTE_WAVELETGROUP;Wavelet Levels
@@ -1484,7 +1504,7 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1673,6 +1693,54 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
!TP_RAW_SENSOR_BAYER_LABEL;Sensor with Bayer Matrix
!TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.
!TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_BLUE;B
!TP_RGBCURVES_CHANNEL;Channel
!TP_RGBCURVES_GREEN;G
@@ -1724,7 +1792,6 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1738,7 +1805,6 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1750,9 +1816,9 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1815,7 +1881,6 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1862,10 +1927,6 @@ ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak
index 4f1a92446..0a5010a0f 100644
--- a/rtdata/languages/Slovak
+++ b/rtdata/languages/Slovak
@@ -981,6 +981,26 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_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
@@ -1055,7 +1075,6 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!PARTIALPASTE_FLATFIELDFILE;Flat-field file
!PARTIALPASTE_GRADIENT;Graduated filter
!PARTIALPASTE_HSVEQUALIZER;HSV equalizer
-!PARTIALPASTE_ICMGAMMA;Output gamma
!PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction
!PARTIALPASTE_LENSPROFILE;Lens correction profile
!PARTIALPASTE_PCVIGNETTE;Vignette filter
@@ -1076,6 +1095,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!PARTIALPASTE_RAW_DMETHOD;Demosaic method
!PARTIALPASTE_RAW_FALSECOLOR;False color suppression
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_RGBCURVES;RGB curves
!PARTIALPASTE_SHARPENEDGE;Edges
!PARTIALPASTE_SHARPENMICRO;Microcontrast
@@ -1435,7 +1455,7 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1662,6 +1682,54 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!TP_RESIZE_FITBOX;Bounding Box
!TP_RESIZE_FULLIMAGE;Full Image
!TP_RESIZE_LANCZOS;Lanczos
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_BLUE;B
!TP_RGBCURVES_CHANNEL;Channel
!TP_RGBCURVES_GREEN;G
@@ -1725,7 +1793,6 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1739,7 +1806,6 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1751,9 +1817,9 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1816,7 +1882,6 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1863,10 +1928,6 @@ ZOOMPANEL_ZOOMOUT;Oddialiť -
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi
index 083c7931a..0e792a868 100644
--- a/rtdata/languages/Suomi
+++ b/rtdata/languages/Suomi
@@ -919,6 +919,26 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_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
@@ -1001,7 +1021,6 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!PARTIALPASTE_FLATFIELDFILE;Flat-field file
!PARTIALPASTE_GRADIENT;Graduated filter
!PARTIALPASTE_HSVEQUALIZER;HSV equalizer
-!PARTIALPASTE_ICMGAMMA;Output gamma
!PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction
!PARTIALPASTE_LABCURVE;L*a*b* adjustments
!PARTIALPASTE_LENSPROFILE;Lens correction profile
@@ -1023,6 +1042,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!PARTIALPASTE_RAW_DMETHOD;Demosaic method
!PARTIALPASTE_RAW_FALSECOLOR;False color suppression
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_RGBCURVES;RGB curves
!PARTIALPASTE_SHARPENEDGE;Edges
!PARTIALPASTE_SHARPENMICRO;Microcontrast
@@ -1397,7 +1417,7 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1655,6 +1675,54 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!TP_RESIZE_LANCZOS;Lanczos
!TP_RESIZE_SPECIFY;Specify:
!TP_RESIZE_WIDTH;Width
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_BLUE;B
!TP_RGBCURVES_CHANNEL;Channel
!TP_RGBCURVES_GREEN;G
@@ -1718,7 +1786,6 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1732,7 +1799,6 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1744,9 +1810,9 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1809,7 +1875,6 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1856,10 +1921,6 @@ TP_WBALANCE_TEMPERATURE;Lämpötila [K]
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish
index 9ccc5af02..16f8686b6 100644
--- a/rtdata/languages/Swedish
+++ b/rtdata/languages/Swedish
@@ -762,7 +762,6 @@ PARTIALPASTE_FLATFIELDBLURTYPE;Oskärpetyp hos plattfältet
PARTIALPASTE_FLATFIELDFILE;Plattfältsfil
PARTIALPASTE_GRADIENT;Graderat filter
PARTIALPASTE_HSVEQUALIZER;HSV-equalizer
-PARTIALPASTE_ICMGAMMA;Utmatningsgamma
PARTIALPASTE_ICMSETTINGS;Färghanteringsinställningar
PARTIALPASTE_IMPULSEDENOISE;Brusreducering mha stegsvar
PARTIALPASTE_IPTCINFO;IPTC-info
@@ -1611,7 +1610,6 @@ TP_WAVELET_CHCU;Kurva
TP_WAVELET_CHSL;Reglage
TP_WAVELET_CHTYPE;Krominans-metod
TP_WAVELET_COLORT;Opacitet rött-grönt
-TP_WAVELET_COMBOTH;Båda
TP_WAVELET_COMPCONT;Kontrast
TP_WAVELET_DAUB2;D2 - låg
TP_WAVELET_DAUB4;D4 - standard
@@ -1668,8 +1666,6 @@ TP_WAVELET_THRESHOLD;Högdagernivåer
TP_WAVELET_THRH;Högdagertröskel
TP_WAVELET_THR;Skuggtröskel
TP_WAVELET_TILESFULL;Hela bilden
-TP_WAVELET_TMNONE;Ingen
-TP_WAVELET_TMSTD;Standard
TP_WBALANCE_AUTO;Auto
TP_WBALANCE_CAMERA;Kamera
TP_WBALANCE_CLOUDY;Molnigt
@@ -1764,8 +1760,29 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: -
!HISTORY_MSG_401;W - Toning sub-tool
!HISTORY_MSG_402;W - Denoise sub-tool
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!PARTIALPASTE_COLORTONING;Color toning
!PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control
+!PARTIALPASTE_RETINEX;Retinex
!PREFERENCES_INSPECT_MAXBUFFERS_TOOLTIP;Set the maximum number of images stored in cache when hovering over them in the File Browser; systems with little RAM (2GB) should keep this value set to 1 or 2.
!PREFERENCES_LEVDN;Cell size
!PREFERENCES_LISS;Auto multi-zone smoothing
@@ -1783,7 +1800,7 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: -
!TP_COLORTONING_TWOBY;Special a* and b*
!TP_COLORTONING_TWOCOLOR_TOOLTIP;Standard chroma:\nLinear response, a* = b*.\n\nSpecial chroma:\nLinear response, a* = b*, but unbound - try under the diagonal.\n\nSpecial a* and b*:\nLinear response unbound with separate curves for a* and b*. Intended for special effects.\n\nSpecial chroma 2 colors:\nMore predictable.
!TP_DIRPYRDENOISE_C2TYPE_TOOLTIP;Manual\nActs on the full image.\nYou control the noise reduction settings manually.\n\nAutomatic global\nActs on the full image.\n9 zones are used to calculate a global chrominance noise reduction setting.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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
@@ -1818,8 +1835,55 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: -
!TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, but false positives may lead to artifacts. If you notice any artifacts appearing when enabling the Hot/Dead Pixel Filters, gradually increase the threshold value until they disappear.
!TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;3-pass gives best results (recommended for low ISO images).\n1-pass is almost undistinguishable from 3-pass for high ISO images and is faster.
!TP_RAW_SENSOR_XTRANS_LABEL;Sensor with X-Trans Matrix
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CH2;Saturated/pastel
!TP_WAVELET_CHRO;Saturated/pastel threshold
@@ -1836,9 +1900,9 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: -
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1870,7 +1934,6 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: -
!TP_WAVELET_LEVELS_TOOLTIP;Choose the number of detail levels the image is to be decomposed into. More levels require more RAM and require a longer processing time.
!TP_WAVELET_LEVLABEL;Preview maximum possible levels = %1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDILEV_TOOLTIP;When you enable Edge Detection, it is recommanded:\n- to disabled low contrast levels to avoid artifacts,\n- to use high values of gradient sensitivity.\n\nYou can modulate the strength with 'refine' from Denoise and Refine.
!TP_WAVELET_NOISE;Denoise and Refine
@@ -1890,8 +1953,6 @@ ZOOMPANEL_ZOOMOUT;Förminska.\nKortkommando: -
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish
index 520caf65d..aaf21ef75 100644
--- a/rtdata/languages/Turkish
+++ b/rtdata/languages/Turkish
@@ -918,6 +918,26 @@ TP_WBALANCE_TEMPERATURE;Isı
!HISTORY_MSG_404;W - ES - Base amplification
!HISTORY_MSG_405;W - Denoise - Level 4
!HISTORY_MSG_406;W - ES - Neighboring pixels
+!HISTORY_MSG_407;Retinex - Method
+!HISTORY_MSG_408;Retinex - Neighboring
+!HISTORY_MSG_409;Retinex - Gain
+!HISTORY_MSG_410;Retinex - Offset
+!HISTORY_MSG_411;Retinex - Strength
+!HISTORY_MSG_412;Retinex - Scales
+!HISTORY_MSG_413;Retinex - Variance
+!HISTORY_MSG_414;Retinex - Histogram - Lab
+!HISTORY_MSG_415;Retinex - Transmission
+!HISTORY_MSG_416;Retinex
+!HISTORY_MSG_417;Retinex - Transmission median
+!HISTORY_MSG_418;Retinex - Threshold
+!HISTORY_MSG_419;Retinex - Color space
+!HISTORY_MSG_420;Retinex - Histogram - HSL
+!HISTORY_MSG_421;Retinex - Gamma
+!HISTORY_MSG_422;Retinex - Gamma
+!HISTORY_MSG_423;Retinex - Gamma slope
+!HISTORY_MSG_424;Retinex - HL threshold
+!HISTORY_MSG_425;Retinex - Log base
+!HISTORY_MSG_426;Retinex - Hue equalizer
!HISTORY_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
@@ -1000,7 +1020,6 @@ TP_WBALANCE_TEMPERATURE;Isı
!PARTIALPASTE_FLATFIELDFILE;Flat-field file
!PARTIALPASTE_GRADIENT;Graduated filter
!PARTIALPASTE_HSVEQUALIZER;HSV equalizer
-!PARTIALPASTE_ICMGAMMA;Output gamma
!PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction
!PARTIALPASTE_LABCURVE;L*a*b* adjustments
!PARTIALPASTE_LENSPROFILE;Lens correction profile
@@ -1022,6 +1041,7 @@ TP_WBALANCE_TEMPERATURE;Isı
!PARTIALPASTE_RAW_DMETHOD;Demosaic method
!PARTIALPASTE_RAW_FALSECOLOR;False color suppression
!PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
+!PARTIALPASTE_RETINEX;Retinex
!PARTIALPASTE_RGBCURVES;RGB curves
!PARTIALPASTE_SHARPENEDGE;Edges
!PARTIALPASTE_SHARPENMICRO;Microcontrast
@@ -1396,7 +1416,7 @@ TP_WBALANCE_TEMPERATURE;Isı
!TP_DIRPYRDENOISE_CCCURVE;Chrominance curve
!TP_DIRPYRDENOISE_CHROMAFR;Chrominance
!TP_DIRPYRDENOISE_CHROMA;Chrominance - Master
-!TP_DIRPYRDENOISE_CTYPE;Auto method
+!TP_DIRPYRDENOISE_CTYPE;Method
!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 center to the preview size and center you can get an idea of the expected results.\nThe image is divided into tiles (about 10 to 70 depending on image size) and each tile receives its own chrominance noise reduction settings.\n\nPreview\nActs on the whole image.\nThe part of the image visible in the preview is used to calculate global chrominance noise reduction settings.
!TP_DIRPYRDENOISE_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.
@@ -1654,6 +1674,54 @@ TP_WBALANCE_TEMPERATURE;Isı
!TP_RESIZE_LANCZOS;Lanczos
!TP_RESIZE_SPECIFY;Specify:
!TP_RESIZE_WIDTH;Width
+!TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+!TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+!TP_RETINEX_CONTEDIT_LH;Hue equalizer
+!TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+!TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+!TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+!TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+!TP_RETINEX_GAIN;Gain
+!TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+!TP_RETINEX_GAMMA;Free gamma
+!TP_RETINEX_GAMMA;Gamma
+!TP_RETINEX_GAMMA_FREE;Free
+!TP_RETINEX_GAMMA_HIGH;High
+!TP_RETINEX_GAMMA_LOW;Low
+!TP_RETINEX_GAMMA_MID;Middle
+!TP_RETINEX_GAMMA_NONE;None
+!TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+!TP_RETINEX_HIGHLIGHT;Highlight threshold
+!TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+!TP_RETINEX_HIGHLIG;Highlight
+!TP_RETINEX_HIGH;High
+!TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+!TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+!TP_RETINEX_LABEL;Retinex
+!TP_RETINEX_LABSPACE;L*a*b*
+!TP_RETINEX_LOW;Low
+!TP_RETINEX_MEDIAN;Transmission median filter
+!TP_RETINEX_METHOD;Method
+!TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+!TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+!TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+!TP_RETINEX_NEIGHBOR;Neighboring pixels
+!TP_RETINEX_NEUTRAL;Reset
+!TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+!TP_RETINEX_OFFSET;Offset
+!TP_RETINEX_SETTINGS;Settings
+!TP_RETINEX_SLOPE;Free gamma slope
+!TP_RETINEX_STRENGTH;Strength
+!TP_RETINEX_THRESHOLD;Threshold
+!TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+!TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+!TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+!TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+!TP_RETINEX_TRANSMISSION;Transmission map
+!TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+!TP_RETINEX_UNIFORM;Uniform
+!TP_RETINEX_VARIANCE;Variance
+!TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
!TP_RGBCURVES_BLUE;B
!TP_RGBCURVES_CHANNEL;Channel
!TP_RGBCURVES_GREEN;G
@@ -1717,7 +1785,6 @@ TP_WBALANCE_TEMPERATURE;Isı
!TP_WAVELET_BASLI;Slider
!TP_WAVELET_BATYPE;Contrast balance method
!TP_WAVELET_CBENAB;Toning and Color Balance
-!TP_WAVELET_CBTYPE;Toning and Color Balance
!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
!TP_WAVELET_CCURVE;Local contrast
!TP_WAVELET_CH1;Whole chroma range
@@ -1731,7 +1798,6 @@ TP_WBALANCE_TEMPERATURE;Isı
!TP_WAVELET_CHSL;Sliders
!TP_WAVELET_CHTYPE;Chrominance method
!TP_WAVELET_COLORT;Opacity Red-Green
-!TP_WAVELET_COMBOTH;Both
!TP_WAVELET_COMPCONT;Contrast
!TP_WAVELET_COMPGAMMA;Compression gamma
!TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1743,9 +1809,9 @@ TP_WBALANCE_TEMPERATURE;Isı
!TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
!TP_WAVELET_CONTR;Gamut
!TP_WAVELET_CTYPE;Chrominance control
-!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+!TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
!TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+!TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
!TP_WAVELET_CURVEEDITOR_CL;L
!TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
!TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1808,7 +1874,6 @@ TP_WBALANCE_TEMPERATURE;Isı
!TP_WAVELET_LEVZERO;Level 1
!TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
!TP_WAVELET_LIPST;Enhanced algoritm
-!TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
!TP_WAVELET_LOWLIGHT;Shadow luminance range
!TP_WAVELET_MEDGREINF;First level
!TP_WAVELET_MEDILEV;Edge detection
@@ -1855,10 +1920,6 @@ TP_WBALANCE_TEMPERATURE;Isı
!TP_WAVELET_TILESIZE;Tiling method
!TP_WAVELET_TILESLIT;Little tiles
!TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-!TP_WAVELET_TMHIGH;High
-!TP_WAVELET_TMLOWHIGH;Low+High
-!TP_WAVELET_TMNONE;None
-!TP_WAVELET_TMSTD;Standard
!TP_WAVELET_TMSTRENGTH;Compression strength
!TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
!TP_WAVELET_TMTYPE;Compression method
diff --git a/rtdata/languages/default b/rtdata/languages/default
index b9946c2cc..6c1918a89 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -84,7 +84,7 @@ EXPORT_FASTEXPORTOPTIONS;Fast Export Options
EXPORT_INSTRUCTIONS;Fast Export options provide overrides to bypass time and resource consuming development settings and to run queue processing using the fast export settings instead. This method is recommended for quicker generation of lower resolution images when speed is a priority or when resized output is desired for one or many images without making modifications to their saved development parameters.
EXPORT_MAXHEIGHT;Maximum height:
EXPORT_MAXWIDTH;Maximum width:
-EXPORT_PUTTOQUEUEFAST; Put to queue for fast export
+EXPORT_PUTTOQUEUEFAST; Put to queue for fast export
EXPORT_RAW_DMETHOD;Demosaic method
EXTPROGTARGET_1;raw
EXTPROGTARGET_2;queue-processed
@@ -151,7 +151,7 @@ FILEBROWSER_POPUPUNRANK;Unrank
FILEBROWSER_POPUPUNTRASH;Remove from trash
FILEBROWSER_QUERYBUTTONHINT;Clear the Find query
FILEBROWSER_QUERYHINT;Type filenames to search for. Supports partial filenames. Separate the search terms using commas, e.g.\n1001,1004,1199\n\nExclude search terms by prefixing them with !=\ne.g.\n!=1001,1004,1199\n\nShortcuts:\nCtrl-f - focus the Find box,\nEnter - search,\nEsc - clear the Find box,\nShift-Esc - defocus the Find box.
-FILEBROWSER_QUERYLABEL; Find:
+FILEBROWSER_QUERYLABEL; Find:
FILEBROWSER_RANK1_TOOLTIP;Rank 1 *\nShortcut: Shift-1
FILEBROWSER_RANK2_TOOLTIP;Rank 2 *\nShortcut: Shift-2
FILEBROWSER_RANK3_TOOLTIP;Rank 3 *\nShortcut: Shift-3
@@ -638,6 +638,26 @@ HISTORY_MSG_403;W - ES - Edge sensitivity
HISTORY_MSG_404;W - ES - Base amplification
HISTORY_MSG_405;W - Denoise - Level 4
HISTORY_MSG_406;W - ES - Neighboring pixels
+HISTORY_MSG_407;Retinex - Method
+HISTORY_MSG_408;Retinex - Neighboring
+HISTORY_MSG_409;Retinex - Gain
+HISTORY_MSG_410;Retinex - Offset
+HISTORY_MSG_411;Retinex - Strength
+HISTORY_MSG_412;Retinex - Scales
+HISTORY_MSG_413;Retinex - Variance
+HISTORY_MSG_414;Retinex - Histogram - Lab
+HISTORY_MSG_415;Retinex - Transmission
+HISTORY_MSG_416;Retinex
+HISTORY_MSG_417;Retinex - Transmission median
+HISTORY_MSG_418;Retinex - Threshold
+HISTORY_MSG_419;Retinex - Color space
+HISTORY_MSG_420;Retinex - Histogram - HSL
+HISTORY_MSG_421;Retinex - Gamma
+HISTORY_MSG_422;Retinex - Gamma
+HISTORY_MSG_423;Retinex - Gamma slope
+HISTORY_MSG_424;Retinex - HL threshold
+HISTORY_MSG_425;Retinex - Log base
+HISTORY_MSG_426;Retinex - Hue equalizer
HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
HISTORY_SNAPSHOTS;Snapshots
@@ -720,12 +740,12 @@ MAIN_TAB_COLOR;Color
MAIN_TAB_COLOR_TOOLTIP;Shortcut: Alt-c
MAIN_TAB_DETAIL;Detail
MAIN_TAB_DETAIL_TOOLTIP;Shortcut: Alt-d
-MAIN_TAB_DEVELOP; Develop
+MAIN_TAB_DEVELOP; Develop
MAIN_TAB_EXIF;Exif
-MAIN_TAB_EXPORT; Fast Export
+MAIN_TAB_EXPORT; Fast Export
MAIN_TAB_EXPOSURE;Exposure
MAIN_TAB_EXPOSURE_TOOLTIP;Shortcut: Alt-e
-MAIN_TAB_FILTER; Filter
+MAIN_TAB_FILTER; Filter
MAIN_TAB_INSPECT; Inspect
MAIN_TAB_IPTC;IPTC
MAIN_TAB_METADATA;Metadata
@@ -800,7 +820,6 @@ PARTIALPASTE_FLATFIELDCLIPCONTROL;Flat-field clip control
PARTIALPASTE_FLATFIELDFILE;Flat-field file
PARTIALPASTE_GRADIENT;Graduated filter
PARTIALPASTE_HSVEQUALIZER;HSV equalizer
-PARTIALPASTE_ICMGAMMA;Output gamma
PARTIALPASTE_ICMSETTINGS;Color management settings
PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction
PARTIALPASTE_IPTCINFO;IPTC
@@ -827,6 +846,7 @@ PARTIALPASTE_RAW_DMETHOD;Demosaic method
PARTIALPASTE_RAW_FALSECOLOR;False color suppression
PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
PARTIALPASTE_RESIZE;Resize
+PARTIALPASTE_RETINEX;Retinex
PARTIALPASTE_RGBCURVES;RGB curves
PARTIALPASTE_ROTATION;Rotation
PARTIALPASTE_SHADOWSHIGHLIGHTS;Shadows/highlights
@@ -1613,6 +1633,54 @@ TP_RESIZE_SCALE;Scale
TP_RESIZE_SPECIFY;Specify:
TP_RESIZE_WIDTH;Width
TP_RESIZE_W;Width:
+TP_RETINEX_CONTEDIT_HSL;Histogram equalizer HSL
+TP_RETINEX_CONTEDIT_LAB;Histogram equalizer L*a*b*
+TP_RETINEX_CONTEDIT_LH;Hue equalizer
+TP_RETINEX_CURVEEDITOR_CD;L=f(L)
+TP_RETINEX_CURVEEDITOR_CD_TOOLTIP;Luminance according to luminance L=f(L)\nCorrect raw data to reduce halos and artifacts.
+TP_RETINEX_CURVEEDITOR_LH;Strength=f(H)
+TP_RETINEX_CURVEEDITOR_LH_TOOLTIP;Strength according to hue Strength=f(H)\nThis curve also acts on chroma when using the "Highlight" retinex method.
+TP_RETINEX_GAIN;Gain
+TP_RETINEX_GAIN_TOOLTIP;Acts on the transmission in combination with the offset. This is very different from the others settings. Used for black or white pixels, and to help balance the histogram.
+TP_RETINEX_GAMMA;Free gamma
+TP_RETINEX_GAMMA;Gamma
+TP_RETINEX_GAMMA_FREE;Free
+TP_RETINEX_GAMMA_HIGH;High
+TP_RETINEX_GAMMA_LOW;Low
+TP_RETINEX_GAMMA_MID;Middle
+TP_RETINEX_GAMMA_NONE;None
+TP_RETINEX_GAMMA_TOOLTIP;Restore tones by applying gamma before and after Retinex. Different from Retinex curves or others curves (Lab, Exposure, etc.).
+TP_RETINEX_HIGHLIGHT;Highlight threshold
+TP_RETINEX_HIGHLIGHT_TOOLTIP;Increase action of High algorithm.\nMay require you to re-adjust "Neighboring pixels" and to increase the "White-point correction" in the Raw tab -> Raw White Points tool.
+TP_RETINEX_HIGHLIG;Highlight
+TP_RETINEX_HIGH;High
+TP_RETINEX_HSLSPACE_LIN;HSL-Linear
+TP_RETINEX_HSLSPACE_LOG;HSL-Logarithmic
+TP_RETINEX_LABEL;Retinex
+TP_RETINEX_LABSPACE;L*a*b*
+TP_RETINEX_LOW;Low
+TP_RETINEX_MEDIAN;Transmission median filter
+TP_RETINEX_METHOD;Method
+TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light,\nUniform = Equalize action,\nHigh = Reinforce high light,\nHighlight = Remove magenta in highlights.
+TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
+TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+TP_RETINEX_NEIGHBOR;Neighboring pixels
+TP_RETINEX_NEUTRAL;Reset
+TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
+TP_RETINEX_OFFSET;Offset
+TP_RETINEX_SETTINGS;Settings
+TP_RETINEX_SLOPE;Free gamma slope
+TP_RETINEX_STRENGTH;Strength
+TP_RETINEX_THRESHOLD;Threshold
+TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
+TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
+TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
+TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma\nTm=Min TM=Max of transmission map.
+TP_RETINEX_TRANSMISSION;Transmission map
+TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
+TP_RETINEX_UNIFORM;Uniform
+TP_RETINEX_VARIANCE;Variance
+TP_RETINEX_VARIANCE_TOOLTIP;Low variance increase local contrast and saturation, but can lead to artifacts.
TP_RGBCURVES_BLUE;B
TP_RGBCURVES_CHANNEL;Channel
TP_RGBCURVES_GREEN;G
@@ -1704,7 +1772,6 @@ TP_WAVELET_BANONE;None
TP_WAVELET_BASLI;Slider
TP_WAVELET_BATYPE;Contrast balance method
TP_WAVELET_CBENAB;Toning and Color Balance
-TP_WAVELET_CBTYPE;Toning and Color Balance
TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
TP_WAVELET_CCURVE;Local contrast
TP_WAVELET_CH1;Whole chroma range
@@ -1718,7 +1785,6 @@ TP_WAVELET_CHR_TOOLTIP;Adjusts chroma as a function of "contrast levels" and "ch
TP_WAVELET_CHSL;Sliders
TP_WAVELET_CHTYPE;Chrominance method
TP_WAVELET_COLORT;Opacity Red-Green
-TP_WAVELET_COMBOTH;Both
TP_WAVELET_COMPCONT;Contrast
TP_WAVELET_COMPGAMMA;Compression gamma
TP_WAVELET_COMPGAMMA_TOOLTIP;Adjusting the gamma of the residual image allows you to equilibrate the data and histogram.
@@ -1730,9 +1796,9 @@ TP_WAVELET_CONTRA;Contrast
TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
TP_WAVELET_CONTR;Gamut
TP_WAVELET_CTYPE;Chrominance control
-TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (absciss)\nLow absciss represents small local contrast (real values about 10..20)\n50% absciss represents average of local contrast (real value about 100..300)\n66% absciss represents standard deviation of local contrast (real value about 300..800)\n100% represents maximum (real value about 3000..8000)
+TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
-TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function oh hue.\nTake care not to overwrite changes made with the Gamut Hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
+TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
TP_WAVELET_CURVEEDITOR_CL;L
TP_WAVELET_CURVEEDITOR_CL_TOOLTIP;Applies a final contrast luminance curve at the end of the wavelet treatment.
TP_WAVELET_CURVEEDITOR_HH;HH
@@ -1795,7 +1861,6 @@ TP_WAVELET_LEVTWO;Level 3
TP_WAVELET_LEVZERO;Level 1
TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
TP_WAVELET_LIPST;Enhanced algoritm
-TP_WAVELET_LIPST_TOOLTIP;This algorithm uses the proximity of a pixel and eight of its neighbors. If less difference, edges are reinforced.
TP_WAVELET_LOWLIGHT;Shadow luminance range
TP_WAVELET_MEDGREINF;First level
TP_WAVELET_MEDILEV;Edge detection
@@ -1842,10 +1907,6 @@ TP_WAVELET_TILESFULL;Full image
TP_WAVELET_TILESIZE;Tiling method
TP_WAVELET_TILESLIT;Little tiles
TP_WAVELET_TILES_TOOLTIP;Processing the full image leads to better quality and is the recommended option, while using tiles is a fall-back solution for users with little RAM. Refer to RawPedia for memory requirements.
-TP_WAVELET_TMHIGH;High
-TP_WAVELET_TMLOWHIGH;Low+High
-TP_WAVELET_TMNONE;None
-TP_WAVELET_TMSTD;Standard
TP_WAVELET_TMSTRENGTH;Compression strength
TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image. When the value is different from 0, the Strength and Gamma sliders of the Tone Mapping tool in the Exposure tab will become grayed out.
TP_WAVELET_TMTYPE;Compression method
diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt
index 70c593a9c..231875f95 100644
--- a/rtengine/CMakeLists.txt
+++ b/rtengine/CMakeLists.txt
@@ -18,7 +18,7 @@ set (RTENGINESOURCEFILES safegtk.cc colortemp.cc curves.cc flatcurves.cc diagona
EdgePreservingDecomposition.cc cplx_wavelet_dec.cc FTblockDN.cc
PF_correct_RT.cc previewimage.cc ipwavelet.cc
dirpyr_equalizer.cc
- calc_distort.cc lcp.cc dcp.cc
+ calc_distort.cc lcp.cc dcp.cc ipretinex.cc
cJSON.c camconst.cc
klt/convolve.cc klt/error.cc klt/klt.cc klt/klt_util.cc klt/pnmio.cc klt/pyramid.cc klt/selectGoodFeatures.cc
klt/storeFeatures.cc klt/trackFeatures.cc klt/writeFeatures.cc
diff --git a/rtengine/PF_correct_RT.cc b/rtengine/PF_correct_RT.cc
index 130a683d8..c56ce168d 100644
--- a/rtengine/PF_correct_RT.cc
+++ b/rtengine/PF_correct_RT.cc
@@ -65,11 +65,8 @@ SSEFUNCTION void ImProcFunctions::PF_correct_RT(LabImage * src, LabImage * dst,
#pragma omp parallel
#endif
{
- AlignedBufferMP buffer(max(src->W, src->H));
- gaussHorizontal (src->a, tmp1->a, buffer, src->W, src->H, radius);
- gaussHorizontal (src->b, tmp1->b, buffer, src->W, src->H, radius);
- gaussVertical (tmp1->a, tmp1->a, buffer, src->W, src->H, radius);
- gaussVertical (tmp1->b, tmp1->b, buffer, src->W, src->H, radius);
+ gaussianBlur (src->a, tmp1->a, src->W, src->H, radius);
+ gaussianBlur (src->b, tmp1->b, src->W, src->H, radius);
}
float chromave = 0.0f;
@@ -395,11 +392,8 @@ SSEFUNCTION void ImProcFunctions::PF_correct_RTcam(CieImage * src, CieImage * ds
#pragma omp parallel
#endif
{
- AlignedBufferMP buffer(max(src->W, src->H));
- gaussHorizontal (sraa, tmaa, buffer, src->W, src->H, radius);
- gaussHorizontal (srbb, tmbb, buffer, src->W, src->H, radius);
- gaussVertical (tmaa, tmaa, buffer, src->W, src->H, radius);
- gaussVertical (tmbb, tmbb, buffer, src->W, src->H, radius);
+ gaussianBlur (sraa, tmaa, src->W, src->H, radius);
+ gaussianBlur (srbb, tmbb, src->W, src->H, radius);
}
float chromave = 0.0f;
@@ -773,19 +767,14 @@ SSEFUNCTION void ImProcFunctions::Badpixelscam(CieImage * src, CieImage * dst, d
#pragma omp parallel
#endif
{
- AlignedBufferMP buffer(max(src->W, src->H));
-
//chroma a and b
if(mode == 2) { //choice of gaussian blur
- gaussHorizontal (sraa, tmaa, buffer, src->W, src->H, radius);
- gaussHorizontal (srbb, tmbb, buffer, src->W, src->H, radius);
- gaussVertical (tmaa, tmaa, buffer, src->W, src->H, radius);
- gaussVertical (tmbb, tmbb, buffer, src->W, src->H, radius);
+ gaussianBlur (sraa, tmaa, src->W, src->H, radius);
+ gaussianBlur (srbb, tmbb, src->W, src->H, radius);
}
//luma sh_p
- gaussHorizontal (src->sh_p, tmL, buffer, src->W, src->H, 2.0);//low value to avoid artifacts
- gaussVertical (tmL, tmL, buffer, src->W, src->H, 2.0);
+ gaussianBlur (src->sh_p, tmL, src->W, src->H, 2.0);//low value to avoid artifacts
}
if(mode == 1) { //choice of median
@@ -1386,19 +1375,14 @@ SSEFUNCTION void ImProcFunctions::BadpixelsLab(LabImage * src, LabImage * dst, d
#pragma omp parallel
#endif
{
- AlignedBufferMP buffer(max(src->W, src->H));
-
//chroma a and b
if(mode >= 2) { //choice of gaussian blur
- gaussHorizontal (sraa, tmaa, buffer, src->W, src->H, radius);
- gaussHorizontal (srbb, tmbb, buffer, src->W, src->H, radius);
- gaussVertical (tmaa, tmaa, buffer, src->W, src->H, radius);
- gaussVertical (tmbb, tmbb, buffer, src->W, src->H, radius);
+ gaussianBlur (sraa, tmaa, src->W, src->H, radius);
+ gaussianBlur (srbb, tmbb, src->W, src->H, radius);
}
//luma sh_p
- gaussHorizontal (src->L, tmL, buffer, src->W, src->H, 2.0);//low value to avoid artifacts
- gaussVertical (tmL, tmL, buffer, src->W, src->H, 2.0);
+ gaussianBlur (src->L, tmL, src->W, src->H, 2.0);//low value to avoid artifacts
}
if(mode == 1) { //choice of median
diff --git a/rtengine/amaze_demosaic_RT.cc b/rtengine/amaze_demosaic_RT.cc
index 10a3687e6..dc2d4316e 100644
--- a/rtengine/amaze_demosaic_RT.cc
+++ b/rtengine/amaze_demosaic_RT.cc
@@ -37,7 +37,6 @@ namespace rtengine
SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh)
{
-
#define HCLIP(x) x //is this still necessary???
//min(clip_pt,x)
@@ -1615,10 +1614,10 @@ SSEFUNCTION void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw,
if(plistener) {
progresscounter++;
- if(progresscounter % 4 == 0) {
+ if(progresscounter % 16 == 0) {
#pragma omp critical
{
- progress += (double)4 * ((TS - 32) * (TS - 32)) / (height * width);
+ progress += (double)16 * ((TS - 32) * (TS - 32)) / (height * width);
if (progress > 1.0)
{
diff --git a/rtengine/array2D.h b/rtengine/array2D.h
index 93734a421..f9d92ac36 100644
--- a/rtengine/array2D.h
+++ b/rtengine/array2D.h
@@ -23,7 +23,7 @@
* Usage:
*
* array2D name (X-size,Y-size);
- * array2D name (X-size,Y-size type ** data);
+ * array2D name (X-size,Y-size,type ** data);
*
* creates an array which is valid within the normal C/C++ scope "{ ... }"
*
@@ -75,7 +75,7 @@ private:
T ** ptr;
T * data;
bool lock; // useful lock to ensure data is not changed anymore.
- void ar_realloc(int w, int h)
+ void ar_realloc(int w, int h, int offset = 0)
{
if ((ptr) && ((h > y) || (4 * h < y))) {
delete[] ptr;
@@ -92,14 +92,14 @@ private:
}
if (data == NULL) {
- data = new T[h * w];
+ data = new T[h * w + offset];
}
x = w;
y = h;
for (int i = 0; i < h; i++) {
- ptr[i] = data + w * i;
+ ptr[i] = data + offset + w * i;
}
owner = 1;
@@ -184,6 +184,19 @@ public:
}
}
+ void free()
+ {
+ if ((owner) && (data)) {
+ delete[] data;
+ data = NULL;
+ }
+
+ if (ptr) {
+ delete [] ptr;
+ ptr = NULL;
+ }
+ }
+
// use with indices
T * operator[](int index)
{
@@ -207,7 +220,7 @@ public:
// useful within init of parent object
// or use as resize of 2D array
- void operator()(int w, int h, unsigned int flgs = 0)
+ void operator()(int w, int h, unsigned int flgs = 0, int offset = 0)
{
flags = flgs;
@@ -223,10 +236,10 @@ public:
lock = flags & ARRAY2D_LOCK_DATA;
- ar_realloc(w, h);
+ ar_realloc(w, h, offset);
if (flags & ARRAY2D_CLEAR_DATA) {
- memset(data, 0, w * h * sizeof(T));
+ memset(data + offset, 0, w * h * sizeof(T));
}
}
@@ -298,10 +311,10 @@ private:
array2D list[num];
public:
- multi_array2D(int x, int y, int flags = 0)
+ multi_array2D(int x, int y, int flags = 0, int offset = 0)
{
for (size_t i = 0; i < num; i++) {
- list[i](x, y, flags);
+ list[i](x, y, flags, (i + 1) * offset);
}
}
@@ -312,11 +325,7 @@ public:
array2D & operator[](int index)
{
- if (static_cast(index) >= num) {
- printf("index %0u is out of range[0..%0lu]", index, num - 1);
- raise( SIGSEGV);
- }
-
+ assert(static_cast(index) < num);
return list[index];
}
};
diff --git a/rtengine/bilateral2.h b/rtengine/bilateral2.h
index 925414fd4..7a919546f 100644
--- a/rtengine/bilateral2.h
+++ b/rtengine/bilateral2.h
@@ -26,9 +26,7 @@
#include "rtengine.h"
#include "rt_math.h"
-#include "alignedbuffer.h"
#include "mytime.h"
-#include "gauss.h"
#include "array2D.h"
#ifdef _OPENMP
@@ -147,7 +145,7 @@ using namespace rtengine;
a31*SULY(3,-5) + a32*SULY(3,-4) + a33*SULY(3,-3) + a34*SULY(3,-2) + a35*SULY(3,-1) + a36*SULY(3,0) + a35*SULY(3,1) + a34*SULY(3,2) + a33*SULY(3,3) + a32*SULY(3,4) + a31*SULY(3,5) + \
a21*SULY(4,-5) + a22*SULY(4,-4) + a23*SULY(4,-3) + a24*SULY(4,-2) + a25*SULY(4,-1) + a26*SULY(4,0) + a25*SULY(4,1) + a24*SULY(4,2) + a23*SULY(4,3) + a22*SULY(4,4) + a21*SULY(4,5) + \
a11*SULY(5,-5) + a12*SULY(5,-4) + a13*SULY(5,-3) + a14*SULY(5,-2) + a15*SULY(5,-1) + a16*SULY(5,0) + a15*SULY(5,1) + a14*SULY(5,2) + a13*SULY(5,3) + a12*SULY(5,4) + a11*SULY(5,5); \
-
+
// sigma = 0.5
template void bilateral05 (T** src, T** dst, T** buffer, int W, int H, double sens, bool multiThread)
diff --git a/rtengine/color.cc b/rtengine/color.cc
index c2bdcc9dd..c0dbab4d3 100644
--- a/rtengine/color.cc
+++ b/rtengine/color.cc
@@ -50,6 +50,11 @@ LUTf Color::gammatab_26_11;
LUTf Color::igammatab_24_17;
LUTf Color::gammatab_24_17a;
LUTf Color::gammatab_13_2;
+LUTf Color::igammatab_13_2;
+LUTf Color::gammatab_115_2;
+LUTf Color::igammatab_115_2;
+LUTf Color::gammatab_145_3;
+LUTf Color::igammatab_145_3;
// Wikipedia sRGB: Unlike most other RGB color spaces, the sRGB gamma cannot be expressed as a single numerical value.
// The overall gamma is approximately 2.2, consisting of a linear (gamma 1.0) section near black, and a non-linear section elsewhere involving a 2.4 exponent
@@ -162,6 +167,11 @@ void Color::init ()
igammatab_24_17(65536, 0);
gammatab_24_17a(65536, LUT_CLIP_ABOVE | LUT_CLIP_BELOW);
gammatab_13_2(65536, 0);
+ igammatab_13_2(65536, 0);
+ gammatab_115_2(65536, 0);
+ igammatab_115_2(65536, 0);
+ gammatab_145_3(65536, 0);
+ igammatab_145_3(65536, 0);
for (int i = 0; i < 65536; i++) {
gammatab_srgb[i] = (65535.0 * gamma2 (i / 65535.0));
@@ -200,10 +210,31 @@ void Color::init ()
gammatab_13_2[i] = (65535.0 * gamma13_2 (i / 65535.0));
}
+ for (int i = 0; i < 65536; i++) {
+ igammatab_13_2[i] = (65535.0 * igamma13_2 (i / 65535.0));
+ }
+
+ for (int i = 0; i < 65536; i++) {
+ gammatab_115_2[i] = (65535.0 * gamma115_2 (i / 65535.0));
+ }
+
+ for (int i = 0; i < 65536; i++) {
+ igammatab_115_2[i] = (65535.0 * igamma115_2 (i / 65535.0));
+ }
+
+ for (int i = 0; i < 65536; i++) {
+ gammatab_145_3[i] = (65535.0 * gamma145_3 (i / 65535.0));
+ }
+
+ for (int i = 0; i < 65536; i++) {
+ igammatab_145_3[i] = (65535.0 * igamma145_3 (i / 65535.0));
+ }
+
for (int i = 0; i < 65536; i++) {
gammatab_26_11[i] = (65535.0 * gamma26_11 (i / 65535.0));
}
+//gammatab_145_3
for (int i = 0; i < 65536; i++) {
igammatab_26_11[i] = (65535.0 * igamma26_11 (i / 65535.0));
}
@@ -280,6 +311,70 @@ void Color::rgb2hsl(float r, float g, float b, float &h, float &s, float &l)
}
}
+void Color::rgb2hslfloat(float r, float g, float b, float &h, float &s, float &l)
+{
+
+ float m = min(r, g, b);
+ float M = max(r, g, b);
+ float C = M - m;
+
+ l = (M + m) * 7.6295109e-6f; // (0.5f / 65535.f)
+
+ if (fabsf(C) < 0.65535f) { // 0.00001f * 65535.f
+ h = 0.f;
+ s = 0.f;
+ } else {
+
+ if (l <= 0.5f) {
+ s = (M - m) / (M + m);
+ } else {
+ s = (M - m) / (131070.f - M - m); // 131070.f = 2.f * 65535.f
+ }
+
+ if ( r == M ) {
+ h = (g - b);
+ } else if ( g == M ) {
+ h = (2.f * C) + (b - r);
+ } else {
+ h = (4.f * C) + (r - g);
+ }
+
+ h /= (6.f * C);
+
+ if ( h < 0.f ) {
+ h += 1.f;
+ } else if ( h > 1.f ) {
+ h -= 1.f;
+ }
+ }
+}
+
+#ifdef __SSE2__
+void Color::rgb2hsl(vfloat r, vfloat g, vfloat b, vfloat &h, vfloat &s, vfloat &l)
+{
+ vfloat maxv = _mm_max_ps(r, _mm_max_ps(g, b));
+ vfloat minv = _mm_min_ps(r, _mm_min_ps(g, b));
+ vfloat C = maxv - minv;
+ vfloat tempv = maxv + minv;
+ l = (tempv) * F2V(7.6295109e-6f);
+ s = (maxv - minv);
+ s /= vself(vmaskf_gt(l, F2V(0.5f)), F2V(131070.f) - tempv, tempv);
+
+ h = F2V(4.f) * C + r - g;
+ h = vself(vmaskf_eq(g, maxv), F2V(2.f) * C + b - r, h);
+ h = vself(vmaskf_eq(r, maxv), g - b, h);
+
+ h /= (F2V(6.f) * C);
+ vfloat onev = F2V(1.f);
+ h = vself(vmaskf_lt(h, ZEROV), h + onev, h);
+ h = vself(vmaskf_gt(h, onev), h - onev, h);
+
+ vmask zeromask = vmaskf_lt(vabsf(C), F2V(0.65535f));
+ h = vself(zeromask, ZEROV, h);
+ s = vself(zeromask, ZEROV, s);
+}
+#endif
+
double Color::hue2rgb(double p, double q, double t)
{
if (t < 0.) {
@@ -299,6 +394,42 @@ double Color::hue2rgb(double p, double q, double t)
}
}
+float Color::hue2rgbfloat(float p, float q, float t)
+{
+ if (t < 0.f) {
+ t += 6.f;
+ } else if( t > 6.f) {
+ t -= 6.f;
+ }
+
+ if (t < 1.f) {
+ return p + (q - p) * t;
+ } else if (t < 3.f) {
+ return q;
+ } else if (t < 4.f) {
+ return p + (q - p) * (4.f - t);
+ } else {
+ return p;
+ }
+}
+
+#ifdef __SSE2__
+vfloat Color::hue2rgb(vfloat p, vfloat q, vfloat t)
+{
+ vfloat fourv = F2V(4.f);
+ vfloat threev = F2V(3.f);
+ vfloat sixv = threev + threev;
+ t = vself(vmaskf_lt(t, ZEROV), t + sixv, t);
+ t = vself(vmaskf_gt(t, sixv), t - sixv, t);
+
+ vfloat temp1 = p + (q - p) * t;
+ vfloat temp2 = p + (q - p) * (fourv - t);
+ vfloat result = vself(vmaskf_lt(t, fourv), temp2, p);
+ result = vself(vmaskf_lt(t, threev), q, result);
+ return vself(vmaskf_lt(t, fourv - threev), temp1, result);
+}
+#endif
+
void Color::hsl2rgb (float h, float s, float l, float &r, float &g, float &b)
{
@@ -324,6 +455,53 @@ void Color::hsl2rgb (float h, float s, float l, float &r, float &g, float &b)
}
}
+void Color::hsl2rgbfloat (float h, float s, float l, float &r, float &g, float &b)
+{
+
+ if (s == 0.f) {
+ r = g = b = 65535.f * l; // achromatic
+ } else {
+ float m2;
+
+ if (l <= 0.5f) {
+ m2 = l * (1.f + s);
+ } else {
+ m2 = l + s - l * s;
+ }
+
+ float m1 = 2.f * l - m2;
+
+ r = 65535.f * hue2rgbfloat (m1, m2, h * 6.f + 2.f);
+ g = 65535.f * hue2rgbfloat (m1, m2, h * 6.f);
+ b = 65535.f * hue2rgbfloat (m1, m2, h * 6.f - 2.f);
+ }
+}
+
+#ifdef __SSE2__
+void Color::hsl2rgb (vfloat h, vfloat s, vfloat l, vfloat &r, vfloat &g, vfloat &b)
+{
+
+ vfloat m2 = s * l;
+ m2 = vself(vmaskf_gt(l, F2V(0.5f)), s - m2, m2);
+ m2 += l;
+
+ vfloat twov = F2V(2.f);
+ vfloat c65535v = F2V(65535.f);
+ vfloat m1 = l + l - m2;
+
+ h *= F2V(6.f);
+ r = c65535v * hue2rgb (m1, m2, h + twov);
+ g = c65535v * hue2rgb (m1, m2, h);
+ b = c65535v * hue2rgb (m1, m2, h - twov);
+
+ vmask selectsMask = vmaskf_eq(ZEROV, s);
+ vfloat lc65535v = c65535v * l;
+ r = vself(selectsMask, lc65535v, r);
+ g = vself(selectsMask, lc65535v, g);
+ b = vself(selectsMask, lc65535v, b);
+}
+#endif
+
void Color::hsl2rgb01 (float h, float s, float l, float &r, float &g, float &b)
{
@@ -595,6 +773,15 @@ void Color::xyz2rgb (float x, float y, float z, float &r, float &g, float &b, co
b = ((rgb_xyz[2][0] * x + rgb_xyz[2][1] * y + rgb_xyz[2][2] * z)) ;
}
+#ifdef __SSE2__
+void Color::xyz2rgb (vfloat x, vfloat y, vfloat z, vfloat &r, vfloat &g, vfloat &b, const vfloat rgb_xyz[3][3])
+{
+ r = ((rgb_xyz[0][0] * x + rgb_xyz[0][1] * y + rgb_xyz[0][2] * z)) ;
+ g = ((rgb_xyz[1][0] * x + rgb_xyz[1][1] * y + rgb_xyz[1][2] * z)) ;
+ b = ((rgb_xyz[2][0] * x + rgb_xyz[2][1] * y + rgb_xyz[2][2] * z)) ;
+}
+#endif // __SSE2__
+
void Color::trcGammaBW (float &r, float &g, float &b, float gammabwr, float gammabwg, float gammabwb)
{
// correct gamma for black and white image : pseudo TRC curve of ICC profil
@@ -1130,35 +1317,35 @@ void Color::calcGamma (double pwr, double ts, int mode, int imax, double &gamma0
{
//from Dcraw (D.Coffin)
int i;
- double g[6], bnd[2] = {0, 0};
+ double g[6], bnd[2] = {0., 0.};
g[0] = pwr;
g[1] = ts;
- g[2] = g[3] = g[4] = 0;
- bnd[g[1] >= 1] = 1;
+ g[2] = g[3] = g[4] = 0.;
+ bnd[g[1] >= 1.] = 1.;
- if (g[1] && (g[1] - 1) * (g[0] - 1) <= 0) {
+ if (g[1] && (g[1] - 1.) * (g[0] - 1.) <= 0.) {
for (i = 0; i < 48; i++) {
- g[2] = (bnd[0] + bnd[1]) / 2;
+ g[2] = (bnd[0] + bnd[1]) / 2.;
if (g[0]) {
- bnd[(pow(g[2] / g[1], -g[0]) - 1) / g[0] - 1 / g[2] > -1] = g[2];
+ bnd[(pow(g[2] / g[1], -g[0]) - 1.) / g[0] - 1. / g[2] > -1.] = g[2];
} else {
- bnd[g[2] / exp(1 - 1 / g[2]) < g[1]] = g[2];
+ bnd[g[2] / exp(1. - 1. / g[2]) < g[1]] = g[2];
}
}
g[3] = g[2] / g[1];
if (g[0]) {
- g[4] = g[2] * (1 / g[0] - 1);
+ g[4] = g[2] * (1. / g[0] - 1.);
}
}
if (g[0]) {
- g[5] = 1 / (g[1] * SQR(g[3]) / 2 - g[4] * (1 - g[3]) + (1 - pow(g[3], 1 + g[0])) * (1 + g[4]) / (1 + g[0])) - 1;
+ g[5] = 1. / (g[1] * SQR(g[3]) / 2. - g[4] * (1. - g[3]) + (1. - pow(g[3], 1. + g[0])) * (1. + g[4]) / (1. + g[0])) - 1.;
} else {
- g[5] = 1 / (g[1] * SQR(g[3]) / 2 + 1 - g[2] - g[3] - g[2] * g[3] * (log(g[3]) - 1)) - 1;
+ g[5] = 1. / (g[1] * SQR(g[3]) / 2. + 1. - g[2] - g[3] - g[2] * g[3] * (log(g[3]) - 1.)) - 1.;
}
if (!mode--) {
diff --git a/rtengine/color.h b/rtengine/color.h
index 9601ec3f6..c179946f0 100644
--- a/rtengine/color.h
+++ b/rtengine/color.h
@@ -89,7 +89,10 @@ private:
// Separated from init() to keep the code clear
static void initMunsell ();
static double hue2rgb(double p, double q, double t);
-
+ static float hue2rgbfloat(float p, float q, float t);
+#ifdef __SSE2__
+ static vfloat hue2rgb(vfloat p, vfloat q, vfloat t);
+#endif
public:
typedef enum Channel {
@@ -139,6 +142,11 @@ public:
static LUTf igammatab_24_17;
static LUTf gammatab_24_17a;
static LUTf gammatab_13_2;
+ static LUTf igammatab_13_2;
+ static LUTf gammatab_115_2;
+ static LUTf igammatab_115_2;
+ static LUTf gammatab_145_3;
+ static LUTf igammatab_145_3;
// look-up tables for the simple exponential gamma
static LUTf gammatab;
@@ -179,7 +187,10 @@ public:
* @param l luminance channel [0; 1] (return value)
*/
static void rgb2hsl (float r, float g, float b, float &h, float &s, float &l);
-
+ static void rgb2hslfloat (float r, float g, float b, float &h, float &s, float &l);
+#ifdef __SSE2__
+ static void rgb2hsl (vfloat r, vfloat g, vfloat b, vfloat &h, vfloat &s, vfloat &l);
+#endif
/**
* @brief Convert hue/saturation/luminance in red/green/blue
@@ -191,6 +202,10 @@ public:
* @param b blue channel [0 ; 65535] (return value)
*/
static void hsl2rgb (float h, float s, float l, float &r, float &g, float &b);
+ static void hsl2rgbfloat (float h, float s, float l, float &r, float &g, float &b);
+#ifdef __SSE2__
+ static void hsl2rgb (vfloat h, vfloat s, vfloat l, vfloat &r, vfloat &g, vfloat &b);
+#endif
/**
* @brief Convert hue/saturation/luminance in red/green/blue
@@ -293,6 +308,9 @@ public:
*/
static void xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const double rgb_xyz[3][3]);
static void xyz2rgb (float x, float y, float z, float &r, float &g, float &b, const float rgb_xyz[3][3]);
+#ifdef __SSE2__
+ static void xyz2rgb (vfloat x, vfloat y, vfloat z, vfloat &r, vfloat &g, vfloat &b, const vfloat rgb_xyz[3][3]);
+#endif
/**
@@ -936,9 +954,45 @@ public:
*/
static inline double gamma13_2 (double x)
{
- return x <= 0.016613 ? x * 2.0 : 1.009968 * exp(log(x) / 1.3) - 0.016613;
+ return x <= 0.016613 ? x * 2.0 : 1.009968 * exp(log(x) / 1.3) - 0.009968;
}
+ static inline double igamma13_2 (double x)
+ {
+ return x <= 0.033226 ? x / 2.0 : exp(log((x + 0.009968) / 1.009968) * 1.3);
+ }
+
+ static inline double gamma115_2 (double x)
+ {
+ return x <= 0.001692 ? x * 2.0 : 1.000508 * exp(log(x) / 1.15) - 0.000508;
+ }
+
+ static inline double igamma115_2 (double x)
+ {
+ return x <= 0.003384 ? x / 2.0 : exp(log((x + 0.000508) / 1.000508) * 1.15);
+ }
+
+ static inline double gamma145_3 (double x)
+ {
+ return x <= 0.009115 ? x * 3.0 : 1.012305 * exp(log(x) / 1.45) - 0.012305;
+ }
+
+ static inline double igamma145_3 (double x)
+ {
+ return x <= 0.027345 ? x / 3.0 : exp(log((x + 0.012305) / 1.012305) * 1.45);
+ }
+
+//gamma for Retinex
+ static inline double gammareti (double x, double gamma, double start, double slope, double mul, double add)
+ {
+ return (x <= start ? x*slope : exp(log(x) / gamma) * mul - add);
+ }
+ static inline double igammareti (double x, double gamma, double start, double slope, double mul, double add)
+ {
+ return (x <= start * slope ? x / slope : exp(log((x + add) / mul) * gamma) );
+ }
+
+
// gamma function with adjustable parameters
//same as above with values calculate with Calcgamma above
diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc
index e22c2fd06..d4f1c995f 100644
--- a/rtengine/colortemp.cc
+++ b/rtengine/colortemp.cc
@@ -1794,7 +1794,7 @@ The next 3 methods are inspired from:
This program is in the public domain.
b) Bruce Lindbloom
- Adapted to Rawtherapee by J.Desmis
+ Adapted to RawTherapee by J.Desmis
this values are often called xBar yBar zBar and are characteristics of a color / illuminant
diff --git a/rtengine/curves.cc b/rtengine/curves.cc
index d712a9629..4ad1d06bd 100644
--- a/rtengine/curves.cc
+++ b/rtengine/curves.cc
@@ -503,6 +503,43 @@ void CurveFactory::curveCL ( bool & clcutili, const std::vector& clcurve
dCurve = NULL;
}
}
+
+void CurveFactory::curveDehaContL ( bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, LUTu & histogram, LUTu & outBeforeCurveHistogram)
+{
+ bool needed = false;
+ DiagonalCurve* dCurve = NULL;
+ outBeforeCurveHistogram.clear();
+ bool histNeeded = false;
+
+ if (!dehaclcurvePoints.empty() && dehaclcurvePoints[0] != 0) {
+ dCurve = new DiagonalCurve (dehaclcurvePoints, CURVES_MIN_POLY_POINTS / skip);
+
+ if (outBeforeCurveHistogram) {
+ histNeeded = true;
+ }
+
+ if (dCurve && !dCurve->isIdentity()) {
+ needed = true;
+ dehacontlutili = true;
+ }
+ }
+
+ if (histNeeded) {
+ for (int i = 0; i < 32768; i++) {
+ double hval = CLIPD((double)i / 32767.0);
+ int hi = (int)(255.0 * hval);
+ outBeforeCurveHistogram[hi] += histogram[i] ;
+ }
+ }
+
+ fillCurveArray(dCurve, dehaclCurve, skip, needed);
+
+ if (dCurve) {
+ delete dCurve;
+ dCurve = NULL;
+ }
+}
+
// add curve Lab wavelet : Cont=f(L)
void CurveFactory::curveWavContL ( bool & wavcontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve, /*LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip)
{
@@ -1320,6 +1357,39 @@ void ColorAppearance::Set(Curve *pCurve)
}
}
+//
+RetinextransmissionCurve::RetinextransmissionCurve() {};
+
+void RetinextransmissionCurve::Reset()
+{
+ luttransmission.reset();
+}
+
+void RetinextransmissionCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ luttransmission.reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ luttransmission(501); // raise this value if the quality suffers from this number of samples
+
+ for (int i = 0; i < 501; i++) {
+ luttransmission[i] = pCurve.getVal(double(i) / 500.);
+ }
+}
+
+void RetinextransmissionCurve::Set(const std::vector &curvePoints)
+{
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ tcurve.setIdentityValue(0.);
+ Set(tcurve);
+ } else {
+ Reset();
+ }
+}
+
void ToneCurve::Reset()
{
lutToneCurve.reset();
diff --git a/rtengine/curves.h b/rtengine/curves.h
index 56681f4b6..f0643c7a9 100644
--- a/rtengine/curves.h
+++ b/rtengine/curves.h
@@ -282,6 +282,7 @@ public:
static void curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, LUTu & histogramcl, LUTu & outBeforeCLurveHistogram, int skip);
static void curveWavContL ( bool & wavcontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve,/* LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip);
+ static void curveDehaContL ( bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, LUTu & histogram, LUTu & outBeforeCurveHistogram);
static void curveToningCL ( bool & clctoningutili, const std::vector& clcurvePoints, LUTf & clToningCurve, int skip);
static void curveToningLL ( bool & llctoningutili, const std::vector& llcurvePoints, LUTf & llToningCurve, int skip);
@@ -428,6 +429,32 @@ public:
};
};
+class RetinextransmissionCurve
+{
+private:
+ LUTf luttransmission; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ virtual ~RetinextransmissionCurve() {};
+ RetinextransmissionCurve();
+
+ void Reset();
+ void Set(const Curve *pCurve);
+ void Set(const std::vector &curvePoints);
+ float operator[](float index) const
+ {
+ return luttransmission[index];
+ }
+
+ operator bool (void) const
+ {
+ return luttransmission;
+ }
+};
+
+
+
class ToneCurve
{
public:
diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc
index add5b525d..8e0a36df2 100644
--- a/rtengine/dcraw.cc
+++ b/rtengine/dcraw.cc
@@ -136,10 +136,10 @@ const float d65_white[3] = { 0.950456, 1, 1.088754 };
#define SQR(x) rtengine::SQR(x)
#define ABS(x) (((int)(x) ^ ((int)(x) >> 31)) - ((int)(x) >> 31))
-#define MIN(a,b) rtengine::min(a,static_cast(b))
-#define MAX(a,b) rtengine::max(a,static_cast(b))
-#define LIM(x,min,max) rtengine::LIM(x,static_cast(min),static_cast(max))
-#define ULIM(x,y,z) rtengine::ULIM(x,static_cast(y),static_cast(z))
+#define MIN(a,b) rtengine::min(a,static_cast<__typeof__(a)>(b))
+#define MAX(a,b) rtengine::max(a,static_cast<__typeof__(a)>(b))
+#define LIM(x,min,max) rtengine::LIM(x,static_cast<__typeof__(x)>(min),static_cast<__typeof__(x)>(max))
+#define ULIM(x,y,z) rtengine::ULIM(x,static_cast<__typeof__(x)>(y),static_cast<__typeof__(x)>(z))
#define CLIP(x) rtengine::CLIP(x)
#define SWAP(a,b) { a=a+b; b=a-b; a=a-b; }
diff --git a/rtengine/dcraw.patch b/rtengine/dcraw.patch
index e1603864a..db24e7fe8 100644
--- a/rtengine/dcraw.patch
+++ b/rtengine/dcraw.patch
@@ -1,5 +1,5 @@
---- dcraw.c 2015-08-15 15:35:27 +0000
-+++ dcraw.cc 2015-08-16 13:46:33 +0000
+--- dcraw.c 2015-09-21 10:08:04 +0000
++++ dcraw.cc 2015-10-14 14:29:55 +0000
@@ -1,3 +1,15 @@
+/*RT*/#include
+/*RT*/#include
@@ -148,10 +148,10 @@
-#define LIM(x,min,max) MAX(min,MIN(x,max))
-#define ULIM(x,y,z) ((y) < (z) ? LIM(x,y,z) : LIM(x,z,y))
-#define CLIP(x) LIM(x,0,65535)
-+#define MIN(a,b) rtengine::min(a,static_cast(b))
-+#define MAX(a,b) rtengine::max(a,static_cast(b))
-+#define LIM(x,min,max) rtengine::LIM(x,static_cast(min),static_cast(max))
-+#define ULIM(x,y,z) rtengine::ULIM(x,static_cast(y),static_cast(z))
++#define MIN(a,b) rtengine::min(a,static_cast<__typeof__(a)>(b))
++#define MAX(a,b) rtengine::max(a,static_cast<__typeof__(a)>(b))
++#define LIM(x,min,max) rtengine::LIM(x,static_cast<__typeof__(x)>(min),static_cast<__typeof__(x)>(max))
++#define ULIM(x,y,z) rtengine::ULIM(x,static_cast<__typeof__(x)>(y),static_cast<__typeof__(x)>(z))
+#define CLIP(x) rtengine::CLIP(x)
#define SWAP(a,b) { a=a+b; b=a-b; a=a-b; }
diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc
index 138a03594..a97ae7f39 100644
--- a/rtengine/dcrop.cc
+++ b/rtengine/dcrop.cc
@@ -807,6 +807,8 @@ void Crop::update (int todo)
bool wavcontlutili = parent->wavcontlutili;
LUTu dummy;
+ int moderetinex;
+ // parent->ipf.MSR(labnCrop, labnCrop->W, labnCrop->H, 1);
parent->ipf.chromiLuminanceCurve (this, 1, labnCrop, labnCrop, parent->chroma_acurve, parent->chroma_bcurve, parent->satcurve, parent->lhskcurve, parent->clcurve, parent->lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy, dummy, dummy);
parent->ipf.vibrance (labnCrop);
diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc
index 954be456b..aa1b90278 100644
--- a/rtengine/demosaic_algos.cc
+++ b/rtengine/demosaic_algos.cc
@@ -1242,7 +1242,7 @@ void RawImageSource::border_interpolate2( int winw, int winh, int lborders)
// Joint Demosaicing and Denoising using High Order Interpolation Techniques
// Revision 0.9.1a - 09/02/2010 - Contact info: luis.sanz.rodriguez@gmail.com
// Copyright Luis Sanz Rodriguez 2010
-// Adapted to RT by Jacques Desmis 3/2013
+// Adapted to RawTherapee by Jacques Desmis 3/2013
void RawImageSource::jdl_interpolate_omp() // from "Lassus"
{
@@ -1367,7 +1367,7 @@ void RawImageSource::jdl_interpolate_omp() // from "Lassus"
// Color demozaicing via directional Linear Minimum Mean Square-error Estimation,
// IEEE Trans. on Image Processing, vol. 14, pp. 2167-2178,
// Dec. 2005.
-// Adapted to RT by Jacques Desmis 3/2013
+// Adapted to RawTherapee by Jacques Desmis 3/2013
// Improved speed and reduced memory consumption by Ingo Weyrich 2/2015
//TODO Tiles to reduce memory consumption
SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int iterations)
@@ -2041,7 +2041,7 @@ SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int i
* Visit for more information.
*
***/
-// Adapted to RT by Jacques Desmis 3/2013
+// Adapted to RawTherapee by Jacques Desmis 3/2013
// SSE version by Ingo Weyrich 5/2013
#ifdef __SSE2__
#define CLIPV(a) LIMV(a,zerov,c65535v)
@@ -2965,7 +2965,7 @@ void RawImageSource::nodemosaic(bool bw)
/*
Refinement based on EECI demosaicing algorithm by L. Chang and Y.P. Tan
Paul Lee
- Adapted for Rawtherapee - Jacques Desmis 04/2013
+ Adapted for RawTherapee - Jacques Desmis 04/2013
*/
#ifdef __SSE2__
diff --git a/rtengine/diagonalcurves.cc b/rtengine/diagonalcurves.cc
index f46cdb8cb..f09eb3459 100644
--- a/rtengine/diagonalcurves.cc
+++ b/rtengine/diagonalcurves.cc
@@ -72,7 +72,11 @@ DiagonalCurve::DiagonalCurve (const std::vector& p, int poly_pn)
if(x[0] == 0.f && x[1] == 0.f)
// Avoid crash when first two points are at x = 0 (git Issue 2888)
- x[1] = 0.5f;
+ x[1] = 0.01f;
+
+ if(x[0] == 1.f && x[1] == 1.f)
+ // Avoid crash when first two points are at x = 1 (100 in gui) (git Issue 2923)
+ x[0] = 0.99f;
if (!identity) {
if (kind == DCT_Spline && N > 2) {
diff --git a/rtengine/gauss.h b/rtengine/gauss.h
index b8ec0008f..61e5e2fe4 100644
--- a/rtengine/gauss.h
+++ b/rtengine/gauss.h
@@ -22,15 +22,11 @@
#include
#include
#include
-#include "alignedbuffer.h"
-#ifdef _OPENMP
-#include
-#endif
#include "opthelper.h"
// classical filtering if the support window is small:
-template void gaussHorizontal3 (T** src, T** dst, AlignedBufferMP &buffer, int W, int H, const float c0, const float c1)
+template void gaussHorizontal3 (T** src, T** dst, int W, int H, const float c0, const float c1)
{
#ifdef _OPENMP
@@ -38,8 +34,7 @@ template void gaussHorizontal3 (T** src, T** dst, AlignedBufferMP* pBuf = buffer.acquire();
- T* temp = (T*)pBuf->data;
+ T temp[W] ALIGNED16;
for (int j = 1; j < W - 1; j++) {
temp[j] = (T)(c1 * (src[i][j - 1] + src[i][j + 1]) + c0 * src[i][j]);
@@ -48,13 +43,11 @@ template void gaussHorizontal3 (T** src, T** dst, AlignedBufferMP void gaussVertical3 (T** src, T** dst, AlignedBufferMP &buffer, int W, int H, const float c0, const float c1)
+template void gaussVertical3 (T** src, T** dst, int W, int H, const float c0, const float c1)
{
#ifdef _OPENMP
@@ -62,8 +55,7 @@ template void gaussVertical3 (T** src, T** dst, AlignedBufferMP
#endif
for (int i = 0; i < W; i++) {
- AlignedBuffer* pBuf = buffer.acquire();
- T* temp = (T*)pBuf->data;
+ T temp[H] ALIGNED16;
for (int j = 1; j < H - 1; j++) {
temp[j] = (T)(c1 * (src[j - 1][i] + src[j + 1][i]) + c0 * src[j][i]);
@@ -75,39 +67,37 @@ template void gaussVertical3 (T** src, T** dst, AlignedBufferMP
dst[j][i] = temp[j];
}
- buffer.release(pBuf);
-
dst[H - 1][i] = src[H - 1][i];
}
}
-#ifdef __SSE__
+#ifdef __SSE2__
template SSEFUNCTION void gaussVertical3Sse (T** src, T** dst, int W, int H, const float c0, const float c1)
{
__m128 Tv, Tm1v, Tp1v;
__m128 c0v, c1v;
- c0v = _mm_set1_ps(c0);
- c1v = _mm_set1_ps(c1);
+ c0v = F2V(c0);
+ c1v = F2V(c1);
#ifdef _OPENMP
#pragma omp for
#endif
for (int i = 0; i < W - 3; i += 4) {
- Tm1v = _mm_loadu_ps( &src[0][i] );
- _mm_storeu_ps( &dst[0][i], Tm1v);
+ Tm1v = LVFU( src[0][i] );
+ STVFU( dst[0][i], Tm1v);
if (H > 1) {
- Tv = _mm_loadu_ps( &src[1][i]);
+ Tv = LVFU( src[1][i]);
}
for (int j = 1; j < H - 1; j++) {
- Tp1v = _mm_loadu_ps( &src[j + 1][i]);
- _mm_storeu_ps( &dst[j][i], c1v * (Tp1v + Tm1v) + Tv * c0v);
+ Tp1v = LVFU( src[j + 1][i]);
+ STVFU( dst[j][i], c1v * (Tp1v + Tm1v) + Tv * c0v);
Tm1v = Tv;
Tv = Tp1v;
}
- _mm_storeu_ps( &dst[H - 1][i], _mm_loadu_ps( &src[H - 1][i]));
+ STVFU( dst[H - 1][i], LVFU( src[H - 1][i]));
}
// Borders are done without SSE
@@ -129,12 +119,12 @@ template SSEFUNCTION void gaussVertical3Sse (T** src, T** dst, int W, i
template SSEFUNCTION void gaussHorizontal3Sse (T** src, T** dst, int W, int H, const float c0, const float c1)
{
- float tmp[W][4] __attribute__ ((aligned (16)));
+ float tmp[W][4] ALIGNED16;
__m128 Tv, Tm1v, Tp1v;
__m128 c0v, c1v;
- c0v = _mm_set1_ps(c0);
- c1v = _mm_set1_ps(c1);
+ c0v = F2V(c0);
+ c1v = F2V(c1);
#ifdef _OPENMP
#pragma omp for
#endif
@@ -152,7 +142,7 @@ template SSEFUNCTION void gaussHorizontal3Sse (T** src, T** dst, int W,
for (int j = 1; j < W - 1; j++) {
Tp1v = _mm_set_ps( src[i][j + 1], src[i + 1][j + 1], src[i + 2][j + 1], src[i + 3][j + 1] );
- _mm_store_ps( &tmp[j][0], c1v * (Tp1v + Tm1v) + Tv * c0v);
+ STVF( tmp[j][0], c1v * (Tp1v + Tm1v) + Tv * c0v);
Tm1v = Tv;
Tv = Tp1v;
}
@@ -250,16 +240,16 @@ template SSEFUNCTION void gaussHorizontalSse (T** src, T** dst, int W,
M[i][j] /= (1.0 + b1 - b2 + b3) * (1.0 - b1 - b2 - b3);
}
- float tmp[W][4] __attribute__ ((aligned (16)));
- float tmpV[4] __attribute__ ((aligned (16)));
+ float tmp[W][4] ALIGNED16;
+ float tmpV[4] ALIGNED16;
__m128 Rv;
__m128 Tv, Tm2v, Tm3v;
__m128 Bv, b1v, b2v, b3v;
__m128 temp2W, temp2Wp1;
- Bv = _mm_set1_ps(B);
- b1v = _mm_set1_ps(b1);
- b2v = _mm_set1_ps(b2);
- b3v = _mm_set1_ps(b3);
+ Bv = F2V(B);
+ b1v = F2V(b1);
+ b2v = F2V(b2);
+ b3v = F2V(b3);
#ifdef _OPENMP
#pragma omp for
@@ -270,47 +260,47 @@ template SSEFUNCTION void gaussHorizontalSse (T** src, T** dst, int W,
tmpV[1] = src[i + 2][0];
tmpV[2] = src[i + 1][0];
tmpV[3] = src[i][0];
- Tv = _mm_load_ps(tmpV);
+ Tv = LVF(tmpV[0]);
Rv = Tv * (Bv + b1v + b2v + b3v);
Tm3v = Rv;
- _mm_store_ps( &tmp[0][0], Rv );
+ STVF( tmp[0][0], Rv );
tmpV[0] = src[i + 3][1];
tmpV[1] = src[i + 2][1];
tmpV[2] = src[i + 1][1];
tmpV[3] = src[i][1];
- Rv = _mm_load_ps(tmpV) * Bv + Rv * b1v + Tv * (b2v + b3v);
+ Rv = LVF(tmpV[0]) * Bv + Rv * b1v + Tv * (b2v + b3v);
Tm2v = Rv;
- _mm_store_ps( &tmp[1][0], Rv );
+ STVF( tmp[1][0], Rv );
tmpV[0] = src[i + 3][2];
tmpV[1] = src[i + 2][2];
tmpV[2] = src[i + 1][2];
tmpV[3] = src[i][2];
- Rv = _mm_load_ps(tmpV) * Bv + Rv * b1v + Tm3v * b2v + Tv * b3v;
- _mm_store_ps( &tmp[2][0], Rv );
+ Rv = LVF(tmpV[0]) * Bv + Rv * b1v + Tm3v * b2v + Tv * b3v;
+ STVF( tmp[2][0], Rv );
for (int j = 3; j < W; j++) {
Tv = Rv;
Rv = _mm_set_ps(src[i][j], src[i + 1][j], src[i + 2][j], src[i + 3][j]) * Bv + Tv * b1v + Tm2v * b2v + Tm3v * b3v;
- _mm_store_ps( &tmp[j][0], Rv );
+ STVF( tmp[j][0], Rv );
Tm3v = Tm2v;
Tm2v = Tv;
}
Tv = _mm_set_ps(src[i][W - 1], src[i + 1][W - 1], src[i + 2][W - 1], src[i + 3][W - 1]);
- temp2Wp1 = Tv + _mm_set1_ps(M[2][0]) * (Rv - Tv) + _mm_set1_ps(M[2][1]) * ( Tm2v - Tv ) + _mm_set1_ps(M[2][2]) * (Tm3v - Tv);
- temp2W = Tv + _mm_set1_ps(M[1][0]) * (Rv - Tv) + _mm_set1_ps(M[1][1]) * (Tm2v - Tv) + _mm_set1_ps(M[1][2]) * (Tm3v - Tv);
+ temp2Wp1 = Tv + F2V(M[2][0]) * (Rv - Tv) + F2V(M[2][1]) * ( Tm2v - Tv ) + F2V(M[2][2]) * (Tm3v - Tv);
+ temp2W = Tv + F2V(M[1][0]) * (Rv - Tv) + F2V(M[1][1]) * (Tm2v - Tv) + F2V(M[1][2]) * (Tm3v - Tv);
- Rv = Tv + _mm_set1_ps(M[0][0]) * (Rv - Tv) + _mm_set1_ps(M[0][1]) * (Tm2v - Tv) + _mm_set1_ps(M[0][2]) * (Tm3v - Tv);
- _mm_store_ps( &tmp[W - 1][0], Rv );
+ Rv = Tv + F2V(M[0][0]) * (Rv - Tv) + F2V(M[0][1]) * (Tm2v - Tv) + F2V(M[0][2]) * (Tm3v - Tv);
+ STVF( tmp[W - 1][0], Rv );
Tm2v = Bv * Tm2v + b1v * Rv + b2v * temp2W + b3v * temp2Wp1;
- _mm_store_ps( &tmp[W - 2][0], Tm2v );
+ STVF( tmp[W - 2][0], Tm2v );
Tm3v = Bv * Tm3v + b1v * Tm2v + b2v * Rv + b3v * temp2W;
- _mm_store_ps( &tmp[W - 3][0], Tm3v );
+ STVF( tmp[W - 3][0], Tm3v );
Tv = Rv;
Rv = Tm3v;
@@ -318,8 +308,8 @@ template SSEFUNCTION void gaussHorizontalSse (T** src, T** dst, int W,
for (int j = W - 4; j >= 0; j--) {
Tv = Rv;
- Rv = _mm_load_ps(&tmp[j][0]) * Bv + Tv * b1v + Tm2v * b2v + Tm3v * b3v;
- _mm_store_ps( &tmp[j][0], Rv );
+ Rv = LVF(tmp[j][0]) * Bv + Tv * b1v + Tm2v * b2v + Tm3v * b3v;
+ STVF( tmp[j][0], Rv );
Tm3v = Tm2v;
Tm2v = Tv;
}
@@ -370,10 +360,10 @@ template SSEFUNCTION void gaussHorizontalSse (T** src, T** dst, int W,
// fast gaussian approximation if the support window is large
-template void gaussHorizontal (T** src, T** dst, AlignedBufferMP &buffer, int W, int H, double sigma)
+template void gaussHorizontal (T** src, T** dst, int W, int H, double sigma)
{
-#ifdef __SSE__
+#ifdef __SSE2__
if (sigma < 70) { // bigger sigma only with double precision
gaussHorizontalSse (src, dst, W, H, sigma);
@@ -401,7 +391,7 @@ template void gaussHorizontal (T** src, T** dst, AlignedBufferMP (src, dst, buffer, W, H, c0, c1);
+ gaussHorizontal3 (src, dst, W, H, c0, c1);
return;
}
@@ -439,13 +429,13 @@ template void gaussHorizontal (T** src, T** dst, AlignedBufferMP* pBuf = buffer.acquire();
- double* temp2 = pBuf->data;
temp2[0] = B * src[i][0] + b1 * src[i][0] + b2 * src[i][0] + b3 * src[i][0];
temp2[1] = B * src[i][1] + b1 * temp2[0] + b2 * src[i][0] + b3 * src[i][0];
@@ -471,11 +461,10 @@ template void gaussHorizontal (T** src, T** dst, AlignedBufferMP SSEFUNCTION void gaussVerticalSse (T** src, T** dst, int W, int H, float sigma)
{
@@ -537,15 +526,15 @@ template SSEFUNCTION void gaussVerticalSse (T** src, T** dst, int W, in
M[i][j] /= (1.0 + b1 - b2 + b3) * (1.0 - b1 - b2 - b3);
}
- float tmp[H][4] __attribute__ ((aligned (16)));
+ float tmp[H][4] ALIGNED16;
__m128 Rv;
__m128 Tv, Tm2v, Tm3v;
__m128 Bv, b1v, b2v, b3v;
__m128 temp2W, temp2Wp1;
- Bv = _mm_set1_ps(B);
- b1v = _mm_set1_ps(b1);
- b2v = _mm_set1_ps(b2);
- b3v = _mm_set1_ps(b3);
+ Bv = F2V(B);
+ b1v = F2V(b1);
+ b2v = F2V(b2);
+ b3v = F2V(b3);
#ifdef _OPENMP
@@ -553,39 +542,39 @@ template SSEFUNCTION void gaussVerticalSse (T** src, T** dst, int W, in
#endif
for (int i = 0; i < W - 3; i += 4) {
- Tv = _mm_loadu_ps( &src[0][i]);
+ Tv = LVFU( src[0][i]);
Rv = Tv * (Bv + b1v + b2v + b3v);
Tm3v = Rv;
- _mm_store_ps( &tmp[0][0], Rv );
+ STVF( tmp[0][0], Rv );
- Rv = _mm_loadu_ps(&src[1][i]) * Bv + Rv * b1v + Tv * (b2v + b3v);
+ Rv = LVFU(src[1][i]) * Bv + Rv * b1v + Tv * (b2v + b3v);
Tm2v = Rv;
- _mm_store_ps( &tmp[1][0], Rv );
+ STVF( tmp[1][0], Rv );
- Rv = _mm_loadu_ps(&src[2][i]) * Bv + Rv * b1v + Tm3v * b2v + Tv * b3v;
- _mm_store_ps( &tmp[2][0], Rv );
+ Rv = LVFU(src[2][i]) * Bv + Rv * b1v + Tm3v * b2v + Tv * b3v;
+ STVF( tmp[2][0], Rv );
for (int j = 3; j < H; j++) {
Tv = Rv;
- Rv = _mm_loadu_ps(&src[j][i]) * Bv + Tv * b1v + Tm2v * b2v + Tm3v * b3v;
- _mm_store_ps( &tmp[j][0], Rv );
+ Rv = LVFU(src[j][i]) * Bv + Tv * b1v + Tm2v * b2v + Tm3v * b3v;
+ STVF( tmp[j][0], Rv );
Tm3v = Tm2v;
Tm2v = Tv;
}
- Tv = _mm_loadu_ps(&src[H - 1][i]);
+ Tv = LVFU(src[H - 1][i]);
- temp2Wp1 = Tv + _mm_set1_ps(M[2][0]) * (Rv - Tv) + _mm_set1_ps(M[2][1]) * (Tm2v - Tv) + _mm_set1_ps(M[2][2]) * (Tm3v - Tv);
- temp2W = Tv + _mm_set1_ps(M[1][0]) * (Rv - Tv) + _mm_set1_ps(M[1][1]) * (Tm2v - Tv) + _mm_set1_ps(M[1][2]) * (Tm3v - Tv);
+ temp2Wp1 = Tv + F2V(M[2][0]) * (Rv - Tv) + F2V(M[2][1]) * (Tm2v - Tv) + F2V(M[2][2]) * (Tm3v - Tv);
+ temp2W = Tv + F2V(M[1][0]) * (Rv - Tv) + F2V(M[1][1]) * (Tm2v - Tv) + F2V(M[1][2]) * (Tm3v - Tv);
- Rv = Tv + _mm_set1_ps(M[0][0]) * (Rv - Tv) + _mm_set1_ps(M[0][1]) * (Tm2v - Tv) + _mm_set1_ps(M[0][2]) * (Tm3v - Tv);
- _mm_storeu_ps( &dst[H - 1][i], Rv );
+ Rv = Tv + F2V(M[0][0]) * (Rv - Tv) + F2V(M[0][1]) * (Tm2v - Tv) + F2V(M[0][2]) * (Tm3v - Tv);
+ STVFU( dst[H - 1][i], Rv );
Tm2v = Bv * Tm2v + b1v * Rv + b2v * temp2W + b3v * temp2Wp1;
- _mm_storeu_ps( &dst[H - 2][i], Tm2v );
+ STVFU( dst[H - 2][i], Tm2v );
Tm3v = Bv * Tm3v + b1v * Tm2v + b2v * Rv + b3v * temp2W;
- _mm_storeu_ps( &dst[H - 3][i], Tm3v );
+ STVFU( dst[H - 3][i], Tm3v );
Tv = Rv;
Rv = Tm3v;
@@ -593,8 +582,8 @@ template SSEFUNCTION void gaussVerticalSse (T** src, T** dst, int W, in
for (int j = H - 4; j >= 0; j--) {
Tv = Rv;
- Rv = _mm_load_ps(&tmp[j][0]) * Bv + Tv * b1v + Tm2v * b2v + Tm3v * b3v;
- _mm_storeu_ps( &dst[j][i], Rv );
+ Rv = LVF(tmp[j][0]) * Bv + Tv * b1v + Tm2v * b2v + Tm3v * b3v;
+ STVFU( dst[j][i], Rv );
Tm3v = Tm2v;
Tm2v = Tv;
}
@@ -635,10 +624,10 @@ template SSEFUNCTION void gaussVerticalSse (T** src, T** dst, int W, in
#endif
-template void gaussVertical (T** src, T** dst, AlignedBufferMP &buffer, int W, int H, double sigma)
+template void gaussVertical (T** src, T** dst, int W, int H, double sigma)
{
-#ifdef __SSE__
+#ifdef __SSE2__
if (sigma < 70) { // bigger sigma only with double precision
gaussVerticalSse (src, dst, W, H, sigma);
@@ -666,7 +655,7 @@ template void gaussVertical (T** src, T** dst, AlignedBufferMP
double csum = 2.0 * c1 + 1.0;
c1 /= csum;
double c0 = 1.0 / csum;
- gaussVertical3 (src, dst, buffer, W, H, c0, c1);
+ gaussVertical3 (src, dst, W, H, c0, c1);
return;
}
@@ -705,7 +694,7 @@ template void gaussVertical (T** src, T** dst, AlignedBufferMP
}
// process 'numcols' columns for better usage of L1 cpu cache (especially faster for large values of H)
- static const int numcols = 4;
+ static const int numcols = 8;
double temp2[H][numcols] ALIGNED16;
double temp2Hm1[numcols], temp2H[numcols], temp2Hp1[numcols];
#ifdef _OPENMP
@@ -732,20 +721,14 @@ template void gaussVertical (T** src, T** dst, AlignedBufferMP
}
for (int k = 0; k < numcols; k++) {
- temp2[H - 1][k] = temp2Hm1[k];
- temp2[H - 2][k] = B * temp2[H - 2][k] + b1 * temp2[H - 1][k] + b2 * temp2H[k] + b3 * temp2Hp1[k];
- temp2[H - 3][k] = B * temp2[H - 3][k] + b1 * temp2[H - 2][k] + b2 * temp2[H - 1][k] + b3 * temp2H[k];
+ dst[H - 1][i + k] = temp2[H - 1][k] = temp2Hm1[k];
+ dst[H - 2][i + k] = temp2[H - 2][k] = B * temp2[H - 2][k] + b1 * temp2[H - 1][k] + b2 * temp2H[k] + b3 * temp2Hp1[k];
+ dst[H - 3][i + k] = temp2[H - 3][k] = B * temp2[H - 3][k] + b1 * temp2[H - 2][k] + b2 * temp2[H - 1][k] + b3 * temp2H[k];
}
for (int j = H - 4; j >= 0; j--) {
for (int k = 0; k < numcols; k++) {
- temp2[j][k] = B * temp2[j][k] + b1 * temp2[j + 1][k] + b2 * temp2[j + 2][k] + b3 * temp2[j + 3][k];
- }
- }
-
- for (int j = 0; j < H; j++) {
- for (int k = 0; k < numcols; k++) {
- dst[j][i + k] = (T)temp2[j][k];
+ dst[j][i + k] = temp2[j][k] = B * temp2[j][k] + b1 * temp2[j + 1][k] + b2 * temp2[j + 2][k] + b3 * temp2[j + 3][k];
}
}
}
@@ -768,241 +751,35 @@ template void gaussVertical (T** src, T** dst, AlignedBufferMP
double temp2H = src[H - 1][i] + M[1][0] * (temp2[H - 1][0] - src[H - 1][i]) + M[1][1] * (temp2[H - 2][0] - src[H - 1][i]) + M[1][2] * (temp2[H - 3][0] - src[H - 1][i]);
double temp2Hp1 = src[H - 1][i] + M[2][0] * (temp2[H - 1][0] - src[H - 1][i]) + M[2][1] * (temp2[H - 2][0] - src[H - 1][i]) + M[2][2] * (temp2[H - 3][0] - src[H - 1][i]);
- temp2[H - 1][0] = temp2Hm1;
- temp2[H - 2][0] = B * temp2[H - 2][0] + b1 * temp2[H - 1][0] + b2 * temp2H + b3 * temp2Hp1;
- temp2[H - 3][0] = B * temp2[H - 3][0] + b1 * temp2[H - 2][0] + b2 * temp2[H - 1][0] + b3 * temp2H;
+ dst[H - 1][i] = temp2[H - 1][0] = temp2Hm1;
+ dst[H - 2][i] = temp2[H - 2][0] = B * temp2[H - 2][0] + b1 * temp2[H - 1][0] + b2 * temp2H + b3 * temp2Hp1;
+ dst[H - 3][i] = temp2[H - 3][0] = B * temp2[H - 3][0] + b1 * temp2[H - 2][0] + b2 * temp2[H - 1][0] + b3 * temp2H;
for (int j = H - 4; j >= 0; j--) {
- temp2[j][0] = B * temp2[j][0] + b1 * temp2[j + 1][0] + b2 * temp2[j + 2][0] + b3 * temp2[j + 3][0];
- }
-
- for (int j = 0; j < H; j++) {
- dst[j][i] = (T)temp2[j][0];
+ dst[j][i] = temp2[j][0] = B * temp2[j][0] + b1 * temp2[j + 1][0] + b2 * temp2[j + 2][0] + b3 * temp2[j + 3][0];
}
}
}
-
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-template void gaussDerivH (T** src, T** dst, AlignedBufferMP &buffer, int W, int H, double sigma)
+template void gaussianBlur(T** src, T** dst, const int W, const int H, const double sigma, bool forceLowSigma = false)
{
+ double newSigma = sigma;
+ if(forceLowSigma) {
+ newSigma /= sqrt(2.0);
- if (sigma < 0.6) {
- // apply symmetric derivative
-#ifdef _OPENMP
- #pragma omp for
-#endif
-
- for (int i = 0; i < H; i++) {
- AlignedBuffer* pBuf = buffer.acquire();
- T* temp = (T*)pBuf->data;
-
- // double* temp = buffer->data;// replaced by 2 lines above
- for (int j = 1; j < W - 1; j++) {
- temp[j] = (0.5 * (src[i][j + 1] - src[i][j - 1]) );
- }
-
- dst[i][0] = (src[i][1] - src[i][0]);
-
- //memcpy (dst[i]+1, temp+1, (W-2)*sizeof(T));
- for (int j = 1; j < W - 1; j++) {
- dst[i][j] = temp[j];
- }
-
- buffer.release(pBuf);
- dst[i][W - 1] = (src[i][W - 1] - src[i][W - 2]);
+ if(newSigma < 0.6) { // barrier to avoid using simple gauss version for higher radius
+ newSigma = sigma;
+ forceLowSigma = false;
}
-
- return;
}
- // coefficient calculation
- double q = 0.98711 * sigma - 0.96330;
+ gaussHorizontal (src, dst, W, H, newSigma);
+ gaussVertical (dst, dst, W, H, newSigma);
- if (sigma < 2.5) {
- q = 3.97156 - 4.14554 * sqrt (1.0 - 0.26891 * sigma);
- }
-
- double b0 = 1.57825 + 2.44413 * q + 1.4281 * q * q + 0.422205 * q * q * q;
- double b1 = 2.44413 * q + 2.85619 * q * q + 1.26661 * q * q * q;
- double b2 = -1.4281 * q * q - 1.26661 * q * q * q;
- double b3 = 0.422205 * q * q * q;
- double B = 1.0 - (b1 + b2 + b3) / b0;
-
- b1 /= b0;
- b2 /= b0;
- b3 /= b0;
-
- // From: Bill Triggs, Michael Sdika: Boundary Conditions for Young-van Vliet Recursive Filtering
- double M[3][3];
- M[0][0] = -b3 * b1 + 1.0 - b3 * b3 - b2;
- M[0][1] = (b3 + b1) * (b2 + b3 * b1);
- M[0][2] = b3 * (b1 + b3 * b2);
- M[1][0] = b1 + b3 * b2;
- M[1][1] = -(b2 - 1.0) * (b2 + b3 * b1);
- M[1][2] = -(b3 * b1 + b3 * b3 + b2 - 1.0) * b3;
- M[2][0] = b3 * b1 + b2 + b1 * b1 - b2 * b2;
- M[2][1] = b1 * b2 + b3 * b2 * b2 - b1 * b3 * b3 - b3 * b3 * b3 - b3 * b2 + b3;
- M[2][2] = b3 * (b1 + b3 * b2);
-
- for (int i = 0; i < 3; i++)
- for (int j = 0; j < 3; j++) {
- M[i][j] /= (1.0 + b1 - b2 + b3) * (1.0 + b2 + (b1 - b3) * b3);
- }
-
- #pragma omp for
-
- for (int i = 0; i < H; i++) {
- AlignedBuffer* pBuf = buffer.acquire();
- T* temp2 = (T*)pBuf->data;
- // double* temp2 = buffer->data;// replaced by 2 lines above
-
- double src0 = (src[i][1] - src[i][0]);
-
- temp2[0] = B * src0 + b1 * src0 + b2 * src0 + b3 * src0;
- temp2[1] = B * 0.5 * (src[i][2] - src[i][0]) + b1 * temp2[0] + b2 * src0 + b3 * src0;
- temp2[2] = B * 0.5 * (src[i][3] - src[i][1]) + b1 * temp2[1] + b2 * temp2[0] + b3 * src0;
-
- for (int j = 3; j < W - 1; j++) {
- temp2[j] = B * 0.5 * (src[i][j + 1] - src[i][j - 1]) + b1 * temp2[j - 1] + b2 * temp2[j - 2] + b3 * temp2[j - 3];
- }
-
- double srcWm1 = (src[i][W - 1] - src[i][W - 2]);
-
- temp2[W - 1] = B * srcWm1 + b1 * temp2[W - 2] + b2 * temp2[W - 3] + b3 * temp2[W - 4];
-
- double temp2Wm1 = srcWm1 + M[0][0] * (temp2[W - 1] - srcWm1) + M[0][1] * (temp2[W - 2] - srcWm1) + M[0][2] * (temp2[W - 3] - srcWm1);
- double temp2W = srcWm1 + M[1][0] * (temp2[W - 1] - srcWm1) + M[1][1] * (temp2[W - 2] - srcWm1) + M[1][2] * (temp2[W - 3] - srcWm1);
- double temp2Wp1 = srcWm1 + M[2][0] * (temp2[W - 1] - srcWm1) + M[2][1] * (temp2[W - 2] - srcWm1) + M[2][2] * (temp2[W - 3] - srcWm1);
-
- temp2[W - 1] = temp2Wm1;
- temp2[W - 2] = B * temp2[W - 2] + b1 * temp2[W - 1] + b2 * temp2W + b3 * temp2Wp1;
- temp2[W - 3] = B * temp2[W - 3] + b1 * temp2[W - 2] + b2 * temp2[W - 1] + b3 * temp2W;
-
- for (int j = W - 4; j >= 0; j--) {
- temp2[j] = B * temp2[j] + b1 * temp2[j + 1] + b2 * temp2[j + 2] + b3 * temp2[j + 3];
- }
-
- for (int j = 0; j < W; j++) {
- dst[i][j] = (T)temp2[j];
- }
-
- buffer.release(pBuf);
- }
-}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-template void gaussDerivV (T** src, T** dst, AlignedBufferMP &buffer, int W, int H, double sigma)
-{
-
- if (sigma < 0.6) {
- // apply symmetric derivative
-#ifdef _OPENMP
- #pragma omp for
-#endif
-
- for (int j = 0; j < W; j++) {
- AlignedBuffer* pBuf = buffer.acquire();
- T* temp = (T*)pBuf->data;
-
- // double* temp = buffer->data;// replaced by 2 lines above
- for (int i = 1; i < H - 1; i++) {
- temp[i] = (0.5 * (src[i + 1][j] - src[i - 1][j]) );
- }
-
- dst[0][j] = (src[1][j] - src[0][j]);
-
- for (int i = 1; i < H - 1; i++) {
- dst[i][j] = temp[i];
- }
-
- buffer.release(pBuf);
-
- dst[H - 1][j] = (src[H - 1][j] - src[H - 2][j]);
- }
-
- return;
- }
-
- // coefficient calculation
- double q = 0.98711 * sigma - 0.96330;
-
- if (sigma < 2.5) {
- q = 3.97156 - 4.14554 * sqrt (1.0 - 0.26891 * sigma);
- }
-
- double b0 = 1.57825 + 2.44413 * q + 1.4281 * q * q + 0.422205 * q * q * q;
- double b1 = 2.44413 * q + 2.85619 * q * q + 1.26661 * q * q * q;
- double b2 = -1.4281 * q * q - 1.26661 * q * q * q;
- double b3 = 0.422205 * q * q * q;
- double B = 1.0 - (b1 + b2 + b3) / b0;
-
- b1 /= b0;
- b2 /= b0;
- b3 /= b0;
-
- // From: Bill Triggs, Michael Sdika: Boundary Conditions for Young-van Vliet Recursive Filtering
- double M[3][3];
- M[0][0] = -b3 * b1 + 1.0 - b3 * b3 - b2;
- M[0][1] = (b3 + b1) * (b2 + b3 * b1);
- M[0][2] = b3 * (b1 + b3 * b2);
- M[1][0] = b1 + b3 * b2;
- M[1][1] = -(b2 - 1.0) * (b2 + b3 * b1);
- M[1][2] = -(b3 * b1 + b3 * b3 + b2 - 1.0) * b3;
- M[2][0] = b3 * b1 + b2 + b1 * b1 - b2 * b2;
- M[2][1] = b1 * b2 + b3 * b2 * b2 - b1 * b3 * b3 - b3 * b3 * b3 - b3 * b2 + b3;
- M[2][2] = b3 * (b1 + b3 * b2);
-
- for (int i = 0; i < 3; i++)
- for (int j = 0; j < 3; j++) {
- M[i][j] /= (1.0 + b1 - b2 + b3) * (1.0 + b2 + (b1 - b3) * b3);
- }
-
-#ifdef _OPENMP
- #pragma omp for
-#endif
-
- for (int i = 0; i < W; i++) {
- AlignedBuffer* pBuf = buffer.acquire();
- T* temp2 = (T*)pBuf->data;
- // double* temp2 = buffer->data;// replaced by 2 lines above
-
- double src0 = 0.5 * (src[1][i] - src[0][i]);
-
- temp2[0] = B * src0 + b1 * src0 + b2 * src0 + b3 * src0;
- temp2[1] = B * 0.5 * (src[2][i] - src[0][i]) + b1 * temp2[0] + b2 * src0 + b3 * src0;
- temp2[2] = B * 0.5 * (src[3][i] - src[1][i]) + b1 * temp2[1] + b2 * temp2[0] + b3 * src0;
-
- for (int j = 3; j < H - 1; j++) {
- temp2[j] = B * 0.5 * (src[j + 1][i] - src[j - 1][i]) + b1 * temp2[j - 1] + b2 * temp2[j - 2] + b3 * temp2[j - 3];
- }
-
- double srcHm1 = 0.5 * (src[H - 1][i] - src[H - 2][i]);
-
- temp2[H - 1] = B * srcHm1 + b1 * temp2[H - 2] + b2 * temp2[H - 3] + b3 * temp2[H - 4];
-
- double temp2Hm1 = srcHm1 + M[0][0] * (temp2[H - 1] - srcHm1) + M[0][1] * (temp2[H - 2] - srcHm1) + M[0][2] * (temp2[H - 3] - srcHm1);
- double temp2H = srcHm1 + M[1][0] * (temp2[H - 1] - srcHm1) + M[1][1] * (temp2[H - 2] - srcHm1) + M[1][2] * (temp2[H - 3] - srcHm1);
- double temp2Hp1 = srcHm1 + M[2][0] * (temp2[H - 1] - srcHm1) + M[2][1] * (temp2[H - 2] - srcHm1) + M[2][2] * (temp2[H - 3] - srcHm1);
-
- temp2[H - 1] = temp2Hm1;
- temp2[H - 2] = B * temp2[H - 2] + b1 * temp2[H - 1] + b2 * temp2H + b3 * temp2Hp1;
- temp2[H - 3] = B * temp2[H - 3] + b1 * temp2[H - 2] + b2 * temp2[H - 1] + b3 * temp2H;
-
- for (int j = H - 4; j >= 0; j--) {
- temp2[j] = B * temp2[j] + b1 * temp2[j + 1] + b2 * temp2[j + 2] + b3 * temp2[j + 3];
- }
-
- for (int j = 0; j < H; j++) {
- dst[j][i] = (T)temp2[j];
- }
-
- buffer.release(pBuf);
+ if(forceLowSigma) {
+ gaussHorizontal (dst, dst, W, H, newSigma);
+ gaussVertical (dst, dst, W, H, newSigma);
}
}
diff --git a/rtengine/helpersse2.h b/rtengine/helpersse2.h
index c7dce8806..9257ab81e 100644
--- a/rtengine/helpersse2.h
+++ b/rtengine/helpersse2.h
@@ -22,19 +22,22 @@ typedef __m128i vint2;
//
#ifdef __GNUC__
- #if (__GNUC__ == 4 && __GNUC_MINOR__ >= 9) || __GNUC__ > 4
- #define LVF(x) _mm_load_ps(&x)
- #define LVFU(x) _mm_loadu_ps(&x)
- #define STVF(x,y) _mm_store_ps(&x,y)
- #else // there is a bug in gcc 4.7.x when using openmp and aligned memory and -O3
- #define LVF(x) _mm_loadu_ps(&x)
- #define LVFU(x) _mm_loadu_ps(&x)
- #define STVF(x,y) _mm_storeu_ps(&x,y)
- #endif
+#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 9) || __GNUC__ > 4
+#define LVF(x) _mm_load_ps(&x)
+#define LVFU(x) _mm_loadu_ps(&x)
+#define STVF(x,y) _mm_store_ps(&x,y)
+#define STVFU(x,y) _mm_storeu_ps(&x,y)
+#else // there is a bug in gcc 4.7.x when using openmp and aligned memory and -O3
+#define LVF(x) _mm_loadu_ps(&x)
+#define LVFU(x) _mm_loadu_ps(&x)
+#define STVF(x,y) _mm_storeu_ps(&x,y)
+#define STVFU(x,y) _mm_storeu_ps(&x,y)
+#endif
#else
- #define LVF(x) _mm_load_ps(&x)
- #define LVFU(x) _mm_loadu_ps(&x)
- #define STVF(x,y) _mm_store_ps(&x,y)
+#define LVF(x) _mm_load_ps(&x)
+#define LVFU(x) _mm_loadu_ps(&x)
+#define STVF(x,y) _mm_store_ps(&x,y)
+#define STVFU(x,y) _mm_storeu_ps(&x,y)
#endif
// Load 8 floats from a and combine a[0],a[2],a[4] and a[6] into a vector of 4 floats
diff --git a/rtengine/hilite_recon.cc b/rtengine/hilite_recon.cc
index 411bb0823..9f618ace5 100644
--- a/rtengine/hilite_recon.cc
+++ b/rtengine/hilite_recon.cc
@@ -28,26 +28,15 @@
#include "rawimagesource.h"
#include "rt_math.h"
#include "opthelper.h"
-
-#ifdef _OPENMP
-#include
-#endif
-
-
-#define FOREACHCOLOR for (int c=0; c < ColorCount; c++)
-
-//#include "RGBdefringe.cc"
-
namespace rtengine
{
+extern const Settings* settings;
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-SSEFUNCTION void RawImageSource::boxblur2(float** src, float** dst, int H, int W, int box )
+SSEFUNCTION void RawImageSource::boxblur2(float** src, float** dst, float** temp, int H, int W, int box )
{
- array2D temp(W, H);
-
//box blur image channel; box size = 2*box+1
//horizontal blur
#ifdef _OPENMP
@@ -84,10 +73,10 @@ SSEFUNCTION void RawImageSource::boxblur2(float** src, float** dst, int H, int W
#endif
{
float len = box + 1;
- __m128 lenv = _mm_set1_ps( len );
- __m128 lenp1v = _mm_set1_ps( len + 1.0f );
- __m128 onev = _mm_set1_ps( 1.0f );
- __m128 tempv, temp2v;
+ vfloat lenv = F2V( len );
+ vfloat lenp1v = F2V( len + 1.0f );
+ vfloat onev = F2V( 1.0f );
+ vfloat tempv, temp2v;
#ifdef _OPENMP
#pragma omp for nowait
#endif
@@ -130,7 +119,9 @@ SSEFUNCTION void RawImageSource::boxblur2(float** src, float** dst, int H, int W
}
}
+#ifdef _OPENMP
#pragma omp single
+#endif
{
for (int col = W - (W % 8); col < W - 3; col += 4) {
tempv = LVFU(temp[0][col]) / lenv;
@@ -160,29 +151,29 @@ SSEFUNCTION void RawImageSource::boxblur2(float** src, float** dst, int H, int W
_mm_storeu_ps( &dst[row][col], tempv );
}
}
- }
- }
- for (int col = W - (W % 4); col < W; col++) {
- int len = box + 1;
- dst[0][col] = temp[0][col] / len;
+ for (int col = W - (W % 4); col < W; col++) {
+ int len = box + 1;
+ dst[0][col] = temp[0][col] / len;
- for (int i = 1; i <= box; i++) {
- dst[0][col] += temp[i][col] / len;
- }
+ for (int i = 1; i <= box; i++) {
+ dst[0][col] += temp[i][col] / len;
+ }
- for (int row = 1; row <= box; row++) {
- dst[row][col] = (dst[(row - 1)][col] * len + temp[(row + box)][col]) / (len + 1);
- len ++;
- }
+ for (int row = 1; row <= box; row++) {
+ dst[row][col] = (dst[(row - 1)][col] * len + temp[(row + box)][col]) / (len + 1);
+ len ++;
+ }
- for (int row = box + 1; row < H - box; row++) {
- dst[row][col] = dst[(row - 1)][col] + (temp[(row + box)][col] - temp[(row - box - 1)][col]) / len;
- }
+ for (int row = box + 1; row < H - box; row++) {
+ dst[row][col] = dst[(row - 1)][col] + (temp[(row + box)][col] - temp[(row - box - 1)][col]) / len;
+ }
- for (int row = H - box; row < H; row++) {
- dst[row][col] = (dst[(row - 1)][col] * len - temp[(row - box - 1)][col]) / (len - 1);
- len --;
+ for (int row = H - box; row < H; row++) {
+ dst[row][col] = (dst[(row - 1)][col] * len - temp[(row - box - 1)][col]) / (len - 1);
+ len --;
+ }
+ }
}
}
@@ -219,11 +210,9 @@ SSEFUNCTION void RawImageSource::boxblur2(float** src, float** dst, int H, int W
}
-void RawImageSource::boxblur_resamp(float **src, float **dst, int H, int W, int box, int samp )
+void RawImageSource::boxblur_resamp(float **src, float **dst, float ** temp, int H, int W, int box, int samp )
{
- array2D temp((W / samp) + ((W % samp) == 0 ? 0 : 1), H);
-
#ifdef _OPENMP
#pragma omp parallel
#endif
@@ -235,7 +224,8 @@ void RawImageSource::boxblur_resamp(float **src, float **dst, int H, int W, int
//box blur image channel; box size = 2*box+1
//horizontal blur
- for (int row = 0; row < H; row++) {
+ for (int row = 0; row < H; row++)
+ {
int len = box + 1;
tempval = src[row][0] / len;
@@ -255,8 +245,10 @@ void RawImageSource::boxblur_resamp(float **src, float **dst, int H, int W, int
len ++;
}
+ float oneByLen = 1.f / (float)len;
+
for (int col = box + 1; col < W - box; col++) {
- tempval = tempval + (src[row][col + box] - src[row][col - box - 1]) / len;
+ tempval = tempval + (src[row][col + box] - src[row][col - box - 1]) * oneByLen;
if(col % samp == 0) {
temp[row][col / samp] = tempval;
@@ -275,63 +267,125 @@ void RawImageSource::boxblur_resamp(float **src, float **dst, int H, int W, int
}
}
+ static const int numCols = 8; // process numCols columns at once for better L1 CPU cache usage
#ifdef _OPENMP
#pragma omp parallel
#endif
{
- float tempval;
+ float tempvalN[numCols] ALIGNED16;
#ifdef _OPENMP
- #pragma omp for
+ #pragma omp for nowait
#endif
//vertical blur
- for (int col = 0; col < W / samp; col++) {
+ for (int col = 0; col < (W / samp) - (numCols - 1); col += numCols) {
int len = box + 1;
- tempval = temp[0][col] / len;
- for (int i = 1; i <= box; i++) {
- tempval += temp[i][col] / len;
+ for(int n = 0; n < numCols; n++) {
+ tempvalN[n] = temp[0][col + n] / len;
}
- dst[0][col] = tempval;
+ for (int i = 1; i <= box; i++) {
+ for(int n = 0; n < numCols; n++) {
+ tempvalN[n] += temp[i][col + n] / len;
+ }
+ }
+
+ for(int n = 0; n < numCols; n++) {
+ dst[0][col + n] = tempvalN[n];
+ }
for (int row = 1; row <= box; row++) {
- tempval = (tempval * len + temp[(row + box)][col]) / (len + 1);
+ for(int n = 0; n < numCols; n++) {
+ tempvalN[n] = (tempvalN[n] * len + temp[(row + box)][col + n]) / (len + 1);
+ }
if(row % samp == 0) {
- dst[row / samp][col] = tempval;
+ for(int n = 0; n < numCols; n++) {
+ dst[row / samp][col + n] = tempvalN[n];
+ }
}
len ++;
}
for (int row = box + 1; row < H - box; row++) {
- tempval = tempval + (temp[(row + box)][col] - temp[(row - box - 1)][col]) / len;
+ for(int n = 0; n < numCols; n++) {
+ tempvalN[n] = tempvalN[n] + (temp[(row + box)][col + n] - temp[(row - box - 1)][col + n]) / len;
+ }
if(row % samp == 0) {
- dst[row / samp][col] = tempval;
+ for(int n = 0; n < numCols; n++) {
+ dst[row / samp][col + n] = tempvalN[n];
+ }
}
}
for (int row = H - box; row < H; row++) {
- tempval = (tempval * len - temp[(row - box - 1)][col]) / (len - 1);
+ for(int n = 0; n < numCols; n++) {
+ tempvalN[n] = (tempvalN[n] * len - temp[(row - box - 1)][col + n]) / (len - 1);
+ }
if(row % samp == 0) {
- dst[row / samp][col] = tempval;
+ for(int n = 0; n < numCols; n++) {
+ dst[row / samp][col + n] = tempvalN[n];
+ }
}
len --;
}
}
+
+ // process remaining columns
+ #pragma omp single
+ {
+ float tempval;
+
+ //vertical blur
+ for (int col = (W / samp) - ((W / samp) % numCols); col < W / samp; col++) {
+ int len = box + 1;
+ tempval = temp[0][col] / len;
+
+ for (int i = 1; i <= box; i++) {
+ tempval += temp[i][col] / len;
+ }
+
+ dst[0][col] = tempval;
+
+ for (int row = 1; row <= box; row++) {
+ tempval = (tempval * len + temp[(row + box)][col]) / (len + 1);
+
+ if(row % samp == 0) {
+ dst[row / samp][col] = tempval;
+ }
+
+ len ++;
+ }
+
+ for (int row = box + 1; row < H - box; row++) {
+ tempval = tempval + (temp[(row + box)][col] - temp[(row - box - 1)][col]) / len;
+
+ if(row % samp == 0) {
+ dst[row / samp][col] = tempval;
+ }
+ }
+
+ for (int row = H - box; row < H; row++) {
+ tempval = (tempval * len - temp[(row - box - 1)][col]) / (len - 1);
+
+ if(row % samp == 0) {
+ dst[row / samp][col] = tempval;
+ }
+
+ len --;
+ }
+ }
+ }
}
}
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** blue)
{
double progress = 0.0;
@@ -344,119 +398,143 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b
int height = H;
int width = W;
- const int range = 2;
- const int pitch = 4;
-
-
- int hfh = (height - (height % pitch)) / pitch;
- int hfw = (width - (width % pitch)) / pitch;
+ static const int range = 2;
+ static const int pitch = 4;
static const int numdirs = 4;
- static const float threshpct = 0.25;
- static const float fixthreshpct = 0.7;
- static const float maxpct = 0.95;
-
+ static const float threshpct = 0.25f;
+ static const float fixthreshpct = 0.7f;
+ static const float maxpct = 0.95f;
+ static const float epsilon = 0.00001f;
//%%%%%%%%%%%%%%%%%%%%
//for blend algorithm:
static const float blendthresh = 1.0;
- const int ColorCount = 3;
+ static const int ColorCount = 3;
// Transform matrixes rgb>lab and back
- static const float trans[2][ColorCount][ColorCount] = {
- { { 1, 1, 1 }, { 1.7320508, -1.7320508, 0 }, { -1, -1, 2 } },
- { { 1, 1, 1 }, { 1, -1, 1 }, { 1, 1, -1 } }
- };
- static const float itrans[2][ColorCount][ColorCount] = {
- { { 1, 0.8660254, -0.5 }, { 1, -0.8660254, -0.5 }, { 1, 0, 1 } },
- { { 1, 1, 1 }, { 1, -1, 1 }, { 1, 1, -1 } }
- };
- //%%%%%%%%%%%%%%%%%%%%
+ static const float trans[ColorCount][ColorCount] =
+ { { 1.f, 1.f, 1.f }, { 1.7320508f, -1.7320508f, 0.f }, { -1.f, -1.f, 2.f } };
+ static const float itrans[ColorCount][ColorCount] =
+ { { 1.f, 0.8660254f, -0.5f }, { 1.f, -0.8660254f, -0.5f }, { 1.f, 0.f, 1.f } };
-
- float max_f[3], thresh[3], fixthresh[3], norm[3];
-
- //float red1, green1, blue1;//diagnostic
-// float chmaxalt[4]={0,0,0,0};//diagnostic
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- //halfsize demosaic
-
- /*
- multi_array2D hfsize (hfw+1,hfh+1,ARRAY2D_CLEAR_DATA);
-
- boxblur_resamp(red,hfsize[0],chmaxalt[0],height,width,range,pitch);
- if(plistener){
- progress += 0.05;
- plistener->setProgress(progress);
- }
- boxblur_resamp(green,hfsize[1],chmaxalt[1],height,width,range,pitch);
- if(plistener){
- progress += 0.05;
- plistener->setProgress(progress);
- }
- boxblur_resamp(blue,hfsize[2],chmaxalt[2],height,width,range,pitch);
- if(plistener){
- progress += 0.05;
- plistener->setProgress(progress);
+ if(settings->verbose)
+ for(int c = 0; c < 3; c++) {
+ printf("chmax[%d] : %f\tclmax[%d] : %f\tratio[%d] : %f\n", c, chmax[c], c, clmax[c], c, chmax[c] / clmax[c]);
}
- //blur image
- //for (int m=0; m<3; m++)
- // boxblur2(hfsize[m],hfsizeblur[m],hfh,hfw,3);
+ float factor[3];
- */
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ for(int c = 0; c < ColorCount; c++) {
+ factor[c] = chmax[c] / clmax[c];
+ }
- for (int c = 0; c < 3; c++) {
- thresh[c] = chmax[c] * threshpct;
- fixthresh[c] = chmax[c] * fixthreshpct;
- max_f[c] = chmax[c] * maxpct; //min(chmax[0],chmax[1],chmax[2])*maxpct;
- norm[c] = 1.0 / (max_f[c] - fixthresh[c]);
+ float minFactor = min(factor[0], factor[1], factor[2]);
+
+ if(minFactor > 1.f) { // all 3 channels clipped
+ // calculate clip factor per channel
+ for (int c = 0; c < ColorCount; c++) {
+ factor[c] /= minFactor;
+ }
+
+ // get max clip factor
+ int maxpos = 0;
+ float maxValNew = 0.f;
+
+ for (int c = 0; c < ColorCount; c++) {
+ if(chmax[c] / factor[c] > maxValNew) {
+ maxValNew = chmax[c] / factor[c];
+ maxpos = c;
+ }
+ }
+
+ float clipFactor = clmax[maxpos] / maxValNew;
+
+ if(clipFactor < maxpct)
+
+ // if max clipFactor < maxpct (0.95) adjust per channel factors
+ for (int c = 0; c < ColorCount; c++) {
+ factor[c] *= (maxpct / clipFactor);
+ }
+ } else {
+ factor[0] = factor[1] = factor[2] = 1.f;
+ }
+
+ if(settings->verbose)
+ for (int c = 0; c < ColorCount; c++) {
+ printf("correction factor[%d] : %f\n", c, factor[c]);
+ }
+
+ float max_f[3], thresh[3];
+
+ for (int c = 0; c < ColorCount; c++) {
+ thresh[c] = chmax[c] * threshpct / factor[c];
+ max_f[c] = chmax[c] * maxpct / factor[c];
}
float whitept = max(max_f[0], max_f[1], max_f[2]);
float clippt = min(max_f[0], max_f[1], max_f[2]);
float medpt = max_f[0] + max_f[1] + max_f[2] - whitept - clippt;
float blendpt = blendthresh * clippt;
+ float medFactor[3];
- float camwb[4];
-
- for (int c = 0; c < 4; c++) {
- camwb[c] = ri->get_cam_mul(c);
+ for (int c = 0; c < ColorCount; c++) {
+ medFactor[c] = max(1.0f, max_f[c] / medpt) / (-blendpt);
}
- multi_array2D channelblur(width, height, ARRAY2D_CLEAR_DATA);
- multi_array2D hilite_full(width, height, ARRAY2D_CLEAR_DATA);
-
- if(plistener) {
- progress += 0.05;
- plistener->setProgress(progress);
- }
+ multi_array2D channelblur(width, height, 0, 48);
+ array2D temp(width, height); // allocate temporary buffer
// blur RGB channels
- boxblur2(red , channelblur[0], height, width, 4);
+
+ boxblur2(red, channelblur[0], temp, height, width, 4);
if(plistener) {
progress += 0.05;
plistener->setProgress(progress);
}
- boxblur2(green, channelblur[1], height, width, 4);
+ boxblur2(green, channelblur[1], temp, height, width, 4);
if(plistener) {
progress += 0.05;
plistener->setProgress(progress);
}
- boxblur2(blue , channelblur[2], height, width, 4);
+ boxblur2(blue, channelblur[2], temp, height, width, 4);
if(plistener) {
progress += 0.05;
plistener->setProgress(progress);
}
- float hipass_sum = 0, hipass_norm = 0.00;
+ // reduce channel blur to one array
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+
+ for(int i = 0; i < height; i++)
+ for(int j = 0; j < width; j++) {
+ channelblur[0][i][j] = fabsf(channelblur[0][i][j] - red[i][j]) + fabsf(channelblur[1][i][j] - green[i][j]) + fabsf(channelblur[2][i][j] - blue[i][j]);
+ }
+
+ for (int c = 1; c < 3; c++) {
+ channelblur[c].free(); //free up some memory
+ }
+
+ if(plistener) {
+ progress += 0.05;
+ plistener->setProgress(progress);
+ }
+
+ multi_array2D hilite_full(width, height, ARRAY2D_CLEAR_DATA, 32);
+
+ if(plistener) {
+ progress += 0.10;
+ plistener->setProgress(progress);
+ }
+
+ double hipass_sum = 0.f;
+ int hipass_norm = 0;
// set up which pixels are clipped or near clipping
#ifdef _OPENMP
@@ -465,40 +543,35 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
-
//if one or more channels is highlight but none are blown, add to highlight accumulator
-
if ((red[i][j] > thresh[0] || green[i][j] > thresh[1] || blue[i][j] > thresh[2]) &&
(red[i][j] < max_f[0] && green[i][j] < max_f[1] && blue[i][j] < max_f[2])) {
- hipass_sum += fabs(channelblur[0][i][j] - red[i][j]) + fabs(channelblur[1][i][j] - green[i][j]) + fabs(channelblur[2][i][j] - blue[i][j]);
- hipass_norm++;
+ hipass_sum += channelblur[0][i][j];
+ hipass_norm ++;
hilite_full[0][i][j] = red[i][j];
hilite_full[1][i][j] = green[i][j];
hilite_full[2][i][j] = blue[i][j];
- hilite_full[3][i][j] = 1;
- hilite_full[4][i][j] = 1;
+ hilite_full[3][i][j] = 1.f;
}
-
- //if (i%100==0 && j%100==0)
- // printf("row=%d col=%d r=%f g=%f b=%f hilite=%f \n",i,j,hilite_full[0][i][j],hilite_full[1][i][j],hilite_full[2][i][j],hilite_full[3][i][j]);
}
}//end of filling highlight array
- hipass_norm += 0.01;
-
- float hipass_ave = (hipass_sum / hipass_norm);
+ float hipass_ave = 2.f * hipass_sum / (hipass_norm + epsilon);
if(plistener) {
progress += 0.05;
plistener->setProgress(progress);
}
+ array2D hilite_full4(width, height);
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//blur highlight data
- boxblur2(hilite_full[4], hilite_full[4], height, width, 1);
+ boxblur2(hilite_full[3], hilite_full4, temp, height, width, 1);
+
+ temp.free(); // free temporary buffer
if(plistener) {
progress += 0.05;
@@ -511,32 +584,34 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
-
- float hipass = fabs(channelblur[0][i][j] - red[i][j]) + fabs(channelblur[1][i][j] - green[i][j]) + fabs(channelblur[2][i][j] - blue[i][j]);
-
- if (hipass > 2 * hipass_ave) {
+ if (channelblur[0][i][j] > hipass_ave) {
//too much variation
- hilite_full[0][i][j] = hilite_full[1][i][j] = hilite_full[2][i][j] = hilite_full[3][i][j] = 0;
+ hilite_full[0][i][j] = hilite_full[1][i][j] = hilite_full[2][i][j] = hilite_full[3][i][j] = 0.f;
continue;
}
- if (hilite_full[4][i][j] > 0.00001 && hilite_full[4][i][j] < 0.95) {
+ if (hilite_full4[i][j] > epsilon && hilite_full4[i][j] < 0.95f) {
//too near an edge, could risk using CA affected pixels, therefore omit
- hilite_full[0][i][j] = hilite_full[1][i][j] = hilite_full[2][i][j] = hilite_full[3][i][j] = 0;
+ hilite_full[0][i][j] = hilite_full[1][i][j] = hilite_full[2][i][j] = hilite_full[3][i][j] = 0.f;
}
}
}
- for (int c = 0; c < 3; c++) {
- channelblur[c](1, 1); //free up some memory
- }
+ channelblur[0].free(); //free up some memory
+ hilite_full4.free(); //free up some memory
- multi_array2D hilite(hfw + 1, hfh + 1, ARRAY2D_CLEAR_DATA);
+ int hfh = (height - (height % pitch)) / pitch;
+ int hfw = (width - (width % pitch)) / pitch;
+
+ multi_array2D hilite(hfw + 1, hfh + 1, ARRAY2D_CLEAR_DATA, 48);
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// blur and resample highlight data; range=size of blur, pitch=sample spacing
+
+ array2D temp2((width / pitch) + ((width % pitch) == 0 ? 0 : 1), height);
+
for (int m = 0; m < 4; m++) {
- boxblur_resamp(hilite_full[m], hilite[m], height, width, range, pitch);
+ boxblur_resamp(hilite_full[m], hilite[m], temp2, height, width, range, pitch);
if(plistener) {
progress += 0.05;
@@ -544,101 +619,228 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b
}
}
- for (int c = 0; c < 5; c++) {
- hilite_full[c](1, 1); //free up some memory
+ temp2.free();
+
+ for (int c = 0; c < 4; c++) {
+ hilite_full[c].free(); //free up some memory
}
- multi_array2D hilite_dir(hfw, hfh, ARRAY2D_CLEAR_DATA);
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- //blur highlights
- //for (int m=0; m<4; m++)
- // boxblur2(hilite[m],hilite[m],hfh,hfw,4);
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ multi_array2D hilite_dir(hfw, hfh, ARRAY2D_CLEAR_DATA, 64);
+ // for faster processing we create two buffers using (height,width) instead of (width,height)
+ multi_array2D hilite_dir0(hfh, hfw, ARRAY2D_CLEAR_DATA, 64);
+ multi_array2D hilite_dir4(hfh, hfw, ARRAY2D_CLEAR_DATA, 64);
if(plistener) {
progress += 0.05;
plistener->setProgress(progress);
}
- LUTf invfn(0x10000);
-
- for (int i = 0; i < 0x10000; i++) {
- invfn[i] = 1.0 / (1.0 + i);
- }
-
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
//fill gaps in highlight map by directional extension
//raster scan from four corners
- for (int j = 1; j < hfw - 1; j++)
+ for (int j = 1; j < hfw - 1; j++) {
for (int i = 2; i < hfh - 2; i++) {
//from left
- if (hilite[3][i][j] > 0.01) {
- for (int c = 0; c < 4; c++) {
- hilite_dir[c][i][j] = hilite[c][i][j] / hilite[3][i][j];
- }
+ if (hilite[3][i][j] > epsilon) {
+ hilite_dir0[3][j][i] = 1.f;
} else {
- for (int c = 0; c < 4; c++) {
- hilite_dir[c][i][j] = 0.1 * ((hilite_dir[0 + c][i - 2][j - 1] + hilite_dir[0 + c][i - 1][j - 1] + hilite_dir[0 + c][i][j - 1] + hilite_dir[0 + c][i + 1][j - 1] + hilite_dir[0 + c][i + 2][j - 1]) /
- (hilite_dir[0 + 3][i - 2][j - 1] + hilite_dir[0 + 3][i - 1][j - 1] + hilite_dir[0 + 3][i][j - 1] + hilite_dir[0 + 3][i + 1][j - 1] + hilite_dir[0 + 3][i + 2][j - 1] + 0.00001));
- hilite_dir[4 + c][i][j + 1] += hilite_dir[c][i][j];
- hilite_dir[8 + c][i - 2][j] += hilite_dir[c][i][j];
- hilite_dir[12 + c][i + 2][j] += hilite_dir[c][i][j];
- }
+ hilite_dir0[3][j][i] = (hilite_dir0[0 + 3][j - 1][i - 2] + hilite_dir0[0 + 3][j - 1][i - 1] + hilite_dir0[0 + 3][j - 1][i] + hilite_dir0[0 + 3][j - 1][i + 1] + hilite_dir0[0 + 3][j - 1][i + 2]) == 0.f ? 0.f : 0.1f;
}
}
+ if(hilite[3][2][j] <= epsilon) {
+ hilite_dir[0 + 3][0][j] = hilite_dir0[3][j][2];
+ }
+
+ if(hilite[3][3][j] <= epsilon) {
+ hilite_dir[0 + 3][1][j] = hilite_dir0[3][j][3];
+ }
+
+ if(hilite[3][hfh - 3][j] <= epsilon) {
+ hilite_dir[4 + 3][hfh - 1][j] = hilite_dir0[3][j][hfh - 3];
+ }
+
+ if(hilite[3][hfh - 4][j] <= epsilon) {
+ hilite_dir[4 + 3][hfh - 2][j] = hilite_dir0[3][j][hfh - 4];
+ }
+ }
+
+ for (int i = 2; i < hfh - 2; i++) {
+ if(hilite[3][i][hfw - 2] <= epsilon) {
+ hilite_dir4[3][hfw - 1][i] = hilite_dir0[3][hfw - 2][i];
+ }
+ }
+
+
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+
+ for (int c = 0; c < 3; c++) {
+ for (int j = 1; j < hfw - 1; j++) {
+ for (int i = 2; i < hfh - 2; i++) {
+ //from left
+ if (hilite[3][i][j] > epsilon) {
+ hilite_dir0[c][j][i] = hilite[c][i][j] / hilite[3][i][j];
+ } else {
+ hilite_dir0[c][j][i] = 0.1f * ((hilite_dir0[0 + c][j - 1][i - 2] + hilite_dir0[0 + c][j - 1][i - 1] + hilite_dir0[0 + c][j - 1][i] + hilite_dir0[0 + c][j - 1][i + 1] + hilite_dir0[0 + c][j - 1][i + 2]) /
+ (hilite_dir0[0 + 3][j - 1][i - 2] + hilite_dir0[0 + 3][j - 1][i - 1] + hilite_dir0[0 + 3][j - 1][i] + hilite_dir0[0 + 3][j - 1][i + 1] + hilite_dir0[0 + 3][j - 1][i + 2] + epsilon));
+ }
+ }
+
+ if(hilite[3][2][j] <= epsilon) {
+ hilite_dir[0 + c][0][j] = hilite_dir0[c][j][2];
+ }
+
+ if(hilite[3][3][j] <= epsilon) {
+ hilite_dir[0 + c][1][j] = hilite_dir0[c][j][3];
+ }
+
+ if(hilite[3][hfh - 3][j] <= epsilon) {
+ hilite_dir[4 + c][hfh - 1][j] = hilite_dir0[c][j][hfh - 3];
+ }
+
+ if(hilite[3][hfh - 4][j] <= epsilon) {
+ hilite_dir[4 + c][hfh - 2][j] = hilite_dir0[c][j][hfh - 4];
+ }
+ }
+
+ for (int i = 2; i < hfh - 2; i++) {
+ if(hilite[3][i][hfw - 2] <= epsilon) {
+ hilite_dir4[c][hfw - 1][i] = hilite_dir0[c][hfw - 2][i];
+ }
+ }
+ }
+
if(plistener) {
progress += 0.05;
plistener->setProgress(progress);
}
- for (int j = hfw - 2; j > 0; j--)
+ for (int j = hfw - 2; j > 0; j--) {
for (int i = 2; i < hfh - 2; i++) {
//from right
- if (hilite[3][i][j] > 0.01) {
- for (int c = 0; c < 4; c++) {
- hilite_dir[4 + c][i][j] = hilite[c][i][j] / hilite[3][i][j];
- }
+ if (hilite[3][i][j] > epsilon) {
+ hilite_dir4[3][j][i] = 1.f;
} else {
- for (int c = 0; c < 4; c++) {
- hilite_dir[4 + c][i][j] = 0.1 * ((hilite_dir[4 + c][(i - 2)][(j + 1)] + hilite_dir[4 + c][(i - 1)][(j + 1)] + hilite_dir[4 + c][(i)][(j + 1)] + hilite_dir[4 + c][(i + 1)][(j + 1)] + hilite_dir[4 + c][(i + 2)][(j + 1)]) /
- (hilite_dir[4 + 3][(i - 2)][(j + 1)] + hilite_dir[4 + 3][(i - 1)][(j + 1)] + hilite_dir[4 + 3][(i)][(j + 1)] + hilite_dir[4 + 3][(i + 1)][(j + 1)] + hilite_dir[4 + 3][(i + 2)][(j + 1)] + 0.00001));
- hilite_dir[8 + c][i - 2][j] += hilite_dir[4 + c][i][j];
- hilite_dir[12 + c][i + 2][j] += hilite_dir[4 + c][i][j];
- }
+ hilite_dir4[3][j][i] = (hilite_dir4[3][(j + 1)][(i - 2)] + hilite_dir4[3][(j + 1)][(i - 1)] + hilite_dir4[3][(j + 1)][(i)] + hilite_dir4[3][(j + 1)][(i + 1)] + hilite_dir4[3][(j + 1)][(i + 2)]) == 0.f ? 0.f : 0.1f;
}
}
+ if(hilite[3][2][j] <= epsilon) {
+ hilite_dir[0 + 3][0][j] += hilite_dir4[3][j][2];
+ }
+
+ if(hilite[3][hfh - 3][j] <= epsilon) {
+ hilite_dir[4 + 3][hfh - 1][j] += hilite_dir4[3][j][hfh - 3];
+ }
+ }
+
+ for (int i = 2; i < hfh - 2; i++) {
+ if(hilite[3][i][0] <= epsilon) {
+ hilite_dir[0 + 3][i - 2][0] += hilite_dir4[3][0][i];
+ hilite_dir[4 + 3][i + 2][0] += hilite_dir4[3][0][i];
+ }
+
+ if(hilite[3][i][1] <= epsilon) {
+ hilite_dir[0 + 3][i - 2][1] += hilite_dir4[3][1][i];
+ hilite_dir[4 + 3][i + 2][1] += hilite_dir4[3][1][i];
+ }
+
+ if(hilite[3][i][hfw - 2] <= epsilon) {
+ hilite_dir[0 + 3][i - 2][hfw - 2] += hilite_dir4[3][hfw - 2][i];
+ hilite_dir[4 + 3][i + 2][hfw - 2] += hilite_dir4[3][hfw - 2][i];
+ }
+ }
+
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+
+ for (int c = 0; c < 3; c++) {
+ for (int j = hfw - 2; j > 0; j--) {
+ for (int i = 2; i < hfh - 2; i++) {
+ //from right
+ if (hilite[3][i][j] > epsilon) {
+ hilite_dir4[c][j][i] = hilite[c][i][j] / hilite[3][i][j];
+ } else {
+ hilite_dir4[c][j][i] = 0.1 * ((hilite_dir4[c][(j + 1)][(i - 2)] + hilite_dir4[c][(j + 1)][(i - 1)] + hilite_dir4[c][(j + 1)][(i)] + hilite_dir4[c][(j + 1)][(i + 1)] + hilite_dir4[c][(j + 1)][(i + 2)]) /
+ (hilite_dir4[3][(j + 1)][(i - 2)] + hilite_dir4[3][(j + 1)][(i - 1)] + hilite_dir4[3][(j + 1)][(i)] + hilite_dir4[3][(j + 1)][(i + 1)] + hilite_dir4[3][(j + 1)][(i + 2)] + epsilon));
+ }
+ }
+
+ if(hilite[3][2][j] <= epsilon) {
+ hilite_dir[0 + c][0][j] += hilite_dir4[c][j][2];
+ }
+
+ if(hilite[3][hfh - 3][j] <= epsilon) {
+ hilite_dir[4 + c][hfh - 1][j] += hilite_dir4[c][j][hfh - 3];
+ }
+ }
+
+ for (int i = 2; i < hfh - 2; i++) {
+ if(hilite[3][i][0] <= epsilon) {
+ hilite_dir[0 + c][i - 2][0] += hilite_dir4[c][0][i];
+ hilite_dir[4 + c][i + 2][0] += hilite_dir4[c][0][i];
+ }
+
+ if(hilite[3][i][1] <= epsilon) {
+ hilite_dir[0 + c][i - 2][1] += hilite_dir4[c][1][i];
+ hilite_dir[4 + c][i + 2][1] += hilite_dir4[c][1][i];
+ }
+
+ if(hilite[3][i][hfw - 2] <= epsilon) {
+ hilite_dir[0 + c][i - 2][hfw - 2] += hilite_dir4[c][hfw - 2][i];
+ hilite_dir[4 + c][i + 2][hfw - 2] += hilite_dir4[c][hfw - 2][i];
+ }
+ }
+ }
+
if(plistener) {
progress += 0.05;
plistener->setProgress(progress);
}
+
for (int i = 1; i < hfh - 1; i++)
for (int j = 2; j < hfw - 2; j++) {
- //if (i%100==0 && j%100==0)
- // printf("row=%d col=%d r=%f g=%f b=%f hilite=%f \n",i,j,hilite[0][i][j],hilite[1][i][j],hilite[2][i][j],hilite[3][i][j]);
-
//from top
- if (hilite[3][i][j] > 0.01) {
- for (int c = 0; c < 4; c++) {
- hilite_dir[8 + c][i][j] = hilite[c][i][j] / hilite[3][i][j];
- }
+ if (hilite[3][i][j] > epsilon) {
+ hilite_dir[0 + 3][i][j] = 1.f;
} else {
- for (int c = 0; c < 4; c++) {
- hilite_dir[8 + c][i][j] = 0.1 * ((hilite_dir[8 + c][i - 1][j - 2] + hilite_dir[8 + c][i - 1][j - 1] + hilite_dir[8 + c][i - 1][j] + hilite_dir[8 + c][i - 1][j + 1] + hilite_dir[8 + c][i - 1][j + 2]) /
- (hilite_dir[8 + 3][i - 1][j - 2] + hilite_dir[8 + 3][i - 1][j - 1] + hilite_dir[8 + 3][i - 1][j] + hilite_dir[8 + 3][i - 1][j + 1] + hilite_dir[8 + 3][i - 1][j + 2] + 0.00001));
- hilite_dir[12 + c][i + 1][j] += hilite_dir[8 + c][i][j];
+ hilite_dir[0 + 3][i][j] = (hilite_dir[0 + 3][i - 1][j - 2] + hilite_dir[0 + 3][i - 1][j - 1] + hilite_dir[0 + 3][i - 1][j] + hilite_dir[0 + 3][i - 1][j + 1] + hilite_dir[0 + 3][i - 1][j + 2]) == 0.f ? 0.f : 0.1f;
+ }
+ }
+
+ for (int j = 2; j < hfw - 2; j++) {
+ if(hilite[3][hfh - 2][j] <= epsilon) {
+ hilite_dir[4 + 3][hfh - 1][j] += hilite_dir[0 + 3][hfh - 2][j];
+ }
+ }
+
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+
+ for (int c = 0; c < 3; c++) {
+ for (int i = 1; i < hfh - 1; i++) {
+ for (int j = 2; j < hfw - 2; j++) {
+ //from top
+ if (hilite[3][i][j] > epsilon) {
+ hilite_dir[0 + c][i][j] = hilite[c][i][j] / hilite[3][i][j];
+ } else {
+ hilite_dir[0 + c][i][j] = 0.1 * ((hilite_dir[0 + c][i - 1][j - 2] + hilite_dir[0 + c][i - 1][j - 1] + hilite_dir[0 + c][i - 1][j] + hilite_dir[0 + c][i - 1][j + 1] + hilite_dir[0 + c][i - 1][j + 2]) /
+ (hilite_dir[0 + 3][i - 1][j - 2] + hilite_dir[0 + 3][i - 1][j - 1] + hilite_dir[0 + 3][i - 1][j] + hilite_dir[0 + 3][i - 1][j + 1] + hilite_dir[0 + 3][i - 1][j + 2] + epsilon));
}
}
}
+ for (int j = 2; j < hfw - 2; j++) {
+ if(hilite[3][hfh - 2][j] <= epsilon) {
+ hilite_dir[4 + c][hfh - 1][j] += hilite_dir[0 + c][hfh - 2][j];
+ }
+ }
+ }
+
if(plistener) {
progress += 0.05;
plistener->setProgress(progress);
@@ -647,18 +849,30 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b
for (int i = hfh - 2; i > 0; i--)
for (int j = 2; j < hfw - 2; j++) {
//from bottom
- if (hilite[3][i][j] > 0.01) {
- for (int c = 0; c < 4; c++) {
- hilite_dir[12 + c][i][j] = hilite[c][i][j] / hilite[3][i][j];
- }
+ if (hilite[3][i][j] > epsilon) {
+ hilite_dir[4 + 3][i][j] = 1.f;
} else {
- for (int c = 0; c < 4; c++) {
- hilite_dir[12 + c][i][j] = 0.1 * ((hilite_dir[12 + c][(i + 1)][(j - 2)] + hilite_dir[12 + c][(i + 1)][(j - 1)] + hilite_dir[12 + c][(i + 1)][(j)] + hilite_dir[12 + c][(i + 1)][(j + 1)] + hilite_dir[12 + c][(i + 1)][(j + 2)]) /
- (hilite_dir[12 + 3][(i + 1)][(j - 2)] + hilite_dir[12 + 3][(i + 1)][(j - 1)] + hilite_dir[12 + 3][(i + 1)][(j)] + hilite_dir[12 + 3][(i + 1)][(j + 1)] + hilite_dir[12 + 3][(i + 1)][(j + 2)] + 0.00001));
+ hilite_dir[4 + 3][i][j] = (hilite_dir[4 + 3][(i + 1)][(j - 2)] + hilite_dir[4 + 3][(i + 1)][(j - 1)] + hilite_dir[4 + 3][(i + 1)][(j)] + hilite_dir[4 + 3][(i + 1)][(j + 1)] + hilite_dir[4 + 3][(i + 1)][(j + 2)]) == 0.f ? 0.f : 0.1f;
+ }
+ }
+
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+
+ for (int c = 0; c < 4; c++) {
+ for (int i = hfh - 2; i > 0; i--) {
+ for (int j = 2; j < hfw - 2; j++) {
+ //from bottom
+ if (hilite[3][i][j] > epsilon) {
+ hilite_dir[4 + c][i][j] = hilite[c][i][j] / hilite[3][i][j];
+ } else {
+ hilite_dir[4 + c][i][j] = 0.1 * ((hilite_dir[4 + c][(i + 1)][(j - 2)] + hilite_dir[4 + c][(i + 1)][(j - 1)] + hilite_dir[4 + c][(i + 1)][(j)] + hilite_dir[4 + c][(i + 1)][(j + 1)] + hilite_dir[4 + c][(i + 1)][(j + 2)]) /
+ (hilite_dir[4 + 3][(i + 1)][(j - 2)] + hilite_dir[4 + 3][(i + 1)][(j - 1)] + hilite_dir[4 + 3][(i + 1)][(j)] + hilite_dir[4 + 3][(i + 1)][(j + 1)] + hilite_dir[4 + 3][(i + 1)][(j + 2)] + epsilon));
}
}
-
}
+ }
if(plistener) {
progress += 0.05;
@@ -666,7 +880,7 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b
}
//fill in edges
- for (int dir = 0; dir < numdirs; dir++) {
+ for (int dir = 0; dir < 2; dir++) {
for (int i = 1; i < hfh - 1; i++)
for (int c = 0; c < 4; c++) {
hilite_dir[dir * 4 + c][i][0] = hilite_dir[dir * 4 + c][i][1];
@@ -687,28 +901,57 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b
}
}
+ for (int i = 1; i < hfh - 1; i++)
+ for (int c = 0; c < 4; c++) {
+ hilite_dir0[c][0][i] = hilite_dir0[c][1][i];
+ hilite_dir0[c][hfw - 1][i] = hilite_dir0[c][hfw - 2][i];
+ }
+
+ for (int j = 1; j < hfw - 1; j++)
+ for (int c = 0; c < 4; c++) {
+ hilite_dir0[c][j][0] = hilite_dir0[c][j][1];
+ hilite_dir0[c][j][hfh - 1] = hilite_dir0[c][j][hfh - 2];
+ }
+
+ for (int c = 0; c < 4; c++) {
+ hilite_dir0[c][0][0] = hilite_dir0[c][0][1] = hilite_dir0[c][1][0] = hilite_dir0[c][1][1] = hilite_dir0[c][2][2];
+ hilite_dir0[c][hfw - 1][0] = hilite_dir0[c][hfw - 1][1] = hilite_dir0[c][hfw - 2][0] = hilite_dir0[c][hfw - 2][1] = hilite_dir0[c][hfw - 3][2];
+ hilite_dir0[c][0][hfh - 1] = hilite_dir0[c][0][hfh - 2] = hilite_dir0[c][1][hfh - 1] = hilite_dir0[c][1][hfh - 2] = hilite_dir0[c][2][hfh - 3];
+ hilite_dir0[c][hfw - 1][hfh - 1] = hilite_dir0[c][hfw - 1][hfh - 2] = hilite_dir0[c][hfw - 2][hfh - 1] = hilite_dir0[c][hfw - 2][hfh - 2] = hilite_dir0[c][hfw - 3][hfh - 3];
+ }
+
+ for (int i = 1; i < hfh - 1; i++)
+ for (int c = 0; c < 4; c++) {
+ hilite_dir4[c][0][i] = hilite_dir4[c][1][i];
+ hilite_dir4[c][hfw - 1][i] = hilite_dir4[c][hfw - 2][i];
+ }
+
+ for (int j = 1; j < hfw - 1; j++)
+ for (int c = 0; c < 4; c++) {
+ hilite_dir4[c][j][0] = hilite_dir4[c][j][1];
+ hilite_dir4[c][j][hfh - 1] = hilite_dir4[c][j][hfh - 2];
+ }
+
+ for (int c = 0; c < 4; c++) {
+ hilite_dir4[c][0][0] = hilite_dir4[c][0][1] = hilite_dir4[c][1][0] = hilite_dir4[c][1][1] = hilite_dir4[c][2][2];
+ hilite_dir4[c][hfw - 1][0] = hilite_dir4[c][hfw - 1][1] = hilite_dir4[c][hfw - 2][0] = hilite_dir4[c][hfw - 2][1] = hilite_dir4[c][hfw - 3][2];
+ hilite_dir4[c][0][hfh - 1] = hilite_dir4[c][0][hfh - 2] = hilite_dir4[c][1][hfh - 1] = hilite_dir4[c][1][hfh - 2] = hilite_dir4[c][2][hfh - 3];
+ hilite_dir4[c][hfw - 1][hfh - 1] = hilite_dir4[c][hfw - 1][hfh - 2] = hilite_dir4[c][hfw - 2][hfh - 1] = hilite_dir4[c][hfw - 2][hfh - 2] = hilite_dir4[c][hfw - 3][hfh - 3];
+ }
+
if(plistener) {
progress += 0.05;
plistener->setProgress(progress);
}
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- /*for (int m=0; m<4*numdirs; m++) {
- boxblur2(hilite_dir[m],hilite_dir[m],hfh,hfw,4);
- }*/
-
- //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- //now we have highlight data extended in various directions
- //next step is to build back local data by averaging
-
+ //free up some memory
+ for(int c = 0; c < 4; c++) {
+ hilite[c].free();
+ }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// now reconstruct clipped channels using color ratios
- //const float Yclip = 0.3333*(max[0] + max[1] + max[2]);
- //float sumwt=0, counts=0;
-
#ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16)
#endif
@@ -717,7 +960,6 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b
int i1 = min((i - (i % pitch)) / pitch, hfh - 1);
for (int j = 0; j < width; j++) {
- int j1 = min((j - (j % pitch)) / pitch, hfw - 1);
float pixel[3] = {red[i][j], green[i][j], blue[i][j]};
@@ -725,11 +967,9 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b
continue; //pixel not clipped
}
- //if (pixel[0] blendpt) {
- rgb_blend[0] = rfrac * rgb[0] + (1 - rfrac) * pixel[0];
+ rgb_blend[0] = rfrac * rgb[0] + (1.f - rfrac) * pixel[0];
}
if (pixel[1] > blendpt) {
- rgb_blend[1] = gfrac * rgb[1] + (1 - gfrac) * pixel[1];
+ rgb_blend[1] = gfrac * rgb[1] + (1.f - gfrac) * pixel[1];
}
if (pixel[2] > blendpt) {
- rgb_blend[2] = bfrac * rgb[2] + (1 - bfrac) * pixel[2];
+ rgb_blend[2] = bfrac * rgb[2] + (1.f - bfrac) * pixel[2];
}
//end of HLRecovery_blend estimation
//%%%%%%%%%%%%%%%%%%%%%%%
- //float pixref[3]={min(Yclip,hfsize[0][i1][j1]),min(Yclip,hfsize[1][i1][j1]),min(Yclip,hfsize[2][i1][j1])};
-
//there are clipped highlights
//first, determine weighted average of unclipped extensions (weighting is by 'hue' proximity)
- float dirwt, factor, Y;
- float totwt = 0; //0.0003;
- float clipfix[3] = {0, 0, 0}; //={totwt*rgb_blend[0],totwt*rgb_blend[1],totwt*rgb_blend[2]};
+ float totwt = 0.f;
+ float clipfix[3] = {0.f, 0.f, 0.f};
- for (int dir = 0; dir < numdirs; dir++) {
- float Yhi = 0.001 + (hilite_dir[dir * 4 + 0][i1][j1] + hilite_dir[dir * 4 + 1][i1][j1] + hilite_dir[dir * 4 + 2][i1][j1]);
- float Y = 0.001 + (rgb_blend[0] + rgb_blend[1] + rgb_blend[2]);
+ float Y = epsilon + rgb_blend[0] + rgb_blend[1] + rgb_blend[2];
- if (hilite_dir[dir * 4 + 0][i1][j1] + hilite_dir[dir * 4 + 1][i1][j1] + hilite_dir[dir * 4 + 2][i1][j1] > 0.5) {
- dirwt = invfn[65535 * (SQR(rgb_blend[0] / Y - hilite_dir[dir * 4 + 0][i1][j1] / Yhi) +
- SQR(rgb_blend[1] / Y - hilite_dir[dir * 4 + 1][i1][j1] / Yhi) +
- SQR(rgb_blend[2] / Y - hilite_dir[dir * 4 + 2][i1][j1] / Yhi))];
+ for (int c = 0; c < ColorCount; c++) {
+ rgb_blend[c] /= Y;
+ }
+
+ float Yhi = 1.f / (hilite_dir0[0][j1][i1] + hilite_dir0[1][j1][i1] + hilite_dir0[2][j1][i1]);
+
+ if (Yhi < 2.f) {
+ float dirwt = 1.f / (1.f + 65535.f * (SQR(rgb_blend[0] - hilite_dir0[0][j1][i1] * Yhi) +
+ SQR(rgb_blend[1] - hilite_dir0[1][j1][i1] * Yhi) +
+ SQR(rgb_blend[2] - hilite_dir0[2][j1][i1] * Yhi)));
+ totwt = dirwt;
+ dirwt /= (hilite_dir0[3][j1][i1] + epsilon);
+ clipfix[0] = dirwt * hilite_dir0[0][j1][i1];
+ clipfix[1] = dirwt * hilite_dir0[1][j1][i1];
+ clipfix[2] = dirwt * hilite_dir0[2][j1][i1];
+ }
+
+ for (int dir = 0; dir < 2; dir++) {
+ float Yhi = 1.f / ( hilite_dir[dir * 4 + 0][i1][j1] + hilite_dir[dir * 4 + 1][i1][j1] + hilite_dir[dir * 4 + 2][i1][j1]);
+
+ if (Yhi < 2.f) {
+ float dirwt = 1.f / (1.f + 65535.f * (SQR(rgb_blend[0] - hilite_dir[dir * 4 + 0][i1][j1] * Yhi) +
+ SQR(rgb_blend[1] - hilite_dir[dir * 4 + 1][i1][j1] * Yhi) +
+ SQR(rgb_blend[2] - hilite_dir[dir * 4 + 2][i1][j1] * Yhi)));
totwt += dirwt;
- clipfix[0] += dirwt * hilite_dir[dir * 4 + 0][i1][j1] / (hilite_dir[dir * 4 + 3][i1][j1] + 0.00001);
- clipfix[1] += dirwt * hilite_dir[dir * 4 + 1][i1][j1] / (hilite_dir[dir * 4 + 3][i1][j1] + 0.00001);
- clipfix[2] += dirwt * hilite_dir[dir * 4 + 2][i1][j1] / (hilite_dir[dir * 4 + 3][i1][j1] + 0.00001);
+ dirwt /= (hilite_dir[dir * 4 + 3][i1][j1] + epsilon);
+ clipfix[0] += dirwt * hilite_dir[dir * 4 + 0][i1][j1];
+ clipfix[1] += dirwt * hilite_dir[dir * 4 + 1][i1][j1];
+ clipfix[2] += dirwt * hilite_dir[dir * 4 + 2][i1][j1];
}
}
+
+ Yhi = 1.f / (hilite_dir4[0][j1][i1] + hilite_dir4[1][j1][i1] + hilite_dir4[2][j1][i1]);
+
+ if (Yhi < 2.f) {
+ float dirwt = 1.f / (1.f + 65535.f * (SQR(rgb_blend[0] - hilite_dir4[0][j1][i1] * Yhi) +
+ SQR(rgb_blend[1] - hilite_dir4[1][j1][i1] * Yhi) +
+ SQR(rgb_blend[2] - hilite_dir4[2][j1][i1] * Yhi)));
+ totwt += dirwt;
+ dirwt /= (hilite_dir4[3][j1][i1] + epsilon);
+ clipfix[0] += dirwt * hilite_dir4[0][j1][i1];
+ clipfix[1] += dirwt * hilite_dir4[1][j1][i1];
+ clipfix[2] += dirwt * hilite_dir4[2][j1][i1];
+ }
+
if(totwt == 0.f) {
continue;
}
@@ -834,58 +1105,39 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b
clipfix[0] /= totwt;
clipfix[1] /= totwt;
clipfix[2] /= totwt;
- //sumwt += totwt;
- //counts ++;
//now correct clipped channels
if (pixel[0] > max_f[0] && pixel[1] > max_f[1] && pixel[2] > max_f[2]) {
//all channels clipped
float Y = (0.299 * clipfix[0] + 0.587 * clipfix[1] + 0.114 * clipfix[2]);
- //float Y = (clipfix[0] + clipfix[1] + clipfix[2]);
- factor = whitept / Y;
+
+ float factor = whitept / Y;
red[i][j] = clipfix[0] * factor;
green[i][j] = clipfix[1] * factor;
blue[i][j] = clipfix[2] * factor;
} else {//some channels clipped
- int notclipped[3] = {pixel[0] < max_f[0] ? 1 : 0, pixel[1] < max_f[1] ? 1 : 0, pixel[2] < max_f[2] ? 1 : 0};
+ float notclipped[3] = {pixel[0] <= max_f[0] ? 1.f : 0.f, pixel[1] <= max_f[1] ? 1.f : 0.f, pixel[2] <= max_f[2] ? 1.f : 0.f};
- if (notclipped[0] == 0) { //red clipped
+ if (notclipped[0] == 0.f) { //red clipped
red[i][j] = max(red[i][j], (clipfix[0] * ((notclipped[1] * pixel[1] + notclipped[2] * pixel[2]) /
- (notclipped[1] * clipfix[1] + notclipped[2] * clipfix[2]))));
+ (notclipped[1] * clipfix[1] + notclipped[2] * clipfix[2] + epsilon))));
}
- if (notclipped[1] == 0) { //green clipped
+ if (notclipped[1] == 0.f) { //green clipped
green[i][j] = max(green[i][j], (clipfix[1] * ((notclipped[2] * pixel[2] + notclipped[0] * pixel[0]) /
- (notclipped[2] * clipfix[2] + notclipped[0] * clipfix[0]))));
+ (notclipped[2] * clipfix[2] + notclipped[0] * clipfix[0] + epsilon))));
}
- if (notclipped[2] == 0) { //blue clipped
+ if (notclipped[2] == 0.f) { //blue clipped
blue[i][j] = max(blue[i][j], (clipfix[2] * ((notclipped[0] * pixel[0] + notclipped[1] * pixel[1]) /
- (notclipped[0] * clipfix[0] + notclipped[1] * clipfix[1]))));
+ (notclipped[0] * clipfix[0] + notclipped[1] * clipfix[1] + epsilon))));
}
}
- /*if (hilite[3][i1][j1]>0.01) {
- red[i][j] = (red[i][j] + hilite[0][i1][j1])/(1+hilite[3][i1][j1]);
- green[i][j] = (green[i][j]+ hilite[1][i1][j1])/(1+hilite[3][i1][j1]);
- blue[i][j] = (blue[i][j] + hilite[2][i1][j1])/(1+hilite[3][i1][j1]);
- }*/
-
Y = (0.299 * red[i][j] + 0.587 * green[i][j] + 0.114 * blue[i][j]);
if (Y > whitept) {
- factor = whitept / Y;
-
- /*I = (0.596 * red[i][j] - 0.275 * green[i][j] - 0.321 * blue[i][j]);
- Q = (0.212 * red[i][j] - 0.523 * green[i][j] + 0.311 * blue[i][j]);
-
- Y *= factor;
- I *= factor;//max(0,min(1,(whitept-Y)/(whitept-clippt)));
- Q *= factor;//max(0,min(1,(whitept-Y)/(whitept-clippt)));
-
- red[i][j] = Y + 0.956*I + 0.621*Q;
- green[i][j] = Y - 0.272*I - 0.647*Q;
- blue[i][j] = Y - 1.105*I + 1.702*Q;*/
+ float factor = whitept / Y;
red[i][j] *= factor;
green[i][j] *= factor;
@@ -898,76 +1150,8 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b
plistener->setProgress(1.00);
}
- //printf("ave wt=%f\n",sumwt/counts);
-
-
- // diagnostic output
- /*for (int i=0; i &conversionBuffer, bool dehacontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) {};
+ virtual void retinexPrepareCurves (RetinexParams retinexParams, LUTf &cdcurve, RetinextransmissionCurve &retinextransmissionCurve, bool &retinexcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI) {};
+ virtual void retinexPrepareBuffers (ColorManagementParams cmp, RetinexParams retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI) {};
virtual void flushRawData () {};
virtual void flushRGB () {};
virtual void HLRecovery_Global (ToneCurveParams hrp) {};
virtual void HLRecovery_inpaint (float** red, float** green, float** blue) {};
+ virtual void MSR(LabImage* lab, int width, int height, int skip, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax) {};
virtual bool IsrgbSourceModified() = 0; // tracks whether cached rgb output of demosaic has been modified
diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc
index fa1fae502..23904ba1b 100644
--- a/rtengine/improccoordinator.cc
+++ b/rtengine/improccoordinator.cc
@@ -55,6 +55,7 @@ ImProcCoordinator::ImProcCoordinator ()
lhist16(65536), lhist16Cropped(65536),
lhist16CAM(65536), lhist16CroppedCAM(65536),
lhist16CCAM(65536),
+ lhist16RETI(65536),
histCropped(65536),
lhist16Clad(65536), lhist16CLlad(65536),
lhist16LClad(65536), lhist16LLClad(65536),
@@ -75,6 +76,8 @@ ImProcCoordinator::ImProcCoordinator ()
bcabhist(256),
histChroma(256),
+ histLRETI(256),
+
CAMBrightCurveJ(), CAMBrightCurveQ(),
rCurve(),
@@ -85,9 +88,9 @@ ImProcCoordinator::ImProcCoordinator ()
bcurvehist(256), bcurvehistCropped(256), bbeforehist(256),
fullw(1), fullh(1),
pW(-1), pH(-1),
- plistener(NULL), imageListener(NULL), aeListener(NULL), acListener(NULL), abwListener(NULL), actListener(NULL), adnListener(NULL), awavListener(NULL), hListener(NULL),
+ plistener(NULL), imageListener(NULL), aeListener(NULL), acListener(NULL), abwListener(NULL), actListener(NULL), adnListener(NULL), awavListener(NULL), dehaListener(NULL), hListener(NULL),
resultValid(false), changeSinceLast(0), updaterRunning(false), destroying(false), utili(false), autili(false), wavcontlutili(false),
- butili(false), ccutili(false), cclutili(false), clcutili(false), opautili(false)
+ butili(false), ccutili(false), cclutili(false), clcutili(false), opautili(false), conversionBuffer(1, 1)
{}
@@ -163,6 +166,8 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
}
RAWParams rp = params.raw;
+ ColorManagementParams cmp = params.icm;
+ LCurveParams lcur = params.labCurve;
if( !highDetailNeeded ) {
// if below 100% magnification, take a fast path
@@ -206,6 +211,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
OR HLR gets disabled when Color method was selected
*/
// If high detail (=100%) is newly selected, do a demosaic update, since the last was just with FAST
+
if ( (todo & M_RAW)
|| (!highDetailRawComputed && highDetailNeeded)
|| ( params.toneCurve.hrenabled && params.toneCurve.method != "Color" && imgsrc->IsrgbSourceModified())
@@ -219,19 +225,38 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
}
}
- imgsrc->demosaic( rp );
+ imgsrc->demosaic( rp);//enabled demosaic
+ // if a demosaic happened we should also call getimage later, so we need to set the M_INIT flag
+ todo |= M_INIT;
if (highDetailNeeded) {
highDetailRawComputed = true;
-
- if (params.toneCurve.hrenabled && params.toneCurve.method == "Color") {
- todo |= M_INIT;
- }
} else {
highDetailRawComputed = false;
}
+
+ if (params.retinex.enabled) {
+ lhist16RETI.clear();
+
+ imgsrc->retinexPrepareBuffers(params.icm, params.retinex, conversionBuffer, lhist16RETI);
+ }
}
+ if (params.retinex.enabled) {
+ bool dehacontlutili = false;
+ bool useHsl = false;
+ LUTf cdcurve (65536, 0);
+
+ imgsrc->retinexPrepareCurves(params.retinex, cdcurve, dehatransmissionCurve, dehacontlutili, useHsl, lhist16RETI, histLRETI);
+ float minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax;
+ imgsrc->retinex( params.icm, params.retinex, params.toneCurve, cdcurve, dehatransmissionCurve, conversionBuffer, dehacontlutili, useHsl, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, histLRETI);//enabled Retinex
+
+ if(dehaListener) {
+ dehaListener->minmaxChanged(maxCD, minCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax);
+ }
+ }
+
+
// Updating toneCurve.hrenabled if necessary
// It has to be done there, because the next 'if' statement will use the value computed here
if (todo & M_AUTOEXP) {
@@ -249,7 +274,8 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
if (todo & (M_INIT | M_LINDENOISE)) {
MyMutex::MyLock initLock(minit); // Also used in crop window
- imgsrc->HLRecovery_Global( params.toneCurve ); // this handles Color HLRecovery
+ imgsrc->HLRecovery_Global( params.toneCurve); // this handles Color HLRecovery
+
if (settings->verbose) {
printf ("Applying white balance, color correction & sRBG conversion...\n");
@@ -294,7 +320,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
imgsrc->getImage (currWB, tr, orig_prev, pp, params.toneCurve, params.icm, params.raw);
//ColorTemp::CAT02 (orig_prev, ¶ms) ;
-
+ // printf("orig_prevW=%d\n scale=%d",orig_prev->width, scale);
/* Issue 2785, disabled some 1:1 tools
if (todo & M_LINDENOISE) {
DirPyrDenoiseParams denoiseParams = params.dirpyrDenoise;
@@ -576,6 +602,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
nprevl->CopyFrom(oprevl);
progress ("Applying Color Boost...", 100 * readyphase / numofphases);
+ // ipf.MSR(nprevl, nprevl->W, nprevl->H, 1);
ipf.chromiLuminanceCurve (NULL, pW, nprevl, nprevl, chroma_acurve, chroma_bcurve, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, histCCurve, histCLurve, histLLCurve, histLCurve);
ipf.vibrance(nprevl);
@@ -809,7 +836,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
if (hListener) {
updateLRGBHistograms ();
- hListener->histogramChanged (histRed, histGreen, histBlue, histLuma, histToneCurve, histLCurve, histCCurve, /*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRedRaw, histGreenRaw, histBlueRaw, histChroma);
+ hListener->histogramChanged (histRed, histGreen, histBlue, histLuma, histToneCurve, histLCurve, histCCurve, /*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRedRaw, histGreenRaw, histBlueRaw, histChroma, histLRETI);
}
}
diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h
index e0588d5df..ef981fe6a 100644
--- a/rtengine/improccoordinator.h
+++ b/rtengine/improccoordinator.h
@@ -94,6 +94,8 @@ protected:
LUTf satcurve;
LUTf lhskcurve;
LUTf clcurve;
+// multi_array2D conversionBuffer;
+ multi_array2D conversionBuffer;
LUTf wavclCurve;
LUTf clToningcurve;
LUTf cl2Toningcurve;
@@ -104,13 +106,14 @@ protected:
LUTu lhist16, lhist16Cropped;
LUTu lhist16CAM, lhist16CroppedCAM;
LUTu lhist16CCAM;
+ LUTu lhist16RETI;
LUTu histCropped;
LUTu lhist16Clad, lhist16CLlad, lhist16LClad, lhist16LLClad;
LUTu histRed, histRedRaw;
LUTu histGreen, histGreenRaw;
LUTu histBlue, histBlueRaw;
LUTu histLuma, histToneCurve, histToneCurveBW, histLCurve, histCCurve, histCLurve;
- LUTu histLLCurve, histLCAM, histCCAM, histClad, bcabhist, histChroma;
+ LUTu histLLCurve, histLCAM, histCCAM, histClad, bcabhist, histChroma, histLRETI;
LUTf CAMBrightCurveJ, CAMBrightCurveQ;
@@ -128,6 +131,7 @@ protected:
WavOpacityCurveBY waOpacityCurveBY;
WavOpacityCurveW waOpacityCurveW;
WavOpacityCurveWL waOpacityCurveWL;
+ RetinextransmissionCurve dehatransmissionCurve;
ColorAppearance customColCurve1;
ColorAppearance customColCurve2;
@@ -152,6 +156,7 @@ protected:
AutoColorTonListener* actListener;
AutoChromaListener* adnListener;
WaveletListener* awavListener;
+ RetinexListener* dehaListener;
HistogramListener* hListener;
std::vector sizeListeners;
@@ -297,6 +302,10 @@ public:
{
adnListener = adn;
}
+ void setRetinexListener (RetinexListener* adh)
+ {
+ dehaListener = adh;
+ }
void setWaveletListener (WaveletListener* awa)
{
awavListener = awa;
diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h
index 351cadac8..cfabbba64 100644
--- a/rtengine/improcfun.h
+++ b/rtengine/improcfun.h
@@ -305,6 +305,9 @@ public:
//void RGB_InputTransf(Imagefloat * src, LabImage * dst, const procparams::DirPyrDenoiseParams & dnparams, const procparams::DefringeParams & defringe);
//void RGB_OutputTransf(LabImage * src, Imagefloat * dst, const procparams::DirPyrDenoiseParams & dnparams);
//void output_tile_row (float *Lbloxrow, float ** Lhipassdn, float ** tilemask, int height, int width, int top, int blkrad );
+
+// void MSR(LabImage* lab, int width, int height, int skip);
+
void Tile_calc (int tilesize, int overlap, int kall, int imwidth, int imheight, int &numtiles_W, int &numtiles_H, int &tilewidth, int &tileheight, int &tileWskip, int &tileHskip);
void ip_wavelet(LabImage * lab, LabImage * dst, int kall, const procparams::WaveletParams & waparams, const WavCurve & wavCLVCcurve, const WavOpacityCurveRG & waOpacityCurveRG, const WavOpacityCurveBY & waOpacityCurveBY, const WavOpacityCurveW & waOpacityCurveW, const WavOpacityCurveWL & waOpacityCurveWL, LUTf &wavclCurve, bool wavcontlutili, int skip);
diff --git a/rtengine/impulse_denoise.h b/rtengine/impulse_denoise.h
index 1c89021e7..0e3fefd97 100644
--- a/rtengine/impulse_denoise.h
+++ b/rtengine/impulse_denoise.h
@@ -65,10 +65,7 @@ SSEFUNCTION void ImProcFunctions::impulse_nr (LabImage* lab, double thresh)
#pragma omp parallel
#endif
{
- AlignedBufferMP buffer(max(width, height));
-
- gaussHorizontal (lab->L, lpf, buffer, width, height, max(2.0, thresh - 1.0));
- gaussVertical (lpf, lpf, buffer, width, height, max(2.0, thresh - 1.0));
+ gaussianBlur (lab->L, lpf, width, height, max(2.0, thresh - 1.0));
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -320,9 +317,7 @@ SSEFUNCTION void ImProcFunctions::impulse_nrcam (CieImage* ncie, double thresh,
#pragma omp parallel
#endif
{
- AlignedBufferMP buffer(max(width, height));
- gaussHorizontal (ncie->sh_p, lpf, buffer, width, height, max(2.0, thresh - 1.0));
- gaussVertical (lpf, lpf, buffer, width, height, max(2.0, thresh - 1.0));
+ gaussianBlur (ncie->sh_p, lpf, width, height, max(2.0, thresh - 1.0));
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/rtengine/ipretinex.cc b/rtengine/ipretinex.cc
new file mode 100644
index 000000000..54d6888ea
--- /dev/null
+++ b/rtengine/ipretinex.cc
@@ -0,0 +1,547 @@
+/*
+* 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 .
+
+ * adaptation to RawTherapee
+ * 2015 Jacques Desmis
+ * 2015 Ingo Weyrich
+
+ * D. J. Jobson, Z. Rahman, and G. A. Woodell. A multi-scale
+ * Retinex for bridging the gap between color images and the
+ * human observation of scenes. IEEE Transactions on Image Processing,
+ * 1997, 6(7): 965-976
+
+ * Fan Guo Zixing Cai Bin Xie Jin Tang
+ * School of Information Science and Engineering, Central South University Changsha, China
+
+ * Weixing Wang and Lian Xu
+ * College of Physics and Information Engineering, Fuzhou University, Fuzhou, China
+
+ * inspired from 2003 Fabien Pelisson
+
+*/
+
+#include
+#include
+#include
+#include
+#include "rtengine.h"
+#include "gauss.h"
+#include "rawimagesource.h"
+#include "improcfun.h"
+#include "opthelper.h"
+#define MAX_RETINEX_SCALES 8
+#define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val )
+
+#define med3(a0,a1,a2,a3,a4,a5,a6,a7,a8,median) { \
+pp[0]=a0; pp[1]=a1; pp[2]=a2; pp[3]=a3; pp[4]=a4; pp[5]=a5; pp[6]=a6; pp[7]=a7; pp[8]=a8; \
+PIX_SORT(pp[1],pp[2]); PIX_SORT(pp[4],pp[5]); PIX_SORT(pp[7],pp[8]); \
+PIX_SORT(pp[0],pp[1]); PIX_SORT(pp[3],pp[4]); PIX_SORT(pp[6],pp[7]); \
+PIX_SORT(pp[1],pp[2]); PIX_SORT(pp[4],pp[5]); PIX_SORT(pp[7],pp[8]); \
+PIX_SORT(pp[0],pp[3]); PIX_SORT(pp[5],pp[8]); PIX_SORT(pp[4],pp[7]); \
+PIX_SORT(pp[3],pp[6]); PIX_SORT(pp[1],pp[4]); PIX_SORT(pp[2],pp[5]); \
+PIX_SORT(pp[4],pp[7]); PIX_SORT(pp[4],pp[2]); PIX_SORT(pp[6],pp[4]); \
+PIX_SORT(pp[4],pp[2]); median=pp[4];} //pp4 = median
+
+namespace rtengine
+{
+
+extern const Settings* settings;
+
+static float RetinexScales[MAX_RETINEX_SCALES];
+
+void retinex_scales( float* scales, int nscales, int mode, int s, float high)
+{
+ if ( nscales == 1 ) {
+ scales[0] = (float)s / 2.f;
+ } else if (nscales == 2) {
+ scales[1] = (float) s / 2.f;
+ scales[0] = (float) s;
+ } else {
+ float size_step = (float) s / (float) nscales;
+
+ if (mode == 0) {
+ for (int i = 0; i < nscales; ++i ) {
+ scales[nscales - i - 1] = 2.0f + (float)i * size_step;
+ }
+ } else if (mode == 1) {
+ size_step = (float)log(s - 2.0f) / (float) nscales;
+
+ for (int i = 0; i < nscales; ++i ) {
+ scales[nscales - i - 1] = 2.0f + (float)pow (10.f, (i * size_step) / log (10.f));
+ }
+ } else if (mode == 2) {
+ size_step = (float) log(s - 2.0f) / (float) nscales;
+
+ for ( int i = 0; i < nscales; ++i ) {
+ scales[i] = s - (float)pow (10.f, (i * size_step) / log (10.f));
+ }
+ } else if (mode == 3) {
+ size_step = (float) log(s - 2.0f) / (float) nscales;
+
+ for ( int i = 0; i < nscales; ++i ) {
+ scales[i] = high * s - (float)pow (10.f, (i * size_step) / log (10.f));
+ }
+ }
+ }
+}
+void mean_stddv2( float **dst, float &mean, float &stddv, int W_L, int H_L, float &maxtr, float &mintr)
+{
+ // summation using double precision to avoid too large summation error for large pictures
+ double vsquared = 0.f;
+ double sum = 0.f;
+ maxtr = -999999.f;
+ mintr = 999999.f;
+#ifdef _OPENMP
+ #pragma omp parallel
+#endif
+ {
+ float lmax = -999999.f, lmin = 999999.f;
+#ifdef _OPENMP
+ #pragma omp for reduction(+:sum,vsquared) nowait // this leads to differences, but parallel summation is more accurate
+#endif
+
+ for (int i = 0; i < H_L; i++ )
+ for (int j = 0; j < W_L; j++) {
+ sum += dst[i][j];
+ vsquared += (dst[i][j] * dst[i][j]);
+
+ if ( dst[i][j] > lmax) {
+ lmax = dst[i][j] ;
+ }
+
+ if ( dst[i][j] < lmin) {
+ lmin = dst[i][j] ;
+ }
+
+ }
+
+#ifdef _OPENMP
+ #pragma omp critical
+#endif
+ {
+ maxtr = maxtr > lmax ? maxtr : lmax;
+ mintr = mintr < lmin ? mintr : lmin;
+ }
+
+ }
+ mean = sum / (double) (W_L * H_L);
+ vsquared /= (double) W_L * H_L;
+ stddv = ( vsquared - (mean * mean) );
+ stddv = (float)sqrt(stddv);
+}
+
+
+
+
+
+
+void mean_stddv( float **dst, float &mean, float &stddv, int W_L, int H_L, const float factor, float &maxtr, float &mintr)
+
+{
+ // summation using double precision to avoid too large summation error for large pictures
+ double vsquared = 0.f;
+ double sum = 0.f;
+ maxtr = 0.f;
+ mintr = 0.f;
+#ifdef _OPENMP
+ #pragma omp parallel
+#endif
+ {
+ float lmax = 0.f, lmin = 0.f;
+
+#ifdef _OPENMP
+ #pragma omp for reduction(+:sum,vsquared) // this can lead to differences, but parallel summation is more accurate
+#endif
+
+ for (int i = 0; i < H_L; i++ )
+ for (int j = 0; j < W_L; j++) {
+ sum += dst[i][j];
+ vsquared += (dst[i][j] * dst[i][j]);
+
+ if ( dst[i][j] > lmax) {
+ lmax = dst[i][j] ;
+ }
+
+ if ( dst[i][j] < lmin) {
+ lmin = dst[i][j] ;
+ }
+
+ }
+
+#ifdef _OPENMP
+ #pragma omp critical
+#endif
+ {
+ maxtr = maxtr > lmax ? maxtr : lmax;
+ mintr = mintr < lmin ? mintr : lmin;
+ }
+
+ }
+
+ sum *= factor;
+ maxtr *= factor;
+ mintr *= factor;
+ vsquared *= (factor * factor);
+ mean = sum / (float) (W_L * H_L);
+ vsquared /= (float) W_L * H_L;
+ stddv = ( vsquared - (mean * mean) );
+ stddv = (float)sqrt(stddv);
+}
+
+void RawImageSource::MSR(float** luminance, float** originalLuminance, float **exLuminance, int width, int height, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax)
+{
+ if (deh.enabled) {//enabled
+ float mean, stddv, maxtr, mintr;
+ // float mini, delta, maxi;
+ float delta;
+ float eps = 2.f;
+ bool useHsl = deh.retinexcolorspace == "HSLLOG";
+ bool useHslLin = deh.retinexcolorspace == "HSLLIN";
+ float gain2 = (float) deh.gain / 100.f; //def =1 not use
+ gain2 = useHslLin ? gain2 * 0.5f : gain2;
+ float offse = (float) deh.offs; //def = 0 not use
+ int scal = deh.scal; //def=3
+ scal = 3;//disabled scal
+ int nei = (int) 2.8f * deh.neigh; //def = 220
+ float vart = (float)deh.vart / 100.f;//variance
+ float strength = (float) deh.str / 100.f; // Blend with original L channel data
+ float limD = (float) deh.limd;
+ limD = pow(limD, 1.7f);//about 2500 enough
+ limD *= useHslLin ? 10.f : 1.f;
+ float ilimD = 1.f / limD;
+ int moderetinex = 2; // default to 2 ( deh.retinexMethod == "high" )
+ float hig = ((float) deh.highl) / 100.f;
+ bool higplus = false ;
+ float elogt;
+ float hl = deh.baselog;
+
+ if(hl >= 2.71828f) {
+ elogt = 2.71828f + SQR(SQR(hl - 2.71828f));
+ } else {
+ elogt = hl;
+ }
+
+ elogt = 2.71828f;//disabled baselog
+ FlatCurve* shcurve = NULL;//curve L=f(H)
+ bool lhutili = false;
+
+ if (deh.enabled) {
+ shcurve = new FlatCurve(deh.lhcurve);
+
+ if (!shcurve || shcurve->isIdentity()) {
+ if (shcurve) {
+ delete shcurve;
+ shcurve = NULL;
+ }
+ } else {
+ lhutili = true;
+ }
+ }
+
+
+ if(deh.retinexMethod == "highliplus") {
+ higplus = true;
+ }
+
+ if (deh.retinexMethod == "uni") {
+ moderetinex = 0;
+ }
+
+ if (deh.retinexMethod == "low") {
+ moderetinex = 1;
+ }
+
+ if (deh.retinexMethod == "highli" || deh.retinexMethod == "highliplus") {
+ moderetinex = 3;
+ }
+
+ float aahi = 49.f / 99.f; ////reduce sensibility 50%
+ float bbhi = 1.f - aahi;
+ float high;
+ high = bbhi + aahi * (float) deh.highl;
+ retinex_scales( RetinexScales, scal, moderetinex, nei, high );
+
+ int H_L = height;
+ int W_L = width;
+
+ float *src[H_L] ALIGNED16;
+ float *srcBuffer = new float[H_L * W_L];
+
+ for (int i = 0; i < H_L; i++) {
+ src[i] = &srcBuffer[i * W_L];
+ }
+
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+
+ for (int i = 0; i < H_L; i++)
+ for (int j = 0; j < W_L; j++) {
+ src[i][j] = luminance[i][j] + eps;
+ luminance[i][j] = 0.f;
+ }
+
+ float *out[H_L] ALIGNED16;
+ float *outBuffer = new float[H_L * W_L];
+
+ for (int i = 0; i < H_L; i++) {
+ out[i] = &outBuffer[i * W_L];
+ }
+
+ const float logBetaGain = xlogf(16384.f);
+ const float pond = logBetaGain / (float) scal;
+
+#ifdef _OPENMP
+ #pragma omp parallel
+#endif
+ {
+ for ( int scale = scal - 1; scale >= 0; scale-- ) {
+ if(scale == scal - 1) { // probably large sigma. Use double gauss with sigma divided by sqrt(2.0)
+ gaussianBlur (src, out, W_L, H_L, RetinexScales[scale], true);
+ } else { // reuse result of last iteration
+ gaussianBlur (out, out, W_L, H_L, sqrtf(SQR(RetinexScales[scale]) - SQR(RetinexScales[scale + 1])));
+ }
+
+#ifdef __SSE2__
+ vfloat pondv = F2V(pond);
+ vfloat limMinv = F2V(ilimD);
+ vfloat limMaxv = F2V(limD);
+ vfloat elogtv = F2V(elogt);
+
+#endif
+#ifdef _OPENMP
+ #pragma omp for
+#endif
+
+ for (int i = 0; i < H_L; i++) {
+ int j = 0;
+
+#ifdef __SSE2__
+
+ if(useHslLin) {
+ for (; j < W_L - 3; j += 4) {
+ _mm_storeu_ps(&luminance[i][j], LVFU(luminance[i][j]) + pondv * (LIMV(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv) ));
+ }
+ } else {
+ for (; j < W_L - 3; j += 4) {
+ _mm_storeu_ps(&luminance[i][j], LVFU(luminance[i][j]) + pondv * xlogf(LIMV(LVFU(src[i][j]) / LVFU(out[i][j]), limMinv, limMaxv) ) / xlogf(elogtv));
+ }
+ }
+
+#endif
+
+ if(useHslLin) {
+ for (; j < W_L; j++) {
+ luminance[i][j] += pond * (LIM(src[i][j] / out[i][j], ilimD, limD));
+ }
+ } else {
+ for (; j < W_L; j++) {
+ luminance[i][j] += pond * xlogf(LIM(src[i][j] / out[i][j], ilimD, limD)) / log(elogt); // /logt ?
+ }
+ }
+ }
+ }
+ }
+
+ delete [] outBuffer;
+ delete [] srcBuffer;
+
+ mean = 0.f;
+ stddv = 0.f;
+ // I call mean_stddv2 instead of mean_stddv ==> logBetaGain
+
+ mean_stddv2( luminance, mean, stddv, W_L, H_L, maxtr, mintr);
+// printf("mean=%f std=%f delta=%f maxtr=%f mintr=%f\n", mean, stddv, delta, maxtr, mintr);
+
+ // mean_stddv( luminance, mean, stddv, W_L, H_L, logBetaGain, maxtr, mintr);
+ if (dehatransmissionCurve && mean != 0.f && stddv != 0.f) { //if curve
+ float asig = 0.166666f / stddv;
+ float bsig = 0.5f - asig * mean;
+ float amax = 0.333333f / (maxtr - mean - stddv);
+ float bmax = 1.f - amax * maxtr;
+ float amin = 0.333333f / (mean - stddv - mintr);
+ float bmin = -amin * mintr;
+
+ asig *= 500.f;
+ bsig *= 500.f;
+ amax *= 500.f;
+ bmax *= 500.f;
+ amin *= 500.f;
+ bmin *= 500.f;
+#ifdef _OPENMP
+ #pragma omp parallel
+#endif
+ {
+ float absciss;
+#ifdef _OPENMP
+ #pragma omp for schedule(dynamic,16)
+#endif
+
+ for (int i = 0; i < H_L; i++ )
+ for (int j = 0; j < W_L; j++) { //for mintr to maxtr evalate absciss in function of original transmission
+ if (LIKELY(fabsf(luminance[i][j] - mean) < stddv)) {
+ absciss = asig * luminance[i][j] + bsig;
+ } else if (luminance[i][j] >= mean) {
+ absciss = amax * luminance[i][j] + bmax;
+ } else { /*if(luminance[i][j] <= mean - stddv)*/
+ absciss = amin * luminance[i][j] + bmin;
+ }
+
+ luminance[i][j] *= (-1.f + 4.f * dehatransmissionCurve[absciss]); //new transmission
+ }
+ }
+
+ // median filter on transmission ==> reduce artifacts
+ if (deh.medianmap) {
+ int wid = W_L;
+ int hei = H_L;
+ float *tmL[hei] ALIGNED16;
+ float *tmLBuffer = new float[wid * hei];
+ int borderL = 1;
+
+ for (int i = 0; i < hei; i++) {
+ tmL[i] = &tmLBuffer[i * wid];
+ }
+
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+
+ for (int i = borderL; i < hei - borderL; i++) {
+ float pp[9], temp;
+
+ for (int j = borderL; j < wid - borderL; j++) {
+ med3(luminance[i][j], luminance[i - 1][j], luminance[i + 1][j], luminance[i][j + 1], luminance[i][j - 1], luminance[i - 1][j - 1], luminance[i - 1][j + 1], luminance[i + 1][j - 1], luminance[i + 1][j + 1], tmL[i][j]); //3x3
+ }
+ }
+
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+
+ for (int i = borderL; i < hei - borderL; i++ ) {
+ for (int j = borderL; j < wid - borderL; j++) {
+ luminance[i][j] = tmL[i][j];
+ }
+ }
+
+ delete [] tmLBuffer;
+
+ }
+
+ // I call mean_stddv2 instead of mean_stddv ==> logBetaGain
+ // mean_stddv( luminance, mean, stddv, W_L, H_L, 1.f, maxtr, mintr);
+ mean_stddv2( luminance, mean, stddv, W_L, H_L, maxtr, mintr);
+
+ }
+
+ float epsil = 0.1f;
+
+ mini = mean - vart * stddv;
+
+ if (mini < mintr) {
+ mini = mintr + epsil;
+ }
+
+ maxi = mean + vart * stddv;
+
+ if (maxi > maxtr) {
+ maxi = maxtr - epsil;
+ }
+
+ delta = maxi - mini;
+ // printf("maxi=%f mini=%f mean=%f std=%f delta=%f maxtr=%f mintr=%f\n", maxi, mini, mean, stddv, delta, maxtr, mintr);
+
+ if ( !delta ) {
+ delta = 1.0f;
+ }
+
+ float cdfactor = gain2 * 32768.f / delta;
+ maxCD = -9999999.f;
+ minCD = 9999999.f;
+
+
+
+
+#ifdef _OPENMP
+ #pragma omp parallel
+#endif
+ {
+ float cdmax = -999999.f, cdmin = 999999.f;
+
+#ifdef _OPENMP
+ #pragma omp for
+#endif
+
+ for ( int i = 0; i < H_L; i ++ )
+ for (int j = 0; j < W_L; j++) {
+ // float cd = cdfactor * ( luminance[i][j] * logBetaGain - mini ) + offse;
+ float cd = cdfactor * ( luminance[i][j] - mini ) + offse;
+
+ if(cd > cdmax) {
+ cdmax = cd;
+ }
+
+ if(cd < cdmin) {
+ cdmin = cd;
+ }
+
+ float str = strength;
+
+ if(lhutili) { // S=f(H)
+ {
+ float HH = exLuminance[i][j];
+ float valparam;
+
+ if(useHsl || useHslLin) {
+ valparam = float((shcurve->getVal(HH) - 0.5f));
+ } else {
+ valparam = float((shcurve->getVal(Color::huelab_to_huehsv2(HH)) - 0.5f));
+ }
+
+ str *= (1.f + 2.f * valparam);
+ }
+ }
+
+ // if(exLuminance[i][j] > 65535.f*hig && higplus) str *= hig;
+ luminance[i][j] = clipretinex( cd, 0.f, 32768.f ) * str + (1.f - str) * originalLuminance[i][j];
+ }
+
+#ifdef _OPENMP
+ #pragma omp critical
+#endif
+ {
+ maxCD = maxCD > cdmax ? maxCD : cdmax;
+ minCD = minCD < cdmin ? minCD : cdmin;
+ }
+
+ }
+ // printf("cdmin=%f cdmax=%f\n",minCD, maxCD);
+ Tmean = mean;
+ Tsigma = stddv;
+ Tmin = mintr;
+ Tmax = maxtr;
+
+ if (shcurve) {
+ delete shcurve;
+ }
+
+ }
+}
+
+}
diff --git a/rtengine/ipsharpen.cc b/rtengine/ipsharpen.cc
index 302c07655..928ffe5bd 100644
--- a/rtengine/ipsharpen.cc
+++ b/rtengine/ipsharpen.cc
@@ -140,16 +140,13 @@ void ImProcFunctions::deconvsharpening (LabImage* lab, float** b2, SharpeningPar
#pragma omp parallel
#endif
{
- AlignedBufferMP buffer(max(W, H));
-
float damping = sharpenParam.deconvdamping / 5.0;
bool needdamp = sharpenParam.deconvdamping > 0;
for (int k = 0; k < sharpenParam.deconviter; k++) {
// apply blur function (gaussian blur)
- gaussHorizontal (tmpI, tmp, buffer, W, H, sharpenParam.deconvradius / scale);
- gaussVertical (tmp, tmp, buffer, W, H, sharpenParam.deconvradius / scale);
+ gaussianBlur (tmpI, tmp, W, H, sharpenParam.deconvradius / scale);
if (!needdamp) {
#ifdef _OPENMP
@@ -165,8 +162,7 @@ void ImProcFunctions::deconvsharpening (LabImage* lab, float** b2, SharpeningPar
dcdamping (tmp, lab->L, damping, W, H);
}
- gaussHorizontal (tmp, tmp, buffer, W, H, sharpenParam.deconvradius / scale);
- gaussVertical (tmp, tmp, buffer, W, H, sharpenParam.deconvradius / scale);
+ gaussianBlur (tmp, tmp, W, H, sharpenParam.deconvradius / scale);
#ifdef _OPENMP
#pragma omp for
@@ -238,17 +234,11 @@ void ImProcFunctions::sharpening (LabImage* lab, float** b2, SharpeningParams &s
#endif
{
-
- AlignedBufferMP buffer(max(W, H));
-
if (sharpenParam.edgesonly == false) {
-
- gaussHorizontal (lab->L, b2, buffer, W, H, sharpenParam.radius / scale);
- gaussVertical (b2, b2, buffer, W, H, sharpenParam.radius / scale);
+ gaussianBlur (lab->L, b2, W, H, sharpenParam.radius / scale);
} else {
bilateral (lab->L, (float**)b3, b2, W, H, sharpenParam.edges_radius / scale, sharpenParam.edges_tolerance, multiThread);
- gaussHorizontal (b3, b2, buffer, W, H, sharpenParam.radius / scale);
- gaussVertical (b2, b2, buffer, W, H, sharpenParam.radius / scale);
+ gaussianBlur (b3, b2, W, H, sharpenParam.radius / scale);
}
float** base = lab->L;
@@ -1390,17 +1380,13 @@ void ImProcFunctions::deconvsharpeningcam (CieImage* ncie, float** b2)
#pragma omp parallel
#endif
{
- AlignedBufferMP buffer(max(W, H));
-
-
float damping = params->sharpening.deconvdamping / 5.0;
bool needdamp = params->sharpening.deconvdamping > 0;
for (int k = 0; k < params->sharpening.deconviter; k++) {
// apply blur function (gaussian blur)
- gaussHorizontal (tmpI, tmp, buffer, W, H, params->sharpening.deconvradius / scale);
- gaussVertical (tmp, tmp, buffer, W, H, params->sharpening.deconvradius / scale);
+ gaussianBlur (tmpI, tmp, W, H, params->sharpening.deconvradius / scale);
if (!needdamp) {
#ifdef _OPENMP
@@ -1416,8 +1402,7 @@ void ImProcFunctions::deconvsharpeningcam (CieImage* ncie, float** b2)
dcdamping (tmp, ncie->sh_p, damping, W, H);
}
- gaussHorizontal (tmp, tmp, buffer, W, H, params->sharpening.deconvradius / scale);
- gaussVertical (tmp, tmp, buffer, W, H, params->sharpening.deconvradius / scale);
+ gaussianBlur (tmp, tmp, W, H, params->sharpening.deconvradius / scale);
#ifdef _OPENMP
@@ -1493,17 +1478,11 @@ void ImProcFunctions::sharpeningcam (CieImage* ncie, float** b2)
#endif
{
-
- AlignedBufferMP buffer(max(W, H));
-
if (params->sharpening.edgesonly == false) {
-
- gaussHorizontal (ncie->sh_p, b2, buffer, W, H, params->sharpening.radius / scale);
- gaussVertical (b2, b2, buffer, W, H, params->sharpening.radius / scale);
+ gaussianBlur (ncie->sh_p, b2, W, H, params->sharpening.radius / scale);
} else {
bilateral (ncie->sh_p, (float**)b3, b2, W, H, params->sharpening.edges_radius / scale, params->sharpening.edges_tolerance, multiThread);
- gaussHorizontal (b3, b2, buffer, W, H, params->sharpening.radius / scale);
- gaussVertical (b2, b2, buffer, W, H, params->sharpening.radius / scale);
+ gaussianBlur (b3, b2, W, H, params->sharpening.radius / scale);
}
float** base = ncie->sh_p;
diff --git a/rtengine/previewimage.cc b/rtengine/previewimage.cc
index b2f76a9ad..86333bc3e 100644
--- a/rtengine/previewimage.cc
+++ b/rtengine/previewimage.cc
@@ -112,6 +112,9 @@ PreviewImage::PreviewImage (const Glib::ustring &fname, const Glib::ustring &ext
rtengine::Image8 *output = NULL;
const unsigned char *data = NULL;
int fw, fh;
+ LUTf cdcurve;
+ bool dehacontlutili = false;
+
procparams::ProcParams params;
/*rtengine::RAWParams raw;
rtengine::LensProfParams lensProf;
diff --git a/rtengine/procevents.h b/rtengine/procevents.h
index cb2868dd6..4dbbad07c 100644
--- a/rtengine/procevents.h
+++ b/rtengine/procevents.h
@@ -22,6 +22,10 @@
namespace rtengine
{
+
+
+
+// Aligned so the first entry starts on line 30
enum ProcEvent {
EvPhotoLoaded = 0,
EvProfileLoaded = 1,
@@ -226,7 +230,6 @@ enum ProcEvent {
EvDPDNredchro = 200,
EvDPDNbluechro = 201,
EvDPDNmet = 202,
-// EvDPDNperform=201,
EvDemosaicLMMSEIter = 203,
EvCATbadpix = 204,
EvCATAutoAdap = 205,
@@ -278,15 +281,13 @@ enum ProcEvent {
EvDirPyrEqualizerSkin = 251,
EvDirPyrEqlgamutlab = 252,
EvDirPyrEqualizerHueskin = 253,
-// EvDirPyrEqualizeralg=254,
- EvDPDNmedian = 254,
+ EvDPDNmedian = 254, // EvDirPyrEqualizeralg=254,
EvDPDNmedmet = 255,
EvColorToningEnabled = 256,
EvColorToningColor = 257,
EvColorToningOpacity = 258,
- EvColorToningCLCurve = 259,
+ EvColorToningCLCurve = 259, // EvColorToningTwocolor=259,
EvColorToningMethod = 260,
-// EvColorToningTwocolor=259,
EvColorToningLLCurve = 261,
EvColorToningredlow = 262,
EvColorToninggreenlow = 263,
@@ -432,9 +433,29 @@ enum ProcEvent {
EvWavedgeampli = 403,
EvWavlev3nois = 404,
EvWavNPmet = 405,
+ EvretinexMethod = 406,
+ EvLneigh = 407,
+ EvLgain = 408,
+ EvLoffs = 409,
+ EvLstr = 410,
+ EvLscal = 411,
+ EvLvart = 412,
+ EvLCDCurve = 413,
+ EvRetinextransmission = 414,
+ EvRetinexEnabled = 415,
+ EvRetinexmedianmap = 416,
+ EvLlimd = 417,
+ EvretinexColorSpace = 418, // 418 if we want a separate history entry "Retinex - Color space", 406 if we don't
+ EvLCDHCurve = 419,
+ Evretinexgamma = 420,
+ EvLgam = 421,
+ EvLslope = 422,
+ EvLhighl = 423,
+ EvLbaselog = 424,
+// EvLgrbl = 425,
+ EvRetinexlhcurve = 425,
NUMOFEVENTS
};
}
#endif
-
diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc
index 32506cb0c..eaf90d5c2 100644
--- a/rtengine/procparams.cc
+++ b/rtengine/procparams.cc
@@ -116,6 +116,62 @@ void CropParams::mapToResized(int resizedWidth, int resizedHeight, int scale, in
}
}
+RetinexParams::RetinexParams ()
+{
+ setDefaults ();
+}
+
+void RetinexParams::getDefaulttransmissionCurve(std::vector &curve)
+{
+ double v[12] = { 0.00, 0.34, 0.35, 0.35,
+ 0.60, 0.75, 0.35, 0.35,
+ 1.00, 0.50, 0.35, 0.35,
+ };
+
+
+ curve.resize(13);
+ curve.at(0 ) = double(FCT_MinMaxCPoints);
+
+ for (size_t i = 1; i < curve.size(); ++i) {
+ curve.at(i) = v[i - 1];
+ }
+}
+
+void RetinexParams::setDefaults()
+{
+ enabled = false;
+ str = 20;
+ scal = 3;
+ gam = 1.30;
+ slope = 3.;
+ neigh = 80;
+ gain = 50;
+ offs = 0;
+ vart = 200;
+ limd = 8;
+ highl = 10;
+ baselog = 2.71828;
+// grbl = 50;
+ retinexMethod = "high";
+ retinexcolorspace = "Lab";
+ gammaretinex = "none";
+ medianmap = false;
+ cdcurve.clear();
+ cdcurve.push_back(DCT_Linear);
+ cdHcurve.clear();
+ cdHcurve.push_back(DCT_Linear);
+ lhcurve.clear();
+ lhcurve.push_back(DCT_Linear);
+
+ getDefaulttransmissionCurve(transmissionCurve);
+}
+
+void RetinexParams::getCurves(RetinextransmissionCurve &transmissionCurveLUT) const
+{
+ transmissionCurveLUT.Set(this->transmissionCurve);
+}
+
+
ColorToningParams::ColorToningParams () : hlColSat(60, 80, false), shadowsColSat(80, 208, false)
{
setDefaults();
@@ -1378,6 +1434,98 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol
keyFile.set_double_list("Exposure", "Curve2", tcurve);
}
+ //save retinex
+
+ if (!pedited || pedited->retinex.str) {
+ keyFile.set_integer ("Retinex", "Str", retinex.str);
+ }
+
+ if (!pedited || pedited->retinex.scal) {
+ keyFile.set_integer ("Retinex", "Scal", retinex.scal);
+ }
+
+ if (!pedited || pedited->retinex.gam) {
+ keyFile.set_double ("Retinex", "Gam", retinex.gam);
+ }
+
+ if (!pedited || pedited->retinex.slope) {
+ keyFile.set_double ("Retinex", "Slope", retinex.slope);
+ }
+
+ if (!pedited || pedited->retinex.enabled) {
+ keyFile.set_boolean ("Retinex", "Enabled", retinex.enabled);
+ }
+
+ if (!pedited || pedited->retinex.medianmap) {
+ keyFile.set_boolean ("Retinex", "Median", retinex.medianmap);
+ }
+
+
+
+ if (!pedited || pedited->retinex.neigh) {
+ keyFile.set_integer ("Retinex", "Neigh", retinex.neigh);
+ }
+
+ if (!pedited || pedited->retinex.gain) {
+ keyFile.set_integer ("Retinex", "Gain", retinex.gain);
+ }
+
+ if (!pedited || pedited->retinex.offs) {
+ keyFile.set_integer ("Retinex", "Offs", retinex.offs);
+ }
+
+ if (!pedited || pedited->retinex.vart) {
+ keyFile.set_integer ("Retinex", "Vart", retinex.vart);
+ }
+
+ if (!pedited || pedited->retinex.limd) {
+ keyFile.set_integer ("Retinex", "Limd", retinex.limd);
+ }
+
+ if (!pedited || pedited->retinex.highl) {
+ keyFile.set_integer ("Retinex", "highl", retinex.highl);
+ }
+
+ if (!pedited || pedited->retinex.baselog) {
+ keyFile.set_double ("Retinex", "baselog", retinex.baselog);
+ }
+
+// if (!pedited || pedited->retinex.grbl) {
+// keyFile.set_integer ("Retinex", "grbl", retinex.grbl);
+// }
+
+ if (!pedited || pedited->retinex.retinexMethod) {
+ keyFile.set_string ("Retinex", "RetinexMethod", retinex.retinexMethod);
+ }
+
+ if (!pedited || pedited->retinex.retinexcolorspace) {
+ keyFile.set_string ("Retinex", "Retinexcolorspace", retinex.retinexcolorspace);
+ }
+
+ if (!pedited || pedited->retinex.gammaretinex) {
+ keyFile.set_string ("Retinex", "Gammaretinex", retinex.gammaretinex);
+ }
+
+ if (!pedited || pedited->retinex.cdcurve) {
+ Glib::ArrayHandle cdcurve = retinex.cdcurve;
+ keyFile.set_double_list("Retinex", "CDCurve", cdcurve);
+ }
+
+ if (!pedited || pedited->retinex.cdHcurve) {
+ Glib::ArrayHandle cdHcurve = retinex.cdHcurve;
+ keyFile.set_double_list("Retinex", "CDHCurve", cdHcurve);
+ }
+
+ if (!pedited || pedited->retinex.lhcurve) {
+ Glib::ArrayHandle lhcurve = retinex.lhcurve;
+ keyFile.set_double_list("Retinex", "LHCurve", lhcurve);
+ }
+
+ if (!pedited || pedited->retinex.transmissionCurve) {
+ Glib::ArrayHandle transmissionCurve = retinex.transmissionCurve;
+ keyFile.set_double_list("Retinex", "TransmissionCurve", transmissionCurve);
+ }
+
// save channel mixer
if (!pedited || pedited->chmixer.red[0] || pedited->chmixer.red[1] || pedited->chmixer.red[2]) {
Glib::ArrayHandle rmix (chmixer.red, 3, Glib::OWNERSHIP_NONE);
@@ -3636,6 +3784,179 @@ int ProcParams::load (Glib::ustring fname, ParamsEdited* pedited)
}
}
+ //load retinex
+ if (keyFile.has_group ("Retinex")) {
+
+ if (keyFile.has_key ("Retinex", "Median")) {
+ retinex.medianmap = keyFile.get_boolean ("Retinex", "Median");
+
+ if (pedited) {
+ pedited->retinex.medianmap = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "Retinexmet")) {
+ retinex.retinexMethod = keyFile.get_string ("Retinex", "Retinexmet");
+
+ if (pedited) {
+ pedited->retinex.retinexMethod = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "Retinexcolorspace")) {
+ retinex.retinexcolorspace = keyFile.get_string ("Retinex", "Retinexcolorspace");
+
+ if (pedited) {
+ pedited->retinex.retinexcolorspace = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "Gammaretinex")) {
+ retinex.gammaretinex = keyFile.get_string ("Retinex", "Gammaretinex");
+
+ if (pedited) {
+ pedited->retinex.gammaretinex = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "Enabled")) {
+ retinex.enabled = keyFile.get_boolean ("Retinex", "Enabled");
+
+ if (pedited) {
+ pedited->retinex.enabled = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "Neigh")) {
+ retinex.neigh = keyFile.get_integer ("Retinex", "Neigh");
+
+ if (pedited) {
+ pedited->retinex.neigh = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "Str")) {
+ retinex.str = keyFile.get_integer ("Retinex", "Str");
+
+ if (pedited) {
+ pedited->retinex.str = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "Scal")) {
+ retinex.scal = keyFile.get_integer ("Retinex", "Scal");
+
+ if (pedited) {
+ pedited->retinex.scal = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "Gam")) {
+ retinex.gam = keyFile.get_double ("Retinex", "Gam");
+
+ if (pedited) {
+ pedited->retinex.gam = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "Slope")) {
+ retinex.slope = keyFile.get_double ("Retinex", "Slope");
+
+ if (pedited) {
+ pedited->retinex.slope = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "Gain")) {
+ retinex.gain = keyFile.get_integer ("Retinex", "Gain");
+
+ if (pedited) {
+ pedited->retinex.gain = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "Offs")) {
+ retinex.offs = keyFile.get_integer ("Retinex", "Offs");
+
+ if (pedited) {
+ pedited->retinex.offs = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "Vart")) {
+ retinex.vart = keyFile.get_integer ("Retinex", "Vart");
+
+ if (pedited) {
+ pedited->retinex.vart = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "Limd")) {
+ retinex.limd = keyFile.get_integer ("Retinex", "Limd");
+
+ if (pedited) {
+ pedited->retinex.limd = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "highl")) {
+ retinex.highl = keyFile.get_integer ("Retinex", "highl");
+
+ if (pedited) {
+ pedited->retinex.highl = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "baselog")) {
+ retinex.baselog = keyFile.get_double ("Retinex", "baselog");
+
+ if (pedited) {
+ pedited->retinex.baselog = true;
+ }
+ }
+
+ /* if (keyFile.has_key ("Retinex", "grbl")) {
+ retinex.grbl = keyFile.get_integer ("Retinex", "grbl");
+
+ if (pedited) {
+ pedited->retinex.grbl = true;
+ }
+ }
+ */
+ if (keyFile.has_key ("Retinex", "CDCurve")) {
+ retinex.cdcurve = keyFile.get_double_list ("Retinex", "CDCurve");
+
+ if (pedited) {
+ pedited->retinex.cdcurve = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "CDHCurve")) {
+ retinex.cdHcurve = keyFile.get_double_list ("Retinex", "CDHCurve");
+
+ if (pedited) {
+ pedited->retinex.cdHcurve = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "LHCurve")) {
+ retinex.lhcurve = keyFile.get_double_list ("Retinex", "LHCurve");
+
+ if (pedited) {
+ pedited->retinex.lhcurve = true;
+ }
+ }
+
+ if (keyFile.has_key ("Retinex", "TransmissionCurve")) {
+ retinex.transmissionCurve = keyFile.get_double_list ("Retinex", "TransmissionCurve");
+
+ if (pedited) {
+ pedited->retinex.transmissionCurve = true;
+ }
+ }
+ }
+
+
// load luma curve
if (keyFile.has_group ("Luminance Curve")) {
if (keyFile.has_key ("Luminance Curve", "Brightness")) {
@@ -6995,6 +7316,27 @@ bool ProcParams::operator== (const ProcParams& other)
&& toneCurve.curveMode2 == other.toneCurve.curveMode2
&& toneCurve.hrenabled == other.toneCurve.hrenabled
&& toneCurve.method == other.toneCurve.method
+ && retinex.cdcurve == other.retinex.cdcurve
+ && retinex.cdHcurve == other.retinex.cdHcurve
+ && retinex.lhcurve == other.retinex.lhcurve
+ && retinex.transmissionCurve == other.retinex.transmissionCurve
+ && retinex.str == other.retinex.str
+ && retinex.scal == other.retinex.scal
+ && retinex.gam == other.retinex.gam
+ && retinex.slope == other.retinex.slope
+ && retinex.neigh == other.retinex.neigh
+ && retinex.gain == other.retinex.gain
+ && retinex.limd == other.retinex.limd
+ && retinex.highl == other.retinex.highl
+ && retinex.baselog == other.retinex.baselog
+// && retinex.grbl == other.retinex.grbl
+ && retinex.offs == other.retinex.offs
+ && retinex.retinexMethod == other.retinex.retinexMethod
+ && retinex.retinexcolorspace == other.retinex.retinexcolorspace
+ && retinex.gammaretinex == other.retinex.gammaretinex
+ && retinex.vart == other.retinex.vart
+ && retinex.medianmap == other.retinex.medianmap
+ && retinex.enabled == other.retinex.enabled
&& labCurve.lcurve == other.labCurve.lcurve
&& labCurve.acurve == other.labCurve.acurve
&& labCurve.bcurve == other.labCurve.bcurve
diff --git a/rtengine/procparams.h b/rtengine/procparams.h
index ad8c963e8..d46fd4181 100644
--- a/rtengine/procparams.h
+++ b/rtengine/procparams.h
@@ -39,6 +39,7 @@ class WavOpacityCurveRG;
class WavOpacityCurveBY;
class WavOpacityCurveW;
class WavOpacityCurveWL;
+class RetinextransmissionCurve;
namespace procparams
{
@@ -260,6 +261,40 @@ public:
void setDefaults();
static bool HLReconstructionNecessary(LUTu &histRedRaw, LUTu &histGreenRaw, LUTu &histBlueRaw);
};
+/**
+ * Parameters of Retinex
+ */
+class RetinexParams
+{
+
+public:
+ bool enabled;
+ std::vector cdcurve;
+ std::vector cdHcurve;
+ std::vector lhcurve;
+ std::vector transmissionCurve;
+ int str;
+ int scal;
+ double gam;
+ double slope;
+ int neigh;
+ int gain;
+ int offs;
+ Glib::ustring retinexMethod;
+ Glib::ustring retinexcolorspace;
+ Glib::ustring gammaretinex;
+ int vart;
+ int limd;
+ int highl;
+ double baselog;
+// int grbl;
+ bool medianmap;
+ RetinexParams ();
+ void setDefaults();
+ void getCurves(RetinextransmissionCurve &transmissionCurveLUT) const;
+
+ static void getDefaulttransmissionCurve(std::vector &curve);
+};
/**
@@ -1188,6 +1223,7 @@ class ProcParams
public:
ToneCurveParams toneCurve; ///< Tone curve parameters
LCurveParams labCurve; ///< CIELAB luminance curve parameters
+ RetinexParams retinex; ///< Retinex parameters
RGBCurvesParams rgbCurves; ///< RGB curves parameters
ColorToningParams colorToning; ///< Color Toning parameters
SharpeningParams sharpening; ///< Sharpening parameters
diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc
index b425a9f88..2c0d8ad2f 100644
--- a/rtengine/rawimagesource.cc
+++ b/rtengine/rawimagesource.cc
@@ -31,7 +31,6 @@
#include "curves.h"
#include "dfmanager.h"
#include "ffmanager.h"
-#include "slicer.h"
#include "../rtgui/options.h"
#include "dcp.h"
#include "rt_math.h"
@@ -40,6 +39,10 @@
#include
#endif
#include "opthelper.h"
+#include "StopWatch.h"
+#define clipretinex( val, minv, maxv ) (( val = (val < minv ? minv : val ) ) > maxv ? maxv : val )
+#undef CLIPD
+#define CLIPD(a) ((a)>0.0f?((a)<1.0f?(a):1.0f):0.0f)
namespace rtengine
{
@@ -550,7 +553,9 @@ int RawImageSource::interpolateBadPixelsBayer( PixelsMap &bitmapBads )
{
static const float eps = 1.f;
int counter = 0;
+#ifdef _OPENMP
#pragma omp parallel for reduction(+:counter) schedule(dynamic,16)
+#endif
for( int row = 2; row < H - 2; row++ ) {
for(int col = 2; col < W - 2; col++ ) {
@@ -665,7 +670,9 @@ int RawImageSource::interpolateBadPixelsNColours( PixelsMap &bitmapBads, const i
{
static const float eps = 1.f;
int counter = 0;
+#ifdef _OPENMP
#pragma omp parallel for reduction(+:counter) schedule(dynamic,16)
+#endif
for( int row = 2; row < H - 2; row++ ) {
for(int col = 2; col < W - 2; col++ ) {
@@ -717,7 +724,7 @@ int RawImageSource::interpolateBadPixelsNColours( PixelsMap &bitmapBads, const i
}
}
- if (LIKELY(norm[0] > 0.f)) { // This means, we found at least one pair of valid pixels in the steps above, likelyhood of this case is about 99.999%
+ if (LIKELY(norm[0] > 0.f)) { // This means, we found at least one pair of valid pixels in the steps above, likelihood of this case is about 99.999%
for(int c = 0; c < colours; c++) {
rawData[row][col * colours + c] = wtdsum[c] / (2.f * norm[c]); //gradient weighted average, Factor of 2.f is an optimization to avoid multiplications in former steps
}
@@ -759,13 +766,15 @@ int RawImageSource::interpolateBadPixelsNColours( PixelsMap &bitmapBads, const i
return counter; // Number of interpolated pixels.
}
/* interpolateBadPixelsXtrans: correct raw pixels looking at the bitmap
- * takes into consideration if there are multiple bad pixels in the neighborhood
+ * takes into consideration if there are multiple bad pixels in the neighbourhood
*/
int RawImageSource::interpolateBadPixelsXtrans( PixelsMap &bitmapBads )
{
static const float eps = 1.f;
int counter = 0;
+#ifdef _OPENMP
#pragma omp parallel for reduction(+:counter) schedule(dynamic,16)
+#endif
for( int row = 2; row < H - 2; row++ ) {
for(int col = 2; col < W - 2; col++ ) {
@@ -787,10 +796,10 @@ int RawImageSource::interpolateBadPixelsXtrans( PixelsMap &bitmapBads )
if(pixelColor == 1) {
// green channel. A green pixel can either be a solitary green pixel or a member of a 2x2 square of green pixels
if(ri->XTRANSFC(row, col - 1) == ri->XTRANSFC(row, col + 1)) {
- // If left and right neighbour have same color, then this is a solitary green pixel
- // For these the following pixels will be used for interpolation. Pixel to be interpolated is in center and marked with a P.
+ // If left and right neighbour have same colour, then this is a solitary green pixel
+ // For these the following pixels will be used for interpolation. Pixel to be interpolated is in centre and marked with a P.
// Pairs of pixels used in this step are numbered. A pair will be used if none of the pixels of the pair is marked bad
- // 0 means, the pixel has a different color and will not be used
+ // 0 means, the pixel has a different colour and will not be used
// 0 1 0 2 0
// 3 5 0 6 4
// 0 0 P 0 0
@@ -829,12 +838,14 @@ int RawImageSource::interpolateBadPixelsXtrans( PixelsMap &bitmapBads )
// this is a member of a 2x2 square of green pixels
// For these the following pixels will be used for interpolation. Pixel to be interpolated is at position P in the example.
// Pairs of pixels used in this step are numbered. A pair will be used if none of the pixels of the pair is marked bad
- // 0 means, the pixel has a different color and will not be used
+ // 0 means, the pixel has a different colour and will not be used
// 1 0 0 3
// 0 P 2 0
// 0 2 1 0
// 3 0 0 0
- int offset1 = ri->XTRANSFC(row - 1, col - 1) == ri->XTRANSFC(row + 1, col + 1) ? 1 : -1; // pixels marked 1 in above example. Distance to P is sqrt(2) => weighting is 0.70710678f
+
+ // pixels marked 1 in above example. Distance to P is sqrt(2) => weighting is 0.70710678f
+ int offset1 = ri->XTRANSFC(row - 1, col - 1) == ri->XTRANSFC(row + 1, col + 1) ? 1 : -1;
if( !(bitmapBads.get(col - offset1, row - 1) || bitmapBads.get(col + offset1, row + 1))) {
float dirwt = 0.70710678f / ( fabsf( rawData[row - 1][col - offset1] - rawData[row + 1][col + offset1]) + eps);
@@ -842,6 +853,7 @@ int RawImageSource::interpolateBadPixelsXtrans( PixelsMap &bitmapBads )
norm += dirwt;
}
+ // pixels marked 2 in above example. Distance to P is 1 => weighting is 1.f
int offsety = (ri->XTRANSFC(row - 1, col) != 1 ? 1 : -1);
int offsetx = offset1 * offsety;
@@ -865,9 +877,9 @@ int RawImageSource::interpolateBadPixelsXtrans( PixelsMap &bitmapBads )
}
} else {
// red and blue channel.
- // Each red or blue pixel has exactly one neigbour of same color in distance 2 and four neighbours of same color which can be reached by a move of a knight in chess.
+ // Each red or blue pixel has exactly one neighbour of same colour in distance 2 and four neighbours of same colour which can be reached by a move of a knight in chess.
// For the distance 2 pixel (marked with an X) we generate a virtual counterpart (marked with a V)
- // For red and blue channel following pixels will be used for interpolation. Pixel to be interpolated is in center and marked with a P.
+ // For red and blue channel following pixels will be used for interpolation. Pixel to be interpolated is in centre and marked with a P.
// Pairs of pixels used in this step are numbered except for distance 2 pixels which are marked X and V. A pair will be used if none of the pixels of the pair is marked bad
// 0 1 0 0 0 0 0 X 0 0 remaining cases are symmetric
// 0 0 0 0 2 1 0 0 0 2
@@ -875,12 +887,12 @@ int RawImageSource::interpolateBadPixelsXtrans( PixelsMap &bitmapBads )
// 0 0 0 0 1 0 0 0 0 0
// 0 2 0 0 0 0 2 V 1 0
- // Find two knight moves landing on a pixel of same color as the pixel to be interpolated.
+ // Find two knight moves landing on a pixel of same colour as the pixel to be interpolated.
// If we look at first and last row of 5x5 square, we will find exactly two knight pixels.
- // Additionally we know that the column of this pixel has 1 or -1 horizontal distance to the center pixel
+ // Additionally we know that the column of this pixel has 1 or -1 horizontal distance to the centre pixel
// When we find a knight pixel, we get its counterpart, which has distance (+-3,+-3), where the signs of distance depend on the corner of the found knight pixel.
// These pixels are marked 1 or 2 in above examples. Distance to P is sqrt(5) => weighting is 0.44721359f
- // The following loop simply scans the four possible places. To keep things simple, it doesn't stop after finding two knight pixels, because it will not find more than two
+ // The following loop simply scans the four possible places. To keep things simple, it does not stop after finding two knight pixels, because it will not find more than two
for(int d1 = -2, offsety = 3; d1 <= 2; d1 += 4, offsety -= 6) {
for(int d2 = -1, offsetx = 3; d2 < 1; d2 += 2, offsetx -= 6) {
if(ri->XTRANSFC(row + d1, col + d2) == pixelColor) {
@@ -926,10 +938,8 @@ int RawImageSource::interpolateBadPixelsXtrans( PixelsMap &bitmapBads )
norm += dirwt;
}
- if (LIKELY(norm > 0.f)) { // This means, we found at least one pair of valid pixels in the steps above, likelyhood of this case is about 99.999%
+ if (LIKELY(norm > 0.f)) { // This means, we found at least one pair of valid pixels in the steps above, likelihood of this case is about 99.999%
rawData[row][col] = wtdsum / (2.f * norm); //gradient weighted average, Factor of 2.f is an optimization to avoid multiplications in former steps
-//#pragma omp critical
-// printf("%s Pixel at (col/row) : (%4d/%4d) : Original : %f, interpolated: %f\n",pixelColor == 0 ? "Red " : pixelColor==1 ? "Green" : "Blue ", col-7,row-7,oldval, rawData[row][col]);
counter++;
}
}
@@ -940,95 +950,122 @@ int RawImageSource::interpolateBadPixelsXtrans( PixelsMap &bitmapBads )
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/* Search for hot or dead pixels in the image and update the map
- * For each pixel compare its value to the average of similar color surrounding
+ * For each pixel compare its value to the average of similar colour surrounding
* (Taken from Emil Martinec idea)
- * (Optimized by Ingo Weyrich 2013)
+ * (Optimized by Ingo Weyrich 2013 and 2015)
*/
-int RawImageSource::findHotDeadPixels( PixelsMap &bpMap, float thresh, bool findHotPixels, bool findDeadPixels )
+SSEFUNCTION int RawImageSource::findHotDeadPixels( PixelsMap &bpMap, float thresh, bool findHotPixels, bool findDeadPixels )
{
- float varthresh = (20.0 * (thresh / 100.0) + 1.0 );
-
- // counter for dead or hot pixels
- int counter = 0;
+ float varthresh = (20.0 * (thresh / 100.0) + 1.0 ) / 24.f;
// allocate temporary buffer
float (*cfablur);
cfablur = (float (*)) malloc (H * W * sizeof * cfablur);
+ // counter for dead or hot pixels
+ int counter = 0;
+
+#ifdef _OPENMP
#pragma omp parallel
+#endif
{
- #pragma omp for
+#ifdef _OPENMP
+ #pragma omp for schedule(dynamic,16) nowait
+#endif
- for (int i = 0; i < H; i++) {
- int iprev, inext, jprev, jnext;
- float p[9], temp;
+ for (int i = 2; i < H - 2; i++) {
+ float p[9], temp; // we need this for med3x3 macro
- if (i < 2) {
- iprev = i + 2;
- } else {
- iprev = i - 2;
- }
-
- if (i > H - 3) {
- inext = i - 2;
- } else {
- inext = i + 2;
- }
-
- for (int j = 0; j < W; j++) {
- if (j < 2) {
- jprev = j + 2;
- } else {
- jprev = j - 2;
- }
-
- if (j > W - 3) {
- jnext = j - 2;
- } else {
- jnext = j + 2;
- }
-
- med3x3(rawData[iprev][jprev], rawData[iprev][j], rawData[iprev][jnext],
- rawData[i][jprev], rawData[i][j], rawData[i][jnext],
- rawData[inext][jprev], rawData[inext][j], rawData[inext][jnext], temp);
+ for (int j = 2; j < W - 2; j++) {
+ med3x3(rawData[i - 2][j - 2], rawData[i - 2][j], rawData[i - 2][j + 2],
+ rawData[i][j - 2], rawData[i][j], rawData[i][j + 2],
+ rawData[i + 2][j - 2], rawData[i + 2][j], rawData[i + 2][j + 2], temp);
cfablur[i * W + j] = rawData[i][j] - temp;
}
}
- #pragma omp for reduction(+:counter) schedule (dynamic,16)
+ // process borders. Former version calculated the median using mirrored border which does not make sense because the original pixel loses weight
+ // Setting the difference between pixel and median for border pixels to zero should do the job not worse then former version
+#ifdef _OPENMP
+ #pragma omp single
+#endif
+ {
+ for(int i = 0; i < 2; i++) {
+ for(int j = 0; j < W; j++) {
+ cfablur[i * W + j] = 0.f;
+ }
+ }
+
+ for(int i = 2; i < H - 2; i++) {
+ for(int j = 0; j < 2; j++) {
+ cfablur[i * W + j] = 0.f;
+ }
+
+ for(int j = W - 2; j < W; j++) {
+ cfablur[i * W + j] = 0.f;
+ }
+ }
+
+ for(int i = H - 2; i < H; i++) {
+ for(int j = 0; j < W; j++) {
+ cfablur[i * W + j] = 0.f;
+ }
+ }
+ }
+#ifdef _OPENMP
+ #pragma omp barrier // barrier because of nowait clause above
+
+ #pragma omp for reduction(+:counter) schedule(dynamic,16)
+#endif
//cfa pixel heat/death evaluation
- for (int rr = 0; rr < H; rr++) {
- int top = max(0, rr - 2);
- int bottom = min(H - 1, rr + 2);
- int rrmWpcc = rr * W;
+ for (int rr = 2; rr < H - 2; rr++) {
+ int rrmWpcc = rr * W + 2;
- for (int cc = 0; cc < W; cc++, rrmWpcc++) {
+ for (int cc = 2; cc < W - 2; cc++, rrmWpcc++) {
//evaluate pixel for heat/death
float pixdev = cfablur[rrmWpcc];
- if((!findDeadPixels) && pixdev <= 0) {
+ if(pixdev == 0.f) {
continue;
}
- if((!findHotPixels) && pixdev >= 0) {
+ if((!findDeadPixels) && pixdev < 0) {
+ continue;
+ }
+
+ if((!findHotPixels) && pixdev > 0) {
continue;
}
pixdev = fabsf(pixdev);
float hfnbrave = -pixdev;
- int left = max(0, cc - 2);
- int right = min(W - 1, cc + 2);
- for (int mm = top; mm <= bottom; mm++) {
- int mmmWpnn = mm * W + left;
+#ifdef __SSE2__
+ // sum up 5*4 = 20 values using SSE
+ vfloat sum = vabsf(LVFU(cfablur[(rr - 2) * W + cc - 2])) + vabsf(LVFU(cfablur[(rr - 1) * W + cc - 2]));
+ sum += vabsf(LVFU(cfablur[(rr) * W + cc - 2]));
+ sum += vabsf(LVFU(cfablur[(rr + 1) * W + cc - 2]));
+ sum += vabsf(LVFU(cfablur[(rr + 2) * W + cc - 2]));
+ // horizontally add the values and add the result to hfnbrave
+ hfnbrave += vhadd(sum);
- for (int nn = left; nn <= right; nn++, mmmWpnn++) {
- hfnbrave += fabsf(cfablur[mmmWpnn]);
+ // add remaining 5 values of last column
+ for (int mm = rr - 2; mm <= rr + 2; mm++) {
+ hfnbrave += fabsf(cfablur[mm * W + cc + 2]);
+ }
+
+#else
+
+ for (int mm = rr - 2; mm <= rr + 2; mm++) {
+ for (int nn = cc - 2; nn <= cc + 2; nn++) {
+ hfnbrave += fabsf(cfablur[mm * W + nn]);
}
}
- if (pixdev * ((bottom - top + 1) * (right - left + 1) - 1) > varthresh * hfnbrave) {
+#endif
+
+ if (pixdev > varthresh * hfnbrave) {
// mark the pixel as "bad"
bpMap.set(cc, rr);
counter++;
@@ -1539,7 +1576,10 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le
int totBP = 0; // Hold count of bad pixels to correct
if(ri->zeroIsBad()) { // mark all pixels with value zero as bad, has to be called before FF and DF. dcraw sets this flag only for some cameras (mainly Panasonic and Leica)
+#ifdef _OPENMP
#pragma omp parallel for reduction(+:totBP)
+#endif
+
for(int i = 0; i < H; i++)
for(int j = 0; j < W; j++) {
if(ri->data[i][j] == 0.f) {
@@ -1614,7 +1654,9 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le
if (pLCPProf && idata->getFocalLen() > 0.f) {
LCPMapper map(pLCPProf, idata->getFocalLen(), idata->getFocalLen35mm(), idata->getFocusDist(), idata->getFNumber(), true, false, W, H, coarse, -1);
+#ifdef _OPENMP
#pragma omp parallel for
+#endif
for (int y = 0; y < H; y++) {
for (int x = 0; x < W; x++) {
@@ -1648,7 +1690,9 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le
int ng1 = 0, ng2 = 0, i = 0;
double avgg1 = 0., avgg2 = 0.;
+#ifdef _OPENMP
#pragma omp parallel for default(shared) private(i) reduction(+: ng1, ng2, avgg1, avgg2)
+#endif
for (i = border; i < H - border; i++)
for (int j = border; j < W - border; j++)
@@ -1665,7 +1709,9 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le
double corrg1 = ((double)avgg1 / ng1 + (double)avgg2 / ng2) / 2.0 / ((double)avgg1 / ng1);
double corrg2 = ((double)avgg1 / ng1 + (double)avgg2 / ng2) / 2.0 / ((double)avgg2 / ng2);
+#ifdef _OPENMP
#pragma omp parallel for default(shared)
+#endif
for (int i = border; i < H - border; i++)
for (int j = border; j < W - border; j++)
@@ -1734,7 +1780,6 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le
return;
}
-
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void RawImageSource::demosaic(const RAWParams &raw)
@@ -1788,8 +1833,10 @@ void RawImageSource::demosaic(const RAWParams &raw)
t2.set();
+
rgbSourceModified = false;
+
if( settings->verbose ) {
if (getSensorType() == ST_BAYER) {
printf("Demosaicing Bayer data: %s - %d usec\n", raw.bayersensor.method.c_str(), t2.etime(t1));
@@ -1797,6 +1844,609 @@ void RawImageSource::demosaic(const RAWParams &raw)
printf("Demosaicing X-Trans data: %s - %d usec\n", raw.xtranssensor.method.c_str(), t2.etime(t1));
}
}
+}
+
+
+//void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexParams retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI)
+void RawImageSource::retinexPrepareBuffers(ColorManagementParams cmp, RetinexParams retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI)
+{
+ bool useHsl = (retinexParams.retinexcolorspace == "HSLLOG" || retinexParams.retinexcolorspace == "HSLLIN");
+ conversionBuffer[0] (W - 2 * border, H - 2 * border);
+ conversionBuffer[1] (W - 2 * border, H - 2 * border);
+ conversionBuffer[2] (W - 2 * border, H - 2 * border);
+ conversionBuffer[3] (W - 2 * border, H - 2 * border);
+
+ LUTf *retinexgamtab;//gamma before and after Retinex to restore tones
+ LUTf lutTonereti;
+ lutTonereti(65536);
+
+ if(retinexParams.gammaretinex == "low") {
+ retinexgamtab = &(Color::gammatab_115_2);
+ } else if(retinexParams.gammaretinex == "mid") {
+ retinexgamtab = &(Color::gammatab_13_2);
+ } else if(retinexParams.gammaretinex == "hig") {
+ retinexgamtab = &(Color::gammatab_145_3);
+ } else if(retinexParams.gammaretinex == "fre") {
+ double g_a0, g_a1, g_a2, g_a3, g_a4, g_a5;
+ double pwr = 1.0 / retinexParams.gam;
+ double gamm = retinexParams.gam;
+ double ts = retinexParams.slope;
+ double gamm2 = retinexParams.gam;
+
+ if(gamm2 < 1.) {
+ pwr = 1. / pwr;
+ gamm = 1. / gamm;
+ }
+
+ int mode = 0, imax = 0;
+ Color::calcGamma(pwr, ts, mode, imax, g_a0, g_a1, g_a2, g_a3, g_a4, g_a5); // call to calcGamma with selected gamma and slope
+
+ // printf("g_a0=%f g_a1=%f g_a2=%f g_a3=%f g_a4=%f\n", g_a0,g_a1,g_a2,g_a3,g_a4);
+ for (int i = 0; i < 65536; i++) {
+ double val = (i) / 65535.;
+ double start = g_a3;
+ double add = g_a4;
+ double mul = 1. + g_a4;
+ double x;
+
+ if(gamm2 < 1.) {
+ start = g_a2;
+ add = g_a4;
+ x = Color::igammareti (val, gamm, start, ts, mul , add);
+ } else {
+ x = Color::gammareti (val, gamm, start, ts, mul , add);
+ }
+
+ lutTonereti[i] = CLIP(x * 65535.);// CLIP avoid in some case extra values
+ }
+
+ retinexgamtab = &lutTonereti;
+ }
+
+ /*
+ //test with amsterdam.pef and other files
+ float rr,gg,bb;
+ rr=red[50][2300];
+ gg=green[50][2300];
+ bb=blue[50][2300];
+ printf("rr=%f gg=%f bb=%f \n",rr,gg,bb);
+ rr=red[1630][370];
+ gg=green[1630][370];
+ bb=blue[1630][370];
+ printf("rr1=%f gg1=%f bb1=%f \n",rr,gg,bb);
+ rr=red[380][1630];
+ gg=green[380][1630];
+ bb=blue[380][1630];
+ printf("rr2=%f gg2=%f bb2=%f \n",rr,gg,bb);
+ */
+ /*
+ if(retinexParams.highlig < 100 && retinexParams.retinexMethod == "highliplus") {//try to recover magenta...very difficult !
+ float hig = ((float)retinexParams.highlig)/100.f;
+ float higgb = ((float)retinexParams.grbl)/100.f;
+
+ #ifdef _OPENMP
+ #pragma omp parallel for
+ #endif
+ for (int i = border; i < H - border; i++ ) {
+ for (int j = border; j < W - border; j++ ) {
+ float R_,G_,B_;
+ R_=red[i][j];
+ G_=green[i][j];
+ B_=blue[i][j];
+
+ //empirical method to find highlight magenta with no conversion RGB and no white balance
+ //red = master Gr and Bl default higgb=0.5
+ // if(R_>65535.f*hig && G_ > 65535.f*higgb && B_ > 65535.f*higgb) conversionBuffer[3][i - border][j - border] = R_;
+ // else conversionBuffer[3][i - border][j - border] = 0.f;
+ }
+ }
+ }
+ */
+ if(retinexParams.gammaretinex != "none" && retinexParams.str != 0) {//gamma
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+
+ for (int i = border; i < H - border; i++ ) {
+ for (int j = border; j < W - border; j++ ) {
+ float R_, G_, B_;
+ R_ = red[i][j];
+ G_ = green[i][j];
+ B_ = blue[i][j];
+
+ red[i][j] = (*retinexgamtab)[R_];
+ green[i][j] = (*retinexgamtab)[G_];
+ blue[i][j] = (*retinexgamtab)[B_];
+ }
+ }
+ }
+
+ if(useHsl) {
+#ifdef _OPENMP
+ #pragma omp parallel
+#endif
+ {
+ // one LUT per thread
+ LUTu lhist16RETIThr;
+
+ if(lhist16RETI)
+ {
+ lhist16RETIThr(32769, 0);
+ lhist16RETIThr.clear();
+ }
+
+#ifdef __SSE2__
+ vfloat c32768 = F2V(32768.f);
+#endif
+#ifdef _OPENMP
+ #pragma omp for
+#endif
+
+ for (int i = border; i < H - border; i++ )
+ {
+ int j = border;
+#ifdef __SSE2__
+
+ for (; j < W - border - 3; j += 4) {
+ vfloat H, S, L;
+ int pos;
+ Color::rgb2hsl(LVFU(red[i][j]), LVFU(green[i][j]), LVFU(blue[i][j]), H, S, L);
+ _mm_storeu_ps(&conversionBuffer[0][i - border][j - border], H);
+ _mm_storeu_ps(&conversionBuffer[1][i - border][j - border], S);
+ L *= c32768;
+ _mm_storeu_ps(&conversionBuffer[2][i - border][j - border], L);
+ _mm_storeu_ps(&conversionBuffer[3][i - border][j - border], H);
+
+ if(lhist16RETI) {
+ for(int p = 0; p < 4; p++) {
+ pos = (int) clipretinex( conversionBuffer[2][i - border][j - border + p], 0.f, 32768.f);//histogram in curve HSL
+ lhist16RETIThr[pos]++;
+ }
+ }
+ }
+
+#endif
+
+ for (; j < W - border; j++) {
+ float H, S, L;
+ int pos;
+ //rgb=>lab
+ Color::rgb2hslfloat(red[i][j], green[i][j], blue[i][j], conversionBuffer[0][i - border][j - border], conversionBuffer[1][i - border][j - border], L);
+ L *= 32768.f;
+ conversionBuffer[2][i - border][j - border] = L;
+
+ if(lhist16RETI) {
+ pos = (int) clipretinex(L, 0, 32768);
+ lhist16RETIThr[pos]++;
+ }
+ }
+ }
+
+#ifdef _OPENMP
+ #pragma omp critical
+ {
+ if(lhist16RETI)
+ {
+ // Add per Thread LUT to global LUT
+ for(int i = 0; i < 32769; i++) {
+ lhist16RETI[i] += lhist16RETIThr[i];
+ }
+ }
+ }
+#endif
+
+ }
+ } else {
+ TMatrix wprof = iccStore->workingSpaceMatrix (cmp.working);
+ double wp[3][3] = {
+ {wprof[0][0], wprof[0][1], wprof[0][2]},
+ {wprof[1][0], wprof[1][1], wprof[1][2]},
+ {wprof[2][0], wprof[2][1], wprof[2][2]}
+ };
+
+ // Conversion rgb -> lab is hard to vectorize because it uses a lut (that's not the main problem)
+ // and it uses a condition inside XYZ2Lab which is almost impossible to vectorize without making it slower...
+#ifdef _OPENMP
+ #pragma omp parallel
+#endif
+ {
+ // one LUT per thread
+ LUTu lhist16RETIThr;
+
+ if(lhist16RETI) {
+ lhist16RETIThr(32769, 0);
+ lhist16RETIThr.clear();
+ }
+
+#ifdef _OPENMP
+ #pragma omp for
+#endif
+
+ for (int i = border; i < H - border; i++ )
+ for (int j = border; j < W - border; j++) {
+ float X, Y, Z, L, aa, bb;
+ int pos;
+ float R_, G_, B_;
+ R_ = red[i][j];
+ G_ = green[i][j];
+ B_ = blue[i][j];
+ float k;
+ //rgb=>lab
+ Color::rgbxyz(R_, G_, B_, X, Y, Z, wp);
+ //convert Lab
+ Color::XYZ2Lab(X, Y, Z, L, aa, bb);
+ conversionBuffer[0][i - border][j - border] = aa;
+ conversionBuffer[1][i - border][j - border] = bb;
+ conversionBuffer[2][i - border][j - border] = L;
+ conversionBuffer[3][i - border][j - border] = xatan2f(bb, aa);
+
+// if(R_>40000.f && G_ > 30000.f && B_ > 30000.f) conversionBuffer[3][i - border][j - border] = R_;
+// else conversionBuffer[3][i - border][j - border] = 0.f;
+ if(lhist16RETI) {
+ pos = (int) clipretinex(L, 0, 32768);
+ lhist16RETIThr[pos]++;//histogram in Curve Lab
+ }
+ }
+
+#ifdef _OPENMP
+ #pragma omp critical
+ {
+ if(lhist16RETI) {
+ // Add per Thread LUT to global LUT
+ for(int i = 0; i < 32769; i++) {
+ lhist16RETI[i] += lhist16RETIThr[i];
+ }
+ }
+ }
+#endif
+
+ }
+ }
+
+
+
+}
+
+void RawImageSource::retinexPrepareCurves(RetinexParams retinexParams, LUTf &cdcurve, RetinextransmissionCurve &retinextransmissionCurve, bool &retinexcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI)
+{
+ useHsl = (retinexParams.retinexcolorspace == "HSLLOG" || retinexParams.retinexcolorspace == "HSLLIN");
+
+ if(useHsl) {
+ CurveFactory::curveDehaContL (retinexcontlutili, retinexParams.cdHcurve, cdcurve, 1, lhist16RETI, histLRETI);
+ } else {
+ CurveFactory::curveDehaContL (retinexcontlutili, retinexParams.cdcurve, cdcurve, 1, lhist16RETI, histLRETI);
+ }
+
+ retinexParams.getCurves(retinextransmissionCurve);
+}
+
+//void RawImageSource::retinex(ColorManagementParams cmp, RetinexParams deh, ToneCurveParams Tc, LUTf & cdcurve, const RetinextransmissionCurve & dehatransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI)
+void RawImageSource::retinex(ColorManagementParams cmp, RetinexParams deh, ToneCurveParams Tc, LUTf & cdcurve, const RetinextransmissionCurve & dehatransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI)
+{
+
+ MyTime t4, t5;
+ t4.set();
+
+ if (settings->verbose) {
+ printf ("Applying Retinex\n");
+ }
+
+ LUTf lutToneireti;
+ lutToneireti(65536);
+
+ LUTf *retinexigamtab;//gamma before and after Retinex to restore tones
+
+ if(deh.gammaretinex == "low") {
+ retinexigamtab = &(Color::igammatab_115_2);
+ } else if(deh.gammaretinex == "mid") {
+ retinexigamtab = &(Color::igammatab_13_2);
+ } else if(deh.gammaretinex == "hig") {
+ retinexigamtab = &(Color::igammatab_145_3);
+ } else if(deh.gammaretinex == "fre") {
+ double g_a0, g_a1, g_a2, g_a3, g_a4, g_a5;
+ double pwr = 1.0 / deh.gam;
+ double gamm = deh.gam;
+ double gamm2 = gamm;
+ double ts = deh.slope;
+ int mode = 0, imax = 0;
+
+ if(gamm2 < 1.) {
+ pwr = 1. / pwr;
+ gamm = 1. / gamm;
+ }
+
+ Color::calcGamma(pwr, ts, mode, imax, g_a0, g_a1, g_a2, g_a3, g_a4, g_a5); // call to calcGamma with selected gamma and slope
+
+ // printf("g_a0=%f g_a1=%f g_a2=%f g_a3=%f g_a4=%f\n", g_a0,g_a1,g_a2,g_a3,g_a4);
+ for (int i = 0; i < 65536; i++) {
+ double val = (i) / 65535.;
+ double x;
+ double mul = 1. + g_a4;
+ double add = g_a4;
+ double start = g_a2;
+
+ if(gamm2 < 1.) {
+ start = g_a3;
+ add = g_a3;
+ x = Color::gammareti (val, gamm, start, ts, mul , add);
+ } else {
+ x = Color::igammareti (val, gamm, start, ts, mul , add);
+ }
+
+ lutToneireti[i] = CLIP(x * 65535.);
+ }
+
+ retinexigamtab = &lutToneireti;
+ }
+
+ // We need a buffer with original L data to allow correct blending
+ // red, green and blue still have original size of raw, but we can't use the borders
+ const int HNew = H - 2 * border;
+ const int WNew = W - 2 * border;
+
+ array2D LBuffer (WNew, HNew);
+ float **temp = conversionBuffer[2]; // one less dereference
+ LUTf dLcurve;
+ LUTu hist16RET;
+ float val;
+
+ if(dehacontlutili && histLRETI) {
+ hist16RET(32769, 0);
+ hist16RET.clear();
+ histLRETI.clear();
+ dLcurve(32769, 0);
+ dLcurve.clear();
+ }
+
+ FlatCurve* chcurve = NULL;//curve c=f(H)
+ bool chutili = false;
+
+ if (deh.enabled && deh.retinexMethod == "highli") {
+ chcurve = new FlatCurve(deh.lhcurve);
+
+ if (!chcurve || chcurve->isIdentity()) {
+ if (chcurve) {
+ delete chcurve;
+ chcurve = NULL;
+ }
+ } else {
+ chutili = true;
+ }
+ }
+
+
+
+#ifdef _OPENMP
+ #pragma omp parallel
+#endif
+ {
+ // one LUT per thread
+ LUTu hist16RETThr;
+
+ if(dehacontlutili && histLRETI) {
+ hist16RETThr(32769, 0);
+ hist16RETThr.clear();
+ }
+
+#ifdef _OPENMP
+ #pragma omp for
+#endif
+
+ for (int i = 0; i < H - 2 * border; i++ )
+ if(dehacontlutili)
+ for (int j = 0; j < W - 2 * border; j++) {
+ LBuffer[i][j] = cdcurve[2.f * temp[i][j]] / 2.f;
+
+ if(histLRETI) {
+ int pos = (int) clipretinex(LBuffer[i][j], 0.f, 32768.f);
+ hist16RETThr[pos]++; //histogram in Curve
+ }
+ }
+ else
+ for (int j = 0; j < W - 2 * border; j++) {
+ LBuffer[i][j] = temp[i][j];
+ }
+
+#ifdef _OPENMP
+ #pragma omp critical
+#endif
+ {
+ if(dehacontlutili && histLRETI) {
+ // Add per Thread LUT to global LUT
+ for(int i = 0; i < 32769; i++) {
+ hist16RET[i] += hist16RETThr[i];
+ }
+ }
+ }
+ }
+
+ if(dehacontlutili && histLRETI) {//update histogram
+ for (int i = 0; i < 32768; i++) {
+ val = (double)i / 32767.0;
+ dLcurve[i] = CLIPD(val);
+ }
+
+ for (int i = 0; i < 32768; i++) {
+ float hval = dLcurve[i];
+ int hi = (int)(255.0f * CLIPD(hval));
+ histLRETI[hi] += hist16RET[i];
+ }
+ }
+
+ MSR(LBuffer, conversionBuffer[2], conversionBuffer[3], WNew, HNew, deh, dehatransmissionCurve, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax);
+
+ if(useHsl) {
+ if(chutili) {
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+
+ for (int i = border; i < H - border; i++ ) {
+ int j = border;
+
+ for (; j < W - border; j++) {
+
+ float valp;
+ float chr;
+ // if(chutili) { // c=f(H)
+ {
+ valp = float((chcurve->getVal(conversionBuffer[3][i - border][j - border]) - 0.5f));
+
+ conversionBuffer[1][i - border][j - border] *= (1.f + 2.f * valp);
+ }
+ // }
+
+ }
+ }
+ }
+
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+
+ for (int i = border; i < H - border; i++ ) {
+ int j = border;
+#ifdef __SSE2__
+ vfloat c32768 = F2V(32768.f);
+
+ for (; j < W - border - 3; j += 4) {
+ vfloat R, G, B;
+ Color::hsl2rgb(LVFU(conversionBuffer[0][i - border][j - border]), LVFU(conversionBuffer[1][i - border][j - border]), LVFU(LBuffer[i - border][j - border]) / c32768, R, G, B);
+
+ _mm_storeu_ps(&red[i][j], R);
+ _mm_storeu_ps(&green[i][j], G);
+ _mm_storeu_ps(&blue[i][j], B);
+ }
+
+#endif
+
+ for (; j < W - border; j++) {
+ Color::hsl2rgbfloat(conversionBuffer[0][i - border][j - border], conversionBuffer[1][i - border][j - border], LBuffer[i - border][j - border] / 32768.f, red[i][j], green[i][j], blue[i][j]);
+ }
+ }
+
+ } else {
+ TMatrix wiprof = iccStore->workingSpaceInverseMatrix (cmp.working);
+
+ double wip[3][3] = {
+ {wiprof[0][0], wiprof[0][1], wiprof[0][2]},
+ {wiprof[1][0], wiprof[1][1], wiprof[1][2]},
+ {wiprof[2][0], wiprof[2][1], wiprof[2][2]}
+ };
+ // gamut control only in Lab mode
+ const bool highlight = Tc.hrenabled;
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+
+ for (int i = border; i < H - border; i++ ) {
+ for (int j = border; j < W - border; j++) {
+
+ float Lprov1 = (LBuffer[i - border][j - border]) / 327.68f;
+ float Chprov1 = sqrt(SQR(conversionBuffer[0][i - border][j - border]) + SQR(conversionBuffer[1][i - border][j - border])) / 327.68f;
+ float HH = xatan2f(conversionBuffer[1][i - border][j - border], conversionBuffer[0][i - border][j - border]);
+ float2 sincosval;
+ float valp;
+ float chr;
+
+ if(chutili) { // c=f(H)
+ {
+ valp = float((chcurve->getVal(Color::huelab_to_huehsv2(HH)) - 0.5f));
+ Chprov1 *= (1.f + 2.f * valp);
+ }
+ }
+
+ sincosval = xsincosf(HH);
+ float R, G, B;
+#ifdef _DEBUG
+ bool neg = false;
+ bool more_rgb = false;
+ //gamut control : Lab values are in gamut
+ Color::gamutLchonly(HH, sincosval, Lprov1, Chprov1, R, G, B, wip, highlight, 0.15f, 0.96f, neg, more_rgb);
+#else
+ //gamut control : Lab values are in gamut
+ Color::gamutLchonly(HH, sincosval, Lprov1, Chprov1, R, G, B, wip, highlight, 0.15f, 0.96f);
+#endif
+
+
+
+ conversionBuffer[0][i - border][j - border] = 327.68f * Chprov1 * sincosval.y;
+ conversionBuffer[1][i - border][j - border] = 327.68f * Chprov1 * sincosval.x;
+ LBuffer[i - border][j - border] = Lprov1 * 327.68f;
+ }
+ }
+
+ //end gamut control
+#ifdef __SSE2__
+ vfloat wipv[3][3];
+
+ for(int i = 0; i < 3; i++)
+ for(int j = 0; j < 3; j++) {
+ wipv[i][j] = F2V(wiprof[i][j]);
+ }
+
+#endif // __SSE2__
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+
+ for (int i = border; i < H - border; i++ ) {
+ int j = border;
+#ifdef __SSE2__
+
+ for (; j < W - border - 3; j += 4) {
+ vfloat x_, y_, z_;
+ vfloat R, G, B;
+ Color::Lab2XYZ(LVFU(LBuffer[i - border][j - border]), LVFU(conversionBuffer[0][i - border][j - border]), LVFU(conversionBuffer[1][i - border][j - border]), x_, y_, z_) ;
+ Color::xyz2rgb(x_, y_, z_, R, G, B, wipv);
+
+ _mm_storeu_ps(&red[i][j], R);
+ _mm_storeu_ps(&green[i][j], G);
+ _mm_storeu_ps(&blue[i][j], B);
+
+ }
+
+#endif
+
+ for (; j < W - border; j++) {
+ float x_, y_, z_;
+ float R, G, B;
+ Color::Lab2XYZ(LBuffer[i - border][j - border], conversionBuffer[0][i - border][j - border], conversionBuffer[1][i - border][j - border], x_, y_, z_) ;
+ Color::xyz2rgb(x_, y_, z_, R, G, B, wip);
+ red[i][j] = R;
+ green[i][j] = G;
+ blue[i][j] = B;
+ }
+ }
+ }
+
+ if (chcurve) {
+ delete chcurve;
+ }
+
+ if(deh.gammaretinex != "none" && deh.str != 0) { //inverse gamma
+#ifdef _OPENMP
+ #pragma omp parallel for
+#endif
+
+ for (int i = border; i < H - border; i++ ) {
+ for (int j = border; j < W - border; j++ ) {
+ float R_, G_, B_;
+ R_ = red[i][j];
+ G_ = green[i][j];
+ B_ = blue[i][j];
+ red[i][j] = (*retinexigamtab)[R_];
+ green[i][j] = (*retinexigamtab)[G_];
+ blue[i][j] = (*retinexigamtab)[B_];
+ }
+ }
+ }
+
+ t5.set();
+
+ if( settings->verbose ) {
+ printf("Retinex=%d usec\n", t5.etime(t4));
+ }
}
@@ -1827,7 +2477,7 @@ void RawImageSource::flushRGB()
}
}
-void RawImageSource::HLRecovery_Global(ToneCurveParams hrp )
+void RawImageSource::HLRecovery_Global(ToneCurveParams hrp)
{
if (hrp.hrenabled && hrp.method == "Color") {
if(!rgbSourceModified) {
@@ -1839,6 +2489,7 @@ void RawImageSource::HLRecovery_Global(ToneCurveParams hrp )
rgbSourceModified = true;
}
}
+
}
@@ -1885,10 +2536,14 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile
float maxval = 0.f;
int c = FC(m, n);
int c4 = ( c == 1 && !(m & 1) ) ? 3 : c;
+#ifdef _OPENMP
#pragma omp parallel
+#endif
{
float maxvalthr = 0.f;
+#ifdef _OPENMP
#pragma omp for
+#endif
for (int row = 0; row < H - m; row += 2) {
for (int col = 0; col < W - n; col += 2) {
@@ -1900,7 +2555,9 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile
}
}
+#ifdef _OPENMP
#pragma omp critical
+#endif
{
if(maxvalthr > maxval) {
@@ -1930,11 +2587,15 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile
for (int m = 0; m < 2; m++)
for (int n = 0; n < 2; n++) {
+#ifdef _OPENMP
#pragma omp parallel
+#endif
{
int c = FC(m, n);
int c4 = ( c == 1 && !(m & 1) ) ? 3 : c;
+#ifdef _OPENMP
#pragma omp for
+#endif
for (int row = 0; row < H - m; row += 2)
{
@@ -1970,10 +2631,14 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile
int clipControlGui = 0;
float maxval = 0.f;
// xtrans files have only one black level actually, so we can simplify the code a bit
+#ifdef _OPENMP
#pragma omp parallel
+#endif
{
float maxvalthr = 0.f;
+#ifdef _OPENMP
#pragma omp for schedule(dynamic,16) nowait
+#endif
for (int row = 0; row < H; row++) {
for (int col = 0; col < W; col++) {
@@ -1985,7 +2650,9 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile
}
}
+#ifdef _OPENMP
#pragma omp critical
+#endif
{
if(maxvalthr > maxval) {
maxval = maxvalthr;
@@ -2007,7 +2674,9 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile
refcolor[c] *= limitFactor;
}
+#ifdef _OPENMP
#pragma omp parallel for
+#endif
for (int row = 0; row < H; row++) {
for (int col = 0; col < W; col++) {
@@ -2030,7 +2699,9 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile
if(ri->getSensorType() == ST_BAYER) {
for (int m = 0; m < 2; m++)
for (int n = 0; n < 2; n++) {
+#ifdef _OPENMP
#pragma omp parallel for
+#endif
for (int row = 0; row < H - m; row += 2) {
int c = FC(row, 0);
@@ -2044,7 +2715,9 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile
}
}
} else if(ri->getSensorType() == ST_FUJI_XTRANS) {
+#ifdef _OPENMP
#pragma omp parallel for
+#endif
for (int row = 0; row < H; row++) {
for (int col = 0; col < W; col++) {
@@ -2153,9 +2826,13 @@ SSEFUNCTION void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur
cfatmp = (float (*)) calloc (H * W, sizeof * cfatmp);
// const float hotdeadthresh = 0.5;
+#ifdef _OPENMP
#pragma omp parallel
+#endif
{
+#ifdef _OPENMP
#pragma omp for
+#endif
for (int i = 0; i < H; i++) {
int iprev, inext, jprev, jnext;
@@ -2204,7 +2881,9 @@ SSEFUNCTION void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur
//box blur cfa image; box size = BS
//horizontal blur
+#ifdef _OPENMP
#pragma omp for
+#endif
for (int row = 0; row < H; row++) {
int len = boxW / 2 + 1;
@@ -2243,7 +2922,9 @@ SSEFUNCTION void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur
__m128 onev = _mm_set1_ps( 1.0f );
__m128 temp1v, temp2v, lenv, lenp1v, lenm1v;
int row;
+#ifdef _OPENMP
#pragma omp for
+#endif
for (int col = 0; col < W - 3; col += 4) {
lenv = leninitv;
@@ -2332,7 +3013,9 @@ SSEFUNCTION void RawImageSource::cfaboxblur(RawImage *riFlatFile, float* cfablur
}
#else
+#ifdef _OPENMP
#pragma omp for
+#endif
for (int col = 0; col < W; col++) {
int len = boxH / 2 + 1;
@@ -2414,12 +3097,15 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R
// scale image colors
if( ri->getSensorType() == ST_BAYER) {
+#ifdef _OPENMP
#pragma omp parallel
+#endif
{
float tmpchmax[3];
tmpchmax[0] = tmpchmax[1] = tmpchmax[2] = 0.0f;
-
+#ifdef _OPENMP
#pragma omp for nowait
+#endif
for (int row = winy; row < winy + winh; row ++)
{
@@ -2434,7 +3120,9 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R
}
}
+#ifdef _OPENMP
#pragma omp critical
+#endif
{
chmax[0] = max(tmpchmax[0], chmax[0]);
chmax[1] = max(tmpchmax[1], chmax[1]);
@@ -2442,11 +3130,14 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R
}
}
} else if ( ri->get_colors() == 1 ) {
+#ifdef _OPENMP
#pragma omp parallel
+#endif
{
float tmpchmax = 0.0f;
-
+#ifdef _OPENMP
#pragma omp for nowait
+#endif
for (int row = winy; row < winy + winh; row ++)
{
@@ -2459,18 +3150,23 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R
}
}
+#ifdef _OPENMP
#pragma omp critical
+#endif
{
chmax[0] = chmax[1] = chmax[2] = chmax[3] = max(tmpchmax, chmax[0]);
}
}
} else if(ri->getSensorType() == ST_FUJI_XTRANS) {
+#ifdef _OPENMP
#pragma omp parallel
+#endif
{
float tmpchmax[3];
tmpchmax[0] = tmpchmax[1] = tmpchmax[2] = 0.0f;
-
+#ifdef _OPENMP
#pragma omp for nowait
+#endif
for (int row = winy; row < winy + winh; row ++)
{
@@ -2485,7 +3181,9 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R
}
}
+#ifdef _OPENMP
#pragma omp critical
+#endif
{
chmax[0] = max(tmpchmax[0], chmax[0]);
chmax[1] = max(tmpchmax[1], chmax[1]);
@@ -2493,12 +3191,15 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R
}
}
} else {
+#ifdef _OPENMP
#pragma omp parallel
+#endif
{
float tmpchmax[3];
tmpchmax[0] = tmpchmax[1] = tmpchmax[2] = 0.0f;
-
+#ifdef _OPENMP
#pragma omp for nowait
+#endif
for (int row = winy; row < winy + winh; row ++)
{
@@ -2513,7 +3214,9 @@ void RawImageSource::scaleColors(int winx, int winy, int winw, int winh, const R
}
}
+#ifdef _OPENMP
#pragma omp critical
+#endif
{
chmax[0] = max(tmpchmax[0], chmax[0]);
chmax[1] = max(tmpchmax[1], chmax[1]);
@@ -2826,8 +3529,9 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, ColorManagementParam
mat[i][j] += work[i][k] * camMatrix[k][j]; // rgb_xyz * imatrices.xyz_cam
}
-
+#ifdef _OPENMP
#pragma omp parallel for
+#endif
for (int i = 0; i < im->height; i++)
for (int j = 0; j < im->width; j++) {
@@ -3150,91 +3854,6 @@ void RawImageSource::colorSpaceConversion_ (Imagefloat* im, ColorManagementParam
// printf ("ICM TIME: %d usec\n", t3.etime(t1));
}
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-// Converts raw image including ICC input profile to working space - 16bit int version
-/*void RawImageSource::colorSpaceConversion16 (Image16* im, ColorManagementParams cmp, cmsHPROFILE embedded, cmsHPROFILE camprofile, double camMatrix[3][3], std::string camName) {
- cmsHPROFILE in;
- DCPProfile *dcpProf;
-
- if (!findInputProfile(cmp.input, embedded, camName, &dcpProf, in)) return;
-
- if (dcpProf!=NULL) {
- dcpProf->Apply(im, (DCPLightType)cmp.preferredProfile, cmp.working, cmp.toneCurve);
- } else {
- if (in==NULL) {
- // Take camprofile from DCRAW
- // in this case we avoid using the slllllooooooowwww lcms
- TMatrix work = iccStore->workingSpaceInverseMatrix (cmp.working);
- double mat[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
- for (int i=0; i<3; i++)
- for (int j=0; j<3; j++)
- for (int k=0; k<3; k++)
- mat[i][j] += work[i][k] * camMatrix[k][j]; // rgb_xyz * imatrices.xyz_cam
-
-#pragma omp parallel for
- for (int i=0; iheight; i++)
- for (int j=0; jwidth; j++) {
-
- float newr = mat[0][0]*im->r(i,j) + mat[0][1]*im->g(i,j) + mat[0][2]*im->b(i,j);
- float newg = mat[1][0]*im->r(i,j) + mat[1][1]*im->g(i,j) + mat[1][2]*im->b(i,j);
- float newb = mat[2][0]*im->r(i,j) + mat[2][1]*im->g(i,j) + mat[2][2]*im->b(i,j);
-
- im->r(i,j) = CLIP((int)newr);
- im->g(i,j) = CLIP((int)newg);
- im->b(i,j) = CLIP((int)newb);
- }
- } else {
- // Gamma preprocessing
- float gammaFac, lineFac, lineSum;
- getProfilePreprocParams(in, gammaFac, lineFac, lineSum);
-
- if (gammaFac>0) {
-#pragma omp parallel for
- for ( int h = 0; h < im->height; ++h )
- for ( int w = 0; w < im->width; ++w ) {
- im->r(h,w)= (int) (pow ((double)(im->r(h,w) / 65535.0), (double)gammaFac) * 65535.0);
- im->g(h,w)= (int) (pow ((double)(im->g(h,w) / 65535.0), (double)gammaFac) * 65535.0);
- im->b(h,w)= (int) (pow ((double)(im->b(h,w) / 65535.0), (double)gammaFac) * 65535.0);
- }
- }
-
- cmsHPROFILE out = iccStore->workingSpace (cmp.working);
- //out = iccStore->workingSpaceGamma (wProfile);
- lcmsMutex->lock ();
- cmsHTRANSFORM hTransform = cmsCreateTransform (in, TYPE_RGB_16, out, TYPE_RGB_16, settings->colorimetricIntent,
- cmsFLAGS_NOCACHE); // NOCACHE is important for thread safety
- lcmsMutex->unlock ();
-
- if (hTransform) {
- im->ExecCMSTransform(hTransform);
-
- // There might be Nikon postprocessings
- if (lineSum>0) {
-#pragma omp parallel for
- for ( int h = 0; h < im->height; ++h )
- for ( int w = 0; w < im->width; ++w ) {
- im->r(h,w) *= im->r(h,w) * lineFac / 65535.0 + lineSum;
- im->g(h,w) *= im->g(h,w) * lineFac / 65535.0 + lineSum;
- im->b(h,w) *= im->b(h,w) * lineFac / 65535.0 + lineSum;
- }
- }
- }
- else {
- lcmsMutex->lock ();
- hTransform = cmsCreateTransform (camprofile, TYPE_RGB_16, out, TYPE_RGB_16,
- settings->colorimetricIntent, cmsFLAGS_NOCACHE);
- lcmsMutex->unlock ();
-
- im->ExecCMSTransform(hTransform);
- }
-
- cmsDeleteTransform(hTransform);
- }
- }
- //t3.set ();
- //printf ("ICM TIME: %d\n", t3.etime(t1));
-}*/
// Determine RAW input and output profiles. Returns TRUE on success
bool RawImageSource::findInputProfile(Glib::ustring inProfile, cmsHPROFILE embedded, std::string camName, DCPProfile **dcpProf, cmsHPROFILE& in)
@@ -3533,11 +4152,15 @@ void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr)
histogram(65536 >> histcompr);
histogram.clear();
+#ifdef _OPENMP
#pragma omp parallel
+#endif
{
LUTu tmphistogram(65536 >> histcompr);
tmphistogram.clear();
+#ifdef _OPENMP
#pragma omp for nowait
+#endif
for (int i = border; i < H - border; i++) {
int start, end;
@@ -3576,7 +4199,9 @@ void RawImageSource::getAutoExpHistogram (LUTu & histogram, int& histcompr)
}
}
+#ifdef _OPENMP
#pragma omp critical
+#endif
{
for(int i = 0; i < (65536 >> histcompr); i++) {
histogram[i] += tmphistogram[i];
diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h
index d4ebf9928..ee89dd079 100644
--- a/rtengine/rawimagesource.h
+++ b/rtengine/rawimagesource.h
@@ -151,6 +151,10 @@ public:
int load (Glib::ustring fname, bool batch = false);
void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse);
void demosaic (const RAWParams &raw);
+// void retinex (RAWParams raw, ColorManagementParams cmp, RetinexParams lcur, LUTf & cdcurve, bool dehacontlutili);
+ void retinex (ColorManagementParams cmp, RetinexParams deh, ToneCurveParams Tc, LUTf & cdcurve, const RetinextransmissionCurve & dehatransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI);
+ void retinexPrepareCurves (RetinexParams retinexParams, LUTf &cdcurve, RetinextransmissionCurve &retinextransmissionCurve, bool &retinexcontlutili, bool &useHsl, LUTu & lhist16RETI, LUTu & histLRETI);
+ void retinexPrepareBuffers (ColorManagementParams cmp, RetinexParams retinexParams, multi_array2D &conversionBuffer, LUTu &lhist16RETI);
void flushRawData ();
void flushRGB ();
void HLRecovery_Global (ToneCurveParams hrp);
@@ -224,8 +228,10 @@ public:
}
static void inverse33 (const double (*coeff)[3], double (*icoeff)[3]);
- void boxblur2(float** src, float** dst, int H, int W, int box );
- void boxblur_resamp(float **src, float **dst, int H, int W, int box, int samp );
+ void boxblur2(float** src, float** dst, float** temp, int H, int W, int box );
+ void boxblur_resamp(float **src, float **dst, float** temp, int H, int W, int box, int samp );
+ void MSR(float** luminance, float **originalLuminance, float **exLuminance, int width, int height, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax);
+// void MSR(LabImage* lab, int width, int height, int skip, RetinexParams deh, const RetinextransmissionCurve & dehatransmissionCurve);
//void boxblur_resamp(float **red, float **green, float **blue, int H, int W, float thresh[3], float max[3],
// multi_array2D & hfsize, multi_array2D & hilite, int box );
@@ -271,6 +277,7 @@ protected:
void jdl_interpolate_omp();
void igv_interpolate(int winw, int winh);
void lmmse_interpolate_omp(int winw, int winh, int iterations);
+// void MSR(LabImage* lab, int width, int height, int skip, const LCurveParams &lcur);
void amaze_demosaic_RT(int winx, int winy, int winw, int winh);//Emil's code for AMaZE
void fast_demosaic(int winx, int winy, int winw, int winh );//Emil's code for fast demosaicing
diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc
index c22cf25fa..4180fd67a 100644
--- a/rtengine/refreshmap.cc
+++ b/rtengine/refreshmap.cc
@@ -19,6 +19,13 @@
#include "refreshmap.h"
#include "procevents.h"
+
+
+
+
+
+
+// Aligned so the first entry starts on line 30
int refreshmap[rtengine::NUMOFEVENTS] = {
ALL, // EvPhotoLoaded,
ALL, // EvProfileLoaded,
@@ -169,7 +176,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
SHARPENING, // EvSharpenEdgeThreechannels
SHARPENING, // EvSharpenMicroEnabled
SHARPENING, // EvSharpenMicroMatrix
- DEMOSAIC, // EvDemosaicALLEnhanced // Disabled but not removed for now, may be reintroduced some day
+ DEMOSAIC, // EvDemosaicALLEnhanced Disabled but not removed for now, may be reintroduced some day
RGBCURVE, // EvVibranceEnabled
RGBCURVE, // EvVibrancePastels
RGBCURVE, // EvVibranceSaturated
@@ -255,7 +262,7 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
RGBCURVE, // EvBWAfterCurve
RGBCURVE, // EvBWAfterCurveMode
RGBCURVE, // EvAutoch
- NONE, // --unused--
+ 0, // --unused--
RGBCURVE, // EvNeutralBW
TRANSFORM, // EvGradientFeather
TRANSFORM, // EvGradientStrength
@@ -275,14 +282,12 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
DIRPYREQUALIZER, // EvDirPyrEqlgamutlab
DIRPYREQUALIZER, // EvDirPyrEqualizerHueskin
ALLNORAW, // EvDPDNmedian
- ALLNORAW, //EvDPDNmedmet
-//DIRPYREQUALIZER // EvDirPyrEqualizeralg
+ ALLNORAW, // EvDPDNmedmet
RGBCURVE, // EvColorToningEnabled
RGBCURVE, // EvColorToningColor
RGBCURVE, // EvColorToningOpacity
RGBCURVE, // EvColorToningCLCurve
RGBCURVE, // EvColorToningMethod
-//RGBCURVE, // EvColorToningTwocolor
RGBCURVE, // EvColorToningLLCurve
RGBCURVE, // EvColorToningredlow
RGBCURVE, // EvColorToninggreenlow
@@ -304,27 +309,27 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
RGBCURVE, // EvColorToningHighights
RGBCURVE, // EvColorToningSatProtection
RGBCURVE, // EvColorToningSatThreshold
- RGBCURVE, //EvColorToningStrength
- RGBCURVE, //EvColorToningautosat
- ALLNORAW, //EvDPDNmetmed
- ALLNORAW, //EvDPDNrgbmet
- ALLNORAW, //EvDPDNpasses
+ RGBCURVE, // EvColorToningStrength
+ RGBCURVE, // EvColorToningautosat
+ ALLNORAW, // EvDPDNmetmed
+ ALLNORAW, // EvDPDNrgbmet
+ ALLNORAW, // EvDPDNpasses
FLATFIELD, // EvFlatFieldClipControl
FLATFIELD, // EvFlatFieldAutoClipControl
DARKFRAME, // EvPreProcessExpBlackRed
DARKFRAME, // EvPreProcessExpBlackGreen
DARKFRAME, // EvPreProcessExpBlackBlue
- RGBCURVE, //EvFilmSimulationEnabled
- RGBCURVE, //EvFilmSimulationStrength
- RGBCURVE, //EvFilmSimulationFilename
- ALLNORAW, // EvDPDNLCurve
- ALLNORAW, // EvDPDNsmet
+ RGBCURVE, // EvFilmSimulationEnabled
+ RGBCURVE, // EvFilmSimulationStrength
+ RGBCURVE, // EvFilmSimulationFilename
+ ALLNORAW, // EvDPDNLCurve
+ ALLNORAW, // EvDPDNsmet
DARKFRAME, // EvPreProcessDeadPixel
- ALLNORAW, //EvDPDNCCCurve
- ALLNORAW, //EvDPDNautochroma
- ALLNORAW, // EvDPDNLmet
- ALLNORAW, // EvDPDNCmet
- ALLNORAW, // EvDPDNC2met
+ ALLNORAW, // EvDPDNCCCurve
+ ALLNORAW, // EvDPDNautochroma
+ ALLNORAW, // EvDPDNLmet
+ ALLNORAW, // EvDPDNCmet
+ ALLNORAW, // EvDPDNC2met
DIRPYREQUALIZER, // EvWavelet
DIRPYREQUALIZER, // EvEnabled
DIRPYREQUALIZER, // EvWavLmethod
@@ -365,69 +370,89 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
DIRPYREQUALIZER, // EvWavdaubcoeffmet
DIRPYREQUALIZER, // EvWavedgreinf
DIRPYREQUALIZER, // EvWaveletch
- DIRPYREQUALIZER, //EvWavCHSLmet
- DIRPYREQUALIZER, //EvWavedgcont
- DIRPYREQUALIZER, //EvWavEDmet
- DIRPYREQUALIZER, //EvWavlev0nois
- DIRPYREQUALIZER, //EvWavlev1nois
- DIRPYREQUALIZER, //EvWavlev2nois
- DIRPYREQUALIZER, //EvWavmedianlev
- DIRPYREQUALIZER, //EvWavHHCurve
- DIRPYREQUALIZER, //EvWavBackmet
- DIRPYREQUALIZER, //EvWavedgedetect
- DIRPYREQUALIZER, //EvWavlipst
- DIRPYREQUALIZER, //EvWavedgedetectthr
- DIRPYREQUALIZER, //EvWavedgedetectthr2
- DIRPYREQUALIZER, //EvWavlinkedg
- DIRPYREQUALIZER, //EvWavCHCurve
- DARKFRAME, //EvPreProcessHotDeadThresh
- SHARPENING, //EvEPDgamma
- DIRPYREQUALIZER, //EvWavtmr
- DIRPYREQUALIZER, //EvWavTMmet
- DIRPYREQUALIZER, //EvWavtmrs
- DIRPYREQUALIZER, //EvWavbalance
- DIRPYREQUALIZER, //EvWaviter
- DIRPYREQUALIZER, //EvWavgamma
- DIRPYREQUALIZER, //EvWavCLCurve
- DIRPYREQUALIZER, //EvWavopacity
- DIRPYREQUALIZER, //EvWavBAmet
- DIRPYREQUALIZER, //EvWavopacityWL
- RESIZE, // EvPrShrEnabled
- RESIZE, // EvPrShrRadius
- RESIZE, // EvPrShrAmount
- RESIZE, // EvPrShrThresh
- RESIZE, // EvPrShrEdgeOnly
- RESIZE, // EvPrShrEdgeRadius=375,
- RESIZE, // EvPrShrEdgeTolerance=376,
- RESIZE, // EvPrShrHaloControl=377,
- RESIZE, // EvPrShrHaloAmount=378,
- RESIZE, // EvPrShrMethod=379,
- RESIZE, // EvPrShrDRadius=380,
- RESIZE, // EvPrShrDAmount=381,
- RESIZE, // EvPrShrDDamping=382,
- RESIZE, // EvPrShrDIterations=383,
- DIRPYREQUALIZER, // EvWavcbenab
- DIRPYREQUALIZER, // EvWavgreenhigh
- DIRPYREQUALIZER, // EvWavbluehigh
- DIRPYREQUALIZER, // EvWavgreenmed
- DIRPYREQUALIZER, // EvWavbluemed
- DIRPYREQUALIZER, // EvWavgreenlow
- DIRPYREQUALIZER, // EvWavbluelow
- DIRPYREQUALIZER, // EvWavNeutral
- RGBCURVE, // EvDCPApplyLookTable,
- RGBCURVE, // EvDCPApplyBaselineExposureOffset,
- INPUTPROFILE, // EvDCPApplyHueSatMap
- DIRPYREQUALIZER, // EvWavenacont
- DIRPYREQUALIZER, // EvWavenachrom
- DIRPYREQUALIZER, // EvWavenaedge
- DIRPYREQUALIZER, // EvWavenares
- DIRPYREQUALIZER, // EvWavenafin
- DIRPYREQUALIZER, // EvWavenatoning
- DIRPYREQUALIZER, // EvWavenanoise
- DIRPYREQUALIZER, // EvWavedgesensi
- DIRPYREQUALIZER, // EvWavedgeampli
- DIRPYREQUALIZER, //EvWavlev3nois
- DIRPYREQUALIZER //EvWavNPmet
-
+ DIRPYREQUALIZER, // EvWavCHSLmet
+ DIRPYREQUALIZER, // EvWavedgcont
+ DIRPYREQUALIZER, // EvWavEDmet
+ DIRPYREQUALIZER, // EvWavlev0nois
+ DIRPYREQUALIZER, // EvWavlev1nois
+ DIRPYREQUALIZER, // EvWavlev2nois
+ DIRPYREQUALIZER, // EvWavmedianlev
+ DIRPYREQUALIZER, // EvWavHHCurve
+ DIRPYREQUALIZER, // EvWavBackmet
+ DIRPYREQUALIZER, // EvWavedgedetect
+ DIRPYREQUALIZER, // EvWavlipst
+ DIRPYREQUALIZER, // EvWavedgedetectthr
+ DIRPYREQUALIZER, // EvWavedgedetectthr2
+ DIRPYREQUALIZER, // EvWavlinkedg
+ DIRPYREQUALIZER, // EvWavCHCurve
+ DARKFRAME, // EvPreProcessHotDeadThresh
+ SHARPENING, // EvEPDgamma
+ DIRPYREQUALIZER, // EvWavtmr
+ DIRPYREQUALIZER, // EvWavTMmet
+ DIRPYREQUALIZER, // EvWavtmrs
+ DIRPYREQUALIZER, // EvWavbalance
+ DIRPYREQUALIZER, // EvWaviter
+ DIRPYREQUALIZER, // EvWavgamma
+ DIRPYREQUALIZER, // EvWavCLCurve
+ DIRPYREQUALIZER, // EvWavopacity
+ DIRPYREQUALIZER, // EvWavBAmet
+ DIRPYREQUALIZER, // EvWavopacityWL
+ RESIZE, // EvPrShrEnabled
+ RESIZE, // EvPrShrRadius
+ RESIZE, // EvPrShrAmount
+ RESIZE, // EvPrShrThresh
+ RESIZE, // EvPrShrEdgeOnly
+ RESIZE, // EvPrShrEdgeRadius=375,
+ RESIZE, // EvPrShrEdgeTolerance=376,
+ RESIZE, // EvPrShrHaloControl=377,
+ RESIZE, // EvPrShrHaloAmount=378,
+ RESIZE, // EvPrShrMethod=379,
+ RESIZE, // EvPrShrDRadius=380,
+ RESIZE, // EvPrShrDAmount=381,
+ RESIZE, // EvPrShrDDamping=382,
+ RESIZE, // EvPrShrDIterations=383,
+ DIRPYREQUALIZER, // EvWavcbenab
+ DIRPYREQUALIZER, // EvWavgreenhigh
+ DIRPYREQUALIZER, // EvWavbluehigh
+ DIRPYREQUALIZER, // EvWavgreenmed
+ DIRPYREQUALIZER, // EvWavbluemed
+ DIRPYREQUALIZER, // EvWavgreenlow
+ DIRPYREQUALIZER, // EvWavbluelow
+ DIRPYREQUALIZER, // EvWavNeutral
+ RGBCURVE, // EvDCPApplyLookTable,
+ RGBCURVE, // EvDCPApplyBaselineExposureOffset,
+ INPUTPROFILE, // EvDCPApplyHueSatMap
+ DIRPYREQUALIZER, // EvWavenacont
+ DIRPYREQUALIZER, // EvWavenachrom
+ DIRPYREQUALIZER, // EvWavenaedge
+ DIRPYREQUALIZER, // EvWavenares
+ DIRPYREQUALIZER, // EvWavenafin
+ DIRPYREQUALIZER, // EvWavenatoning
+ DIRPYREQUALIZER, // EvWavenanoise
+ DIRPYREQUALIZER, // EvWavedgesensi
+ DIRPYREQUALIZER, // EvWavedgeampli
+ DIRPYREQUALIZER, // EvWavlev3nois
+ DIRPYREQUALIZER, // EvWavNPmet
+ ALLNORAW, // EvretinexMethod
+ ALLNORAW, // EvLneigh
+ ALLNORAW, // EvLgain
+ ALLNORAW, // EvLoffs
+ ALLNORAW, // EvLstr
+ ALLNORAW, // EvLscal
+ ALLNORAW, // EvLvart
+ ALLNORAW, // EvLCDCurve
+ ALLNORAW, // EvRetinextransmission
+ DEMOSAIC, // EvRetinexEnabled
+ ALLNORAW, // EvRetinexmedianmap
+ ALLNORAW, // EvLlimd
+ DEMOSAIC, // Evretinexcolorspace
+ ALLNORAW, // EvLCDHCurve
+ DEMOSAIC, // Evretinexgamma
+ DEMOSAIC, // EvLgam
+ DEMOSAIC, // EvLslope
+ ALLNORAW, // EvLhighl
+ DEMOSAIC, // EvLbaselog
+// DEMOSAIC, // EvLgrbl
+ DEMOSAIC // EvRetinexlhcurve
};
diff --git a/rtengine/refreshmap.h b/rtengine/refreshmap.h
index 7aefcbcc3..16c05654a 100644
--- a/rtengine/refreshmap.h
+++ b/rtengine/refreshmap.h
@@ -68,7 +68,6 @@
#define INPUTPROFILE WHITEBALANCE
#define GAMMA (M_COLOR|M_LUMINANCE)
#define MINUPDATE M_MINUPDATE
-#define NONE 0
#define ALLNORAW (M_INIT|M_LINDENOISE|M_TRANSFORM|M_BLURMAP|M_AUTOEXP|M_RGBCURVE|M_LUMACURVE|M_LUMINANCE|M_COLOR)
extern int refreshmap[];
diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h
index 6c727ac87..195911a3a 100644
--- a/rtengine/rtengine.h
+++ b/rtengine/rtengine.h
@@ -250,7 +250,7 @@ public:
* @param histLuma is the array of size 256 containing the histogram of the luminance channel
* other for curves backgrounds, histRAW is RAW without colors */
virtual void histogramChanged (LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve,LUTu & histLLCurve, */LUTu & histLCAM, LUTu & histCCAM,
- LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw, LUTu & histChroma) {}
+ LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw, LUTu & histChroma, LUTu & histLRETI) {}
};
/** This listener is used when the auto exposure has been recomputed (e.g. when the clipping ratio changed). */
@@ -287,6 +287,14 @@ public :
};
+class RetinexListener
+{
+public :
+ virtual ~RetinexListener() {}
+ virtual void minmaxChanged (double cdma, double cdmin, double mini, double maxi, double Tmean, double Tsigma, double Tmin, double Tmax) {}
+
+};
+
class AutoColorTonListener
{
public :
@@ -405,6 +413,7 @@ public:
virtual void setAutoBWListener (AutoBWListener* l) = 0;
virtual void setAutoColorTonListener (AutoColorTonListener* l) = 0;
virtual void setAutoChromaListener (AutoChromaListener* l) = 0;
+ virtual void setRetinexListener (RetinexListener* l) = 0;
virtual void setWaveletListener (WaveletListener* l) = 0;
virtual ~StagedImageProcessor () {}
diff --git a/rtengine/shmap.cc b/rtengine/shmap.cc
index cb2a2a332..34fadd5e7 100644
--- a/rtengine/shmap.cc
+++ b/rtengine/shmap.cc
@@ -74,10 +74,7 @@ void SHMap::update (Imagefloat* img, double radius, double lumi[3], bool hq, int
#pragma omp parallel
#endif
{
- AlignedBufferMP* pBuffer = new AlignedBufferMP (max(W, H));
- gaussHorizontal (map, map, *pBuffer, W, H, radius);
- gaussVertical (map, map, *pBuffer, W, H, radius);
- delete pBuffer;
+ gaussianBlur (map, map, W, H, radius);
}
}
diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc
index 048fca0c2..91b7df178 100644
--- a/rtengine/simpleprocess.cc
+++ b/rtengine/simpleprocess.cc
@@ -116,12 +116,31 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p
pl->setProgress (0.30);
}
- imgsrc->HLRecovery_Global( params.toneCurve );
+ if(params.retinex.enabled) { //enabled Retinex
+ LUTf cdcurve (65536, 0);
+ LUTu dummy;
+ RetinextransmissionCurve dehatransmissionCurve;
+ bool dehacontlutili = false;
+ bool useHsl = false;
+// multi_array2D conversionBuffer(1, 1);
+ multi_array2D conversionBuffer(1, 1);
+ imgsrc->retinexPrepareBuffers(params.icm, params.retinex, conversionBuffer, dummy);
+ imgsrc->retinexPrepareCurves(params.retinex, cdcurve, dehatransmissionCurve, dehacontlutili, useHsl, dummy, dummy );
+ float minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax;
+ imgsrc->retinex( params.icm, params.retinex, params.toneCurve, cdcurve, dehatransmissionCurve, conversionBuffer, dehacontlutili, useHsl, minCD, maxCD, mini, maxi, Tmean, Tsigma, Tmin, Tmax, dummy);
+ }
if (pl) {
pl->setProgress (0.40);
}
+ imgsrc->HLRecovery_Global( params.toneCurve );
+
+
+ if (pl) {
+ pl->setProgress (0.45);
+ }
+
// set the color temperature
ColorTemp currWB = ColorTemp (params.wb.temperature, params.wb.green, params.wb.equal, params.wb.method);
@@ -610,7 +629,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p
imgsrc->getImage (currWB, tr, baseImg, pp, params.toneCurve, params.icm, params.raw);
if (pl) {
- pl->setProgress (0.45);
+ pl->setProgress (0.50);
}
// LUTf Noisecurve (65536,0);
@@ -797,7 +816,6 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p
float moyS = 0.f;
float eqty = 0.f;
ipf.moyeqt (baseImg, moyS, eqty);//return image : mean saturation and standard dev of saturation
- //printf("moy=%f ET=%f\n", moyS,eqty);
float satp = ((moyS + 1.5f * eqty) - 0.3f) / 0.7f; //1.5 sigma ==> 93% pixels with high saturation -0.3 / 0.7 convert to Hombre scale
if(satp >= 0.92f) {
@@ -847,7 +865,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p
shmap = NULL;
if (pl) {
- pl->setProgress (0.5);
+ pl->setProgress (0.55);
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -901,6 +919,7 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p
params.labCurve.acurve, params.labCurve.bcurve, params.labCurve.cccurve, params.labCurve.lccurve, curve1, curve2, satcurve, lhskcurve,
hist16C, hist16C, dummy, dummy,
1);
+// ipf.MSR(labView, labView->W, labView->H, 1);
ipf.chromiLuminanceCurve (NULL, 1, labView, labView, curve1, curve2, satcurve, lhskcurve, clcurve, lumacurve, utili, autili, butili, ccutili, cclutili, clcutili, dummy, dummy, dummy, dummy);
diff --git a/rtengine/sleefsseavx.c b/rtengine/sleefsseavx.c
index 6b83c859a..c2d1278f4 100644
--- a/rtengine/sleefsseavx.c
+++ b/rtengine/sleefsseavx.c
@@ -1322,5 +1322,11 @@ static inline void vswap( vmask condition, vfloat &a, vfloat &b) {
b = temp;
}
+static inline float vhadd( vfloat a )
+{
+ a += _mm_movehl_ps(a, a);
+ return _mm_cvtss_f32(_mm_add_ss(a, _mm_shuffle_ps(a, a, 1)));
+}
+
#endif // __SSE2__
#endif // SLEEFSSEAVX
diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h
index 3848fe5e9..6017fae74 100644
--- a/rtengine/stdimagesource.h
+++ b/rtengine/stdimagesource.h
@@ -92,7 +92,6 @@ public:
void convertColorSpace(Imagefloat* image, ColorManagementParams cmp, ColorTemp &wb);// RAWParams raw will not be used for non-raw files (see imagesource.h)
static void colorSpaceConversion (Imagefloat* im, ColorManagementParams cmp, cmsHPROFILE embedded, IIOSampleFormat sampleFormat);
- //static void colorSpaceConversion16 (Image16* im, ColorManagementParams cmp, cmsHPROFILE embedded);
static inline double intpow (double a, int b)
{
diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt
index c21dd6c55..5f5dbc1c1 100644
--- a/rtgui/CMakeLists.txt
+++ b/rtgui/CMakeLists.txt
@@ -17,7 +17,7 @@ set (BASESOURCEFILES
previewloader.cc rtimage.cc inspector.cc
histogrampanel.cc history.cc imagearea.cc
imageareapanel.cc iptcpanel.cc labcurve.cc main.cc
- multilangmgr.cc mycurve.cc myflatcurve.cc mydiagonalcurve.cc options.cc
+ multilangmgr.cc mycurve.cc myflatcurve.cc mydiagonalcurve.cc options.cc retinex.cc
preferences.cc profilepanel.cc saveasdlg.cc
saveformatpanel.cc soundman.cc splash.cc
thumbnail.cc tonecurve.cc toolbar.cc
diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h
index 8f6ef6685..5db492db3 100644
--- a/rtgui/addsetids.h
+++ b/rtgui/addsetids.h
@@ -107,8 +107,17 @@
#define ADDSET_WA_EDGEDETECTTHR2 99
#define ADDSET_WA_TMRS 100
#define ADDSET_WA_GAMMA 101
+#define ADDSET_RETI_STR 102
+#define ADDSET_RETI_SCAL 103
+#define ADDSET_RETI_NEIGH 104
+#define ADDSET_RETI_LIMD 105
+#define ADDSET_RETI_GAIN 106
+#define ADDSET_RETI_OFFS 107
+#define ADDSET_RETI_VART 108
+#define ADDSET_RETI_GAM 109
+#define ADDSET_RETI_SLO 110
// When adding items, make sure to update ADDSET_PARAM_NUM
-#define ADDSET_PARAM_NUM 102 // THIS IS USED AS A DELIMITER!!
+#define ADDSET_PARAM_NUM 111 // THIS IS USED AS A DELIMITER!!
#endif
diff --git a/rtgui/adjuster.cc b/rtgui/adjuster.cc
index 5f093dc59..0a6e82241 100644
--- a/rtgui/adjuster.cc
+++ b/rtgui/adjuster.cc
@@ -17,14 +17,7 @@
* along with RawTherapee. If not, see .
*/
#include "adjuster.h"
-
-// class_slot is no longer part of the sigc++ source tree, but starting from which version ?
-#if 1
#include
-#else
-#include
-#endif
-
#include
#include "multilangmgr.h"
#include "../rtengine/rtengine.h"
diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc
index 95f7f3ec7..e1d78a19f 100644
--- a/rtgui/batchtoolpanelcoord.cc
+++ b/rtgui/batchtoolpanelcoord.cc
@@ -167,6 +167,7 @@ void BatchToolPanelCoordinator::initSession ()
blackwhite->setAdjusterBehavior (false, false);
colortoning->setAdjusterBehavior (false, false, false, false, false);
filmSimulation->setAdjusterBehavior(false);
+ retinex->setAdjusterBehavior (false, false, false, false, false, false, false, false, false);
shadowshighlights->setAdjusterBehavior (false, false, false);
dirpyrequalizer->setAdjusterBehavior (false, false, false);
@@ -203,6 +204,7 @@ void BatchToolPanelCoordinator::initSession ()
// colortoning->setAdjusterBehavior (options.baBehav[ADDSET_COLORTONING_SPLIT], options.baBehav[ADDSET_COLORTONING_SATTHRESHOLD], options.baBehav[ADDSET_COLORTONING_SATOPACITY], options.baBehav[ADDSET_COLORTONING_STRPROTECT], options.baBehav[ADDSET_COLORTONING_BALANCE]);
colortoning->setAdjusterBehavior (options.baBehav[ADDSET_COLORTONING_SPLIT], options.baBehav[ADDSET_COLORTONING_SATTHRESHOLD], options.baBehav[ADDSET_COLORTONING_SATOPACITY], options.baBehav[ADDSET_COLORTONING_STRENGTH], options.baBehav[ADDSET_COLORTONING_BALANCE]);
filmSimulation->setAdjusterBehavior(options.baBehav[ADDSET_FILMSIMULATION_STRENGTH]);
+ retinex->setAdjusterBehavior (options.baBehav[ADDSET_RETI_STR], options.baBehav[ADDSET_RETI_SCAL], options.baBehav[ADDSET_RETI_NEIGH], options.baBehav[ADDSET_RETI_LIMD], options.baBehav[ADDSET_RETI_GAIN], options.baBehav[ADDSET_RETI_OFFS], options.baBehav[ADDSET_RETI_VART], options.baBehav[ADDSET_RETI_GAM], options.baBehav[ADDSET_RETI_SLO]);
chmixer->setAdjusterBehavior (options.baBehav[ADDSET_CHMIXER] );
blackwhite->setAdjusterBehavior (options.baBehav[ADDSET_BLACKWHITE_HUES], options.baBehav[ADDSET_BLACKWHITE_GAMMA]);
@@ -576,6 +578,41 @@ void BatchToolPanelCoordinator::initSession ()
pparams.wavelet.gamma = 0;
}
+ if (options.baBehav[ADDSET_RETI_STR]) {
+ pparams.retinex.str = 0;
+ }
+
+ if (options.baBehav[ADDSET_RETI_SCAL]) {
+ pparams.retinex.scal = 0;
+ }
+
+ if (options.baBehav[ADDSET_RETI_NEIGH]) {
+ pparams.retinex.neigh = 0;
+ }
+
+ if (options.baBehav[ADDSET_RETI_LIMD]) {
+ pparams.retinex.limd = 0;
+ }
+
+ if (options.baBehav[ADDSET_RETI_GAIN]) {
+ pparams.retinex.gain = 0;
+ }
+
+ if (options.baBehav[ADDSET_RETI_OFFS]) {
+ pparams.retinex.offs = 0;
+ }
+
+ if (options.baBehav[ADDSET_RETI_VART]) {
+ pparams.retinex.vart = 0;
+ }
+
+ if (options.baBehav[ADDSET_RETI_GAM]) {
+ pparams.retinex.gam = 0;
+ }
+
+ if (options.baBehav[ADDSET_RETI_SLO]) {
+ pparams.retinex.slope = 0;
+ }
if (options.baBehav[ADDSET_DIRPYRDN_LUMA]) {
pparams.dirpyrDenoise.luma = 0;
diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc
index f3575e414..083755f79 100644
--- a/rtgui/colorappearance.cc
+++ b/rtgui/colorappearance.cc
@@ -1297,7 +1297,7 @@ void ColorAppearance::setBatchMode (bool batchMode)
curveEditorG3->setBatchMode (batchMode);
}
-void ColorAppearance::updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma)
+void ColorAppearance::updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histLRETI)
{
shape->updateBackgroundHistogram (histLCAM);
diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h
index 977b89ed7..04fe2a3bb 100644
--- a/rtgui/colorappearance.h
+++ b/rtgui/colorappearance.h
@@ -131,7 +131,7 @@ public:
void setAdjusterBehavior (bool degreeadd, bool adapscenadd, bool adaplumadd, bool badpixsladd, bool jlightadd, bool chromaadd, bool contrastadd, bool rstprotectionadd, bool qbrightadd, bool qcontrastadd, bool schromaadd, bool mchromaadd, bool colorhadd);
void trimValues (rtengine::procparams::ProcParams* pp);
- void updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma);
+ void updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histLRETI);
virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller);
};
diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc
index b04028266..5bc3b81b0 100644
--- a/rtgui/editorpanel.cc
+++ b/rtgui/editorpanel.cc
@@ -572,6 +572,7 @@ void EditorPanel::open (Thumbnail* tmb, rtengine::InitialImage* isrc)
Gtk::Allocation alloc;
iareapanel->imageArea->on_resized(alloc);
}
+
history->resetSnapShotNumber();
}
@@ -1776,14 +1777,14 @@ void EditorPanel::tbBeforeLock_toggled ()
}
void EditorPanel::histogramChanged (LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve, /*LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM,
- LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw , LUTu & histChroma)
+ LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw , LUTu & histChroma, LUTu & histLRETI)
{
if (histogramPanel) {
histogramPanel->histogramChanged (histRed, histGreen, histBlue, histLuma, histRedRaw, histGreenRaw, histBlueRaw, histChroma);
}
- tpc->updateCurveBackgroundHistogram (histToneCurve, histLCurve, histCCurve,/*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma);
+ tpc->updateCurveBackgroundHistogram (histToneCurve, histLCurve, histCCurve,/*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI);
}
bool EditorPanel::CheckSidePanelsVisibility()
diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h
index db5b75aac..78b919806 100644
--- a/rtgui/editorpanel.h
+++ b/rtgui/editorpanel.h
@@ -176,7 +176,7 @@ public:
// HistogramListener
void histogramChanged (LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM,
- LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw, LUTu & histChroma);
+ LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw, LUTu & histChroma, LUTu & histLRETI);
// event handlers
void info_toggled ();
diff --git a/rtgui/history.h b/rtgui/history.h
index ad4e94ec0..c1d03c25f 100644
--- a/rtgui/history.h
+++ b/rtgui/history.h
@@ -127,7 +127,10 @@ public:
void redo ();
bool blistenerLock;
- void resetSnapShotNumber() {bmnum = 1;};
+ void resetSnapShotNumber()
+ {
+ bmnum = 1;
+ };
};
#endif
diff --git a/rtgui/labcurve.cc b/rtgui/labcurve.cc
index f5b11f0e9..7e5bf7b53 100644
--- a/rtgui/labcurve.cc
+++ b/rtgui/labcurve.cc
@@ -206,12 +206,16 @@ LCurve::LCurve () : FoldableToolPanel(this, "labcurves", M("TP_LABCURVE_LABEL"))
curveEditorG->curveListComplete();
pack_start (*curveEditorG, Gtk::PACK_SHRINK, 4);
+ Gtk::HSeparator *hsepdh = Gtk::manage (new Gtk::HSeparator());
+ hsepdh->show ();
+ pack_start (*hsepdh, Gtk::PACK_EXPAND_WIDGET, 4);
}
LCurve::~LCurve ()
{
delete curveEditorG;
+
}
void LCurve::read (const ProcParams* pp, const ParamsEdited* pedited)
@@ -246,7 +250,6 @@ void LCurve::read (const ProcParams* pp, const ParamsEdited* pedited)
contrast->setValue (pp->labCurve.contrast);
chromaticity->setValue (pp->labCurve.chromaticity);
adjusterChanged(chromaticity, pp->labCurve.chromaticity); // To update the GUI sensitiveness
-
//%%%%%%%%%%%%%%%%%%%%%%
rstprotection->setValue (pp->labCurve.rstprotection);
@@ -315,6 +318,7 @@ void LCurve::autoOpenCurve ()
if (!active) {
clshape->openIfNonlinear();
}
+
}
void LCurve::setEditProvider (EditDataProvider *provider)
@@ -338,7 +342,6 @@ void LCurve::write (ProcParams* pp, ParamsEdited* pedited)
pp->labCurve.brightness = brightness->getValue ();
pp->labCurve.contrast = (int)contrast->getValue ();
pp->labCurve.chromaticity = (int)chromaticity->getValue ();
-
//%%%%%%%%%%%%%%%%%%%%%%
pp->labCurve.avoidcolorshift = avoidcolorshift->get_active ();
pp->labCurve.lcredsk = lcredsk->get_active ();
@@ -366,7 +369,6 @@ void LCurve::write (ProcParams* pp, ParamsEdited* pedited)
pedited->labCurve.lcredsk = !lcredsk->get_inconsistent();
pedited->labCurve.rstprotection = rstprotection->getEditedState ();
- //%%%%%%%%%%%%%%%%%%%%%%
pedited->labCurve.lcurve = !lshape->isUnChanged ();
pedited->labCurve.acurve = !ashape->isUnChanged ();
@@ -377,7 +379,10 @@ void LCurve::write (ProcParams* pp, ParamsEdited* pedited)
pedited->labCurve.hhcurve = !hhshape->isUnChanged ();
pedited->labCurve.lccurve = !lcshape->isUnChanged ();
pedited->labCurve.clcurve = !clshape->isUnChanged ();
+
+
}
+
}
void LCurve::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited)
@@ -393,7 +398,6 @@ void LCurve::setDefaults (const ProcParams* defParams, const ParamsEdited* pedit
contrast->setDefaultEditedState (pedited->labCurve.contrast ? Edited : UnEdited);
chromaticity->setDefaultEditedState (pedited->labCurve.chromaticity ? Edited : UnEdited);
rstprotection->setDefaultEditedState (pedited->labCurve.rstprotection ? Edited : UnEdited);
-
} else {
brightness->setDefaultEditedState (Irrelevant);
contrast->setDefaultEditedState (Irrelevant);
@@ -503,6 +507,8 @@ void LCurve::curveChanged (CurveEditor* ce)
if (ce == clshape) {
listener->panelChanged (EvLCLCurve, M("HISTORY_CUSTOMCURVE"));
}
+
+
}
}
@@ -616,14 +622,13 @@ void LCurve::setBatchMode (bool batchMode)
contrast->showEditedCB ();
chromaticity->showEditedCB ();
rstprotection->showEditedCB ();
-
curveEditorG->setBatchMode (batchMode);
lcshape->setBottomBarColorProvider(NULL, -1);
lcshape->setLeftBarColorProvider(NULL, -1);
}
-void LCurve::updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma)
+void LCurve::updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histLRETI)
{
lshape->updateBackgroundHistogram (histLCurve);
diff --git a/rtgui/labcurve.h b/rtgui/labcurve.h
index f679fc020..6caba6b8a 100644
--- a/rtgui/labcurve.h
+++ b/rtgui/labcurve.h
@@ -31,6 +31,7 @@ class LCurve : public ToolParamBlock, public AdjusterListener, public FoldableTo
protected:
CurveEditorGroup* curveEditorG;
+// CurveEditorGroup* curveEditorGD;
Adjuster* brightness;
Adjuster* contrast;
Adjuster* chromaticity;
@@ -42,8 +43,11 @@ protected:
FlatCurveEditor* chshape;
FlatCurveEditor* lhshape;
FlatCurveEditor* hhshape;
+ Gtk::Label* labmdh;
+ Gtk::HBox* dhbox;
DiagonalCurveEditor* clshape;
+ DiagonalCurveEditor* cdshape;
//%%%%%%%%%%%%%%%%
Gtk::CheckButton* avoidcolorshift;
@@ -74,9 +78,14 @@ public:
void avoidcolorshift_toggled ();
void lcredsk_toggled();
- void updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma);
+ void updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histLRETI);
virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller);
+
+private:
+
+
+
};
#endif
diff --git a/rtgui/main.cc b/rtgui/main.cc
index 25c4e9bdb..ba5cf2bb4 100644
--- a/rtgui/main.cc
+++ b/rtgui/main.cc
@@ -283,6 +283,10 @@ int main(int argc, char **argv)
simpleEditor = true;
}
+ if (options.theme.empty()) {
+ options.theme = "21-Gray-Gray";
+ }
+
Gtk::Main m(&argc, &argv);
Glib::ustring icon_path = Glib::build_filename(argv0, "images");
diff --git a/rtgui/options.cc b/rtgui/options.cc
index 3fb8e0c1a..84f860123 100644
--- a/rtgui/options.cc
+++ b/rtgui/options.cc
@@ -178,6 +178,10 @@ void Options::updatePaths()
lastLabCurvesDir = preferredPath;
}
+ if (lastRetinexDir.empty() || !safe_file_test (lastRetinexDir, Glib::FILE_TEST_EXISTS) || !safe_file_test (lastLabCurvesDir, Glib::FILE_TEST_IS_DIR)) {
+ lastRetinexDir = preferredPath;
+ }
+
if (lastDenoiseCurvesDir.empty() || !safe_file_test (lastDenoiseCurvesDir, Glib::FILE_TEST_EXISTS) || !safe_file_test (lastDenoiseCurvesDir, Glib::FILE_TEST_IS_DIR)) {
lastDenoiseCurvesDir = preferredPath;
}
@@ -594,6 +598,15 @@ void Options::setDefaults ()
0, //ADDSET_WA_EDGEDETECTTHR2
0, //ADDSET_WA_TMRS
0, //ADDSET_WA_GAMMA
+ 0, //ADDSET_RETI_STR
+ 0, //ADDSET_RETI_SCAL
+ 0, //ADDSET_RETI_NEIGH
+ 0, //ADDSET_RETI_LIMD
+ 0, //ADDSET_RETI_GAIN
+ 0, //ADDSET_RETI_OFFS
+ 0, //ADDSET_RETI_VART
+ 0, //ADDSET_RETI_GAM
+ 0, //ADDSET_RETI_SLO
};
baBehav = std::vector (babehav, babehav + ADDSET_PARAM_NUM);
@@ -683,6 +696,7 @@ void Options::setDefaults ()
// at the end of the "updatePaths" method.
lastRgbCurvesDir = "";
lastLabCurvesDir = "";
+ lastRetinexDir = "";
lastDenoiseCurvesDir = "";
lastWaveletCurvesDir = "";
lastPFCurvesDir = "";
@@ -1738,6 +1752,7 @@ int Options::readFromFile (Glib::ustring fname)
safeDirGet(keyFile, "Dialogs", "LastFlatfieldDir", lastFlatfieldDir);
safeDirGet(keyFile, "Dialogs", "LastRgbCurvesDir", lastRgbCurvesDir);
safeDirGet(keyFile, "Dialogs", "LastLabCurvesDir", lastLabCurvesDir);
+ safeDirGet(keyFile, "Dialogs", "LastRetinexDir", lastRetinexDir);
safeDirGet(keyFile, "Dialogs", "LastDenoiseCurvesDir", lastDenoiseCurvesDir);
safeDirGet(keyFile, "Dialogs", "LastWaveletCurvesDir", lastWaveletCurvesDir);
safeDirGet(keyFile, "Dialogs", "LastPFCurvesDir", lastPFCurvesDir);
@@ -2075,6 +2090,7 @@ int Options::saveToFile (Glib::ustring fname)
keyFile.set_string ("Dialogs", "LastFlatfieldDir", lastFlatfieldDir);
keyFile.set_string ("Dialogs", "LastRgbCurvesDir", lastRgbCurvesDir);
keyFile.set_string ("Dialogs", "LastLabCurvesDir", lastLabCurvesDir);
+ keyFile.set_string ("Dialogs", "LastRetinexDir", lastRetinexDir);
keyFile.set_string ("Dialogs", "LastDenoiseCurvesDir", lastDenoiseCurvesDir);
keyFile.set_string ("Dialogs", "LastWaveletCurvesDir", lastWaveletCurvesDir);
keyFile.set_string ("Dialogs", "LastPFCurvesDir", lastPFCurvesDir);
diff --git a/rtgui/options.h b/rtgui/options.h
index 73b22f4a7..614042fa2 100644
--- a/rtgui/options.h
+++ b/rtgui/options.h
@@ -279,6 +279,7 @@ public:
Glib::ustring lastFlatfieldDir;
Glib::ustring lastRgbCurvesDir;
Glib::ustring lastLabCurvesDir;
+ Glib::ustring lastRetinexDir;
Glib::ustring lastDenoiseCurvesDir;
Glib::ustring lastWaveletCurvesDir;
Glib::ustring lastPFCurvesDir;
diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc
index a597662b7..08433357c 100644
--- a/rtgui/paramsedited.cc
+++ b/rtgui/paramsedited.cc
@@ -49,6 +49,28 @@ void ParamsEdited::set (bool v)
toneCurve.expcomp = v;
toneCurve.hrenabled = v;
toneCurve.method = v;
+ retinex.cdcurve = v;
+ retinex.cdHcurve = v;
+ retinex.lhcurve = v;
+ retinex.retinexMethod = v;
+ retinex.retinexcolorspace = v;
+ retinex.gammaretinex = v;
+ retinex.enabled = v;
+ retinex.str = v;
+ retinex.scal = v;
+ retinex.gam = v;
+ retinex.slope = v;
+ retinex.neigh = v;
+ retinex.gain = v;
+ retinex.offs = v;
+ retinex.vart = v;
+ retinex.limd = v;
+ retinex.highl = v;
+ retinex.baselog = v;
+// retinex.grbl = v;
+ retinex.medianmap = v;
+ retinex.transmissionCurve = v;
+ retinex.retinex = v;
labCurve.lcurve = v;
labCurve.acurve = v;
labCurve.bcurve = v;
@@ -504,6 +526,27 @@ void ParamsEdited::initFrom (const std::vector
toneCurve.expcomp = toneCurve.expcomp && p.toneCurve.expcomp == other.toneCurve.expcomp;
toneCurve.hrenabled = toneCurve.hrenabled && p.toneCurve.hrenabled == other.toneCurve.hrenabled;
toneCurve.method = toneCurve.method && p.toneCurve.method == other.toneCurve.method;
+ retinex.cdcurve = retinex.cdcurve && p.retinex.cdcurve == other.retinex.cdcurve;
+ retinex.cdHcurve = retinex.cdHcurve && p.retinex.cdHcurve == other.retinex.cdHcurve;
+ retinex.lhcurve = retinex.lhcurve && p.retinex.lhcurve == other.retinex.lhcurve;
+ retinex.transmissionCurve = retinex.transmissionCurve && p.retinex.transmissionCurve == other.retinex.transmissionCurve;
+ retinex.retinexMethod = retinex.retinexMethod && p.retinex.retinexMethod == other.retinex.retinexMethod;
+ retinex.retinexcolorspace = retinex.retinexcolorspace && p.retinex.retinexcolorspace == other.retinex.retinexcolorspace;
+ retinex.gammaretinex = retinex.gammaretinex && p.retinex.gammaretinex == other.retinex.gammaretinex;
+ retinex.str = retinex.str && p.retinex.str == other.retinex.str;
+ retinex.scal = retinex.scal && p.retinex.scal == other.retinex.scal;
+ retinex.gam = retinex.gam && p.retinex.gam == other.retinex.gam;
+ retinex.slope = retinex.slope && p.retinex.slope == other.retinex.slope;
+ retinex.neigh = retinex.neigh && p.retinex.neigh == other.retinex.neigh;
+ retinex.gain = retinex.gain && p.retinex.gain == other.retinex.gain;
+ retinex.offs = retinex.offs && p.retinex.offs == other.retinex.offs;
+ retinex.vart = retinex.vart && p.retinex.vart == other.retinex.vart;
+ retinex.limd = retinex.limd && p.retinex.limd == other.retinex.limd;
+ retinex.highl = retinex.highl && p.retinex.highl == other.retinex.highl;
+ retinex.baselog = retinex.baselog && p.retinex.baselog == other.retinex.baselog;
+// retinex.grbl = retinex.grbl && p.retinex.grbl == other.retinex.grbl;
+ retinex.medianmap = retinex.medianmap && p.retinex.medianmap == other.retinex.medianmap;
+ retinex.enabled = retinex.enabled && p.retinex.enabled == other.retinex.enabled;
labCurve.lcurve = labCurve.lcurve && p.labCurve.lcurve == other.labCurve.lcurve;
labCurve.acurve = labCurve.acurve && p.labCurve.acurve == other.labCurve.acurve;
labCurve.bcurve = labCurve.bcurve && p.labCurve.bcurve == other.labCurve.bcurve;
@@ -995,6 +1038,90 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
toEdit.toneCurve.method = mods.toneCurve.method;
}
+ if (retinex.enabled) {
+ toEdit.retinex.enabled = mods.retinex.enabled;
+ }
+
+ if (retinex.cdcurve) {
+ toEdit.retinex.cdcurve = mods.retinex.cdcurve;
+ }
+
+ if (retinex.cdHcurve) {
+ toEdit.retinex.cdHcurve = mods.retinex.cdHcurve;
+ }
+
+ if (retinex.lhcurve) {
+ toEdit.retinex.lhcurve = mods.retinex.lhcurve;
+ }
+
+ if (retinex.transmissionCurve) {
+ toEdit.retinex.transmissionCurve = mods.retinex.transmissionCurve;
+ }
+
+ if (retinex.retinexMethod) {
+ toEdit.retinex.retinexMethod = mods.retinex.retinexMethod;
+ }
+
+ if (retinex.retinexcolorspace) {
+ toEdit.retinex.retinexcolorspace = mods.retinex.retinexcolorspace;
+ }
+
+ if (retinex.gammaretinex) {
+ toEdit.retinex.gammaretinex = mods.retinex.gammaretinex;
+ }
+
+ if (retinex.gam) {
+ toEdit.retinex.gam = dontforceSet && options.baBehav[ADDSET_RETI_GAM] ? toEdit.retinex.gam + mods.retinex.gam : mods.retinex.gam;
+ }
+
+ if (retinex.slope) {
+ toEdit.retinex.slope = dontforceSet && options.baBehav[ADDSET_RETI_SLO] ? toEdit.retinex.slope + mods.retinex.slope : mods.retinex.slope;
+ }
+
+ if (retinex.str) {
+ toEdit.retinex.str = dontforceSet && options.baBehav[ADDSET_RETI_STR] ? toEdit.retinex.str + mods.retinex.str : mods.retinex.str;
+ }
+
+ if (retinex.scal) {
+ toEdit.retinex.scal = dontforceSet && options.baBehav[ADDSET_RETI_SCAL] ? toEdit.retinex.scal + mods.retinex.scal : mods.retinex.scal;
+ }
+
+ if (retinex.medianmap) {
+ toEdit.retinex.medianmap = mods.retinex.medianmap;
+ }
+
+ if (retinex.neigh) {
+ toEdit.retinex.neigh = dontforceSet && options.baBehav[ADDSET_RETI_NEIGH] ? toEdit.retinex.neigh + mods.retinex.neigh : mods.retinex.neigh;
+ }
+
+ if (retinex.limd) {
+ toEdit.retinex.limd = dontforceSet && options.baBehav[ADDSET_RETI_LIMD] ? toEdit.retinex.limd + mods.retinex.limd : mods.retinex.limd;
+ }
+
+ if (retinex.highl) {
+ toEdit.retinex.highl = mods.retinex.highl;
+ }
+
+ if (retinex.baselog) {
+ toEdit.retinex.baselog = mods.retinex.baselog;
+ }
+
+// if (retinex.grbl) {
+// toEdit.retinex.grbl = mods.retinex.grbl;
+// }
+
+ if (retinex.gain) {
+ toEdit.retinex.gain = dontforceSet && options.baBehav[ADDSET_RETI_GAIN] ? toEdit.retinex.gain + mods.retinex.gain : mods.retinex.gain;
+ }
+
+ if (retinex.offs) {
+ toEdit.retinex.offs = dontforceSet && options.baBehav[ADDSET_RETI_OFFS] ? toEdit.retinex.offs + mods.retinex.offs : mods.retinex.offs;
+ }
+
+ if (retinex.vart) {
+ toEdit.retinex.vart = dontforceSet && options.baBehav[ADDSET_RETI_VART] ? toEdit.retinex.vart + mods.retinex.vart : mods.retinex.vart;
+ }
+
if (labCurve.lcurve) {
toEdit.labCurve.lcurve = mods.labCurve.lcurve;
}
@@ -2571,3 +2698,8 @@ bool LensProfParamsEdited::isUnchanged() const
{
return lcpFile;
}
+
+bool RetinexParamsEdited::isUnchanged() const
+{
+ return enabled && retinexcolorspace && gammaretinex && gam && slope;
+}
\ No newline at end of file
diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h
index a22956b58..36ed1e5ea 100644
--- a/rtgui/paramsedited.h
+++ b/rtgui/paramsedited.h
@@ -55,6 +55,36 @@ public:
bool method;
};
+class RetinexParamsEdited
+{
+public:
+ bool enabled;
+ bool str;
+ bool scal;
+ bool gam;
+ bool slope;
+ bool neigh;
+ bool gain;
+ bool offs;
+ bool retinexMethod;
+ bool retinexcolorspace;
+ bool gammaretinex;
+ bool vart;
+ bool limd;
+ bool highl;
+ bool baselog;
+// bool grbl;
+ bool method;
+ bool transmissionCurve;
+ bool cdcurve;
+ bool cdHcurve;
+ bool lhcurve;
+ bool retinex;
+ bool medianmap;
+ bool isUnchanged() const;
+};
+
+
class LCurveParamsEdited
{
public:
@@ -73,7 +103,6 @@ public:
bool hhcurve;
bool lccurve;
bool clcurve;
-
bool enabled;
bool method;
};
@@ -698,6 +727,7 @@ public:
LCurveParamsEdited labCurve;
RGBCurvesParamsEdited rgbCurves;
ColorToningEdited colorToning;
+ RetinexParamsEdited retinex;
SharpeningParamsEdited sharpening;
SharpeningParamsEdited prsharpening;
SharpenEdgeParamsEdited sharpenEdge;
diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc
index 55da5f1b0..8e0b98320 100644
--- a/rtgui/partialpastedlg.cc
+++ b/rtgui/partialpastedlg.cc
@@ -52,6 +52,7 @@ PartialPasteDlg::PartialPasteDlg (Glib::ustring title)
exposure = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXPOSURE")));
sh = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHADOWSHIGHLIGHTS")));
epd = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EPD")));
+ retinex = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RETINEX")));
pcvignette = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PCVIGNETTE")));
gradient = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_GRADIENT")));
labcurve = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LABCURVE")));
@@ -141,6 +142,7 @@ PartialPasteDlg::PartialPasteDlg (Glib::ustring title)
vboxes[0]->pack_start (*exposure, Gtk::PACK_SHRINK, 2);
vboxes[0]->pack_start (*sh, Gtk::PACK_SHRINK, 2);
vboxes[0]->pack_start (*epd, Gtk::PACK_SHRINK, 2);
+ vboxes[0]->pack_start (*retinex, Gtk::PACK_SHRINK, 2);
vboxes[0]->pack_start (*pcvignette, Gtk::PACK_SHRINK, 2);
vboxes[0]->pack_start (*gradient, Gtk::PACK_SHRINK, 2);
vboxes[0]->pack_start (*labcurve, Gtk::PACK_SHRINK, 2);
@@ -294,6 +296,7 @@ PartialPasteDlg::PartialPasteDlg (Glib::ustring title)
exposureConn = exposure->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
shConn = sh->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
epdConn = epd->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
+ retinexConn = retinex->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
pcvignetteConn = pcvignette->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
gradientConn = gradient->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
labcurveConn = labcurve->signal_toggled().connect (sigc::bind (sigc::mem_fun(*basic, &Gtk::CheckButton::set_inconsistent), true));
@@ -695,6 +698,10 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param
filterPE.epd = falsePE.epd;
}
+ if (!retinex->get_active ()) {
+ filterPE.retinex = falsePE.retinex;
+ }
+
if (!pcvignette->get_active ()) {
filterPE.pcvignette = falsePE.pcvignette;
}
diff --git a/rtgui/partialpastedlg.h b/rtgui/partialpastedlg.h
index 697a9b830..57a235f35 100644
--- a/rtgui/partialpastedlg.h
+++ b/rtgui/partialpastedlg.h
@@ -46,6 +46,7 @@ public:
Gtk::CheckButton* exposure;
Gtk::CheckButton* sh;
Gtk::CheckButton* epd;
+ Gtk::CheckButton* retinex;
Gtk::CheckButton* pcvignette;
Gtk::CheckButton* gradient;
Gtk::CheckButton* labcurve;
@@ -123,7 +124,7 @@ public:
sigc::connection everythingConn, basicConn, detailConn, colorConn, lensConn, compositionConn, metaConn, rawConn, wavConn;
sigc::connection wbConn, exposureConn, shConn, pcvignetteConn, gradientConn, labcurveConn, colorappearanceConn;
- sigc::connection sharpenConn, gradsharpenConn, microcontrastConn, impdenConn, dirpyrdenConn, defringeConn, epdConn, dirpyreqConn, waveletConn;
+ sigc::connection sharpenConn, gradsharpenConn, microcontrastConn, impdenConn, dirpyrdenConn, defringeConn, epdConn, dirpyreqConn, waveletConn, retinexConn;
sigc::connection vibranceConn, chmixerConn, hsveqConn, rgbcurvesConn, chmixerbwConn, colortoningConn, filmSimulationConn;
sigc::connection distortionConn, cacorrConn, vignettingConn, lcpConn;
sigc::connection coarserotConn, finerotConn, cropConn, resizeConn, perspectiveConn, commonTransConn;
diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc
index 005358070..2dfc7d29f 100644
--- a/rtgui/preferences.cc
+++ b/rtgui/preferences.cc
@@ -16,14 +16,7 @@
* You should have received a copy of the GNU General Public License
* along with RawTherapee. If not, see .
*/
-
-// class_slot is no longer part of the sigc++ source tree, but starting from which version ?
-#if 1
#include
-#else
-#include
-#endif
-
#include "preferences.h"
#include "multilangmgr.h"
#include "splash.h"
@@ -175,6 +168,18 @@ Gtk::Widget* Preferences::getBatchProcPanel ()
appendBehavList (mi, M("TP_EXPOSURE_CONTRAST"), ADDSET_TC_CONTRAST, false);
appendBehavList (mi, M("TP_EXPOSURE_SATURATION"), ADDSET_TC_SATURATION, false);
+ mi = behModel->append ();
+ mi->set_value (behavColumns.label, M("TP_RETINEX_LABEL"));
+ appendBehavList (mi, M("TP_RETINEX_STRENGTH"), ADDSET_RETI_STR, false);
+ appendBehavList (mi, M("TP_RETINEX_NEIGHBOR"), ADDSET_RETI_NEIGH, false);
+ appendBehavList (mi, M("TP_RETINEX_GAMMA"), ADDSET_RETI_GAM, false);
+ appendBehavList (mi, M("TP_RETINEX_SLOPE"), ADDSET_RETI_SLO, false);
+ appendBehavList (mi, M("TP_RETINEX_SCALES"), ADDSET_RETI_SCAL, false);
+ appendBehavList (mi, M("TP_RETINEX_GAIN"), ADDSET_RETI_GAIN, false);
+ appendBehavList (mi, M("TP_RETINEX_OFFSET"), ADDSET_RETI_OFFS, false);
+ appendBehavList (mi, M("TP_RETINEX_THRESHOLD"), ADDSET_RETI_LIMD, false);
+ appendBehavList (mi, M("TP_RETINEX_VARIANCE"), ADDSET_RETI_VART, false);
+
mi = behModel->append ();
mi->set_value (behavColumns.label, M("TP_SHADOWSHLIGHTS_LABEL"));
appendBehavList (mi, M("TP_SHADOWSHLIGHTS_HIGHLIGHTS"), ADDSET_SH_HIGHLIGHTS, false);
diff --git a/rtgui/retinex.cc b/rtgui/retinex.cc
new file mode 100644
index 000000000..2613cf8da
--- /dev/null
+++ b/rtgui/retinex.cc
@@ -0,0 +1,992 @@
+/*
+ * This file is part of RawTherapee.
+ */
+#include "retinex.h"
+#include "mycurve.h"
+
+using namespace rtengine;
+using namespace rtengine::procparams;
+
+Retinex::Retinex () : FoldableToolPanel(this, "retinex", M("TP_RETINEX_LABEL"), false, true)
+{
+ CurveListener::setMulti(true);
+ std::vector milestones;
+ nextmin = 0.;
+ nextmax = 0.;
+ nextminiT = 0.;
+ nextmaxiT = 0.;
+ nextmeanT = 0.;
+ nextsigma = 0.;
+ nextminT = 0.;
+ nextmaxT = 0.;
+
+ Gtk::VBox * retinexVBox = Gtk::manage ( new Gtk::VBox());
+ retinexVBox->set_border_width(4);
+ retinexVBox->set_spacing(2);
+
+ Gtk::VBox * settingsVBox = Gtk::manage ( new Gtk::VBox());
+ settingsVBox->set_border_width(4);
+ settingsVBox->set_spacing(2);
+
+ dhbox = Gtk::manage (new Gtk::HBox ());
+ labmdh = Gtk::manage (new Gtk::Label (M("TP_RETINEX_METHOD") + ":"));
+ dhbox->pack_start (*labmdh, Gtk::PACK_SHRINK, 1);
+
+ retinexMethod = Gtk::manage (new MyComboBoxText ());
+ retinexMethod->append_text (M("TP_RETINEX_LOW"));
+ retinexMethod->append_text (M("TP_RETINEX_UNIFORM"));
+ retinexMethod->append_text (M("TP_RETINEX_HIGH"));
+ retinexMethod->append_text (M("TP_RETINEX_HIGHLIG"));
+// retinexMethod->append_text (M("TP_RETINEX_HIGHLIGPLUS"));
+ retinexMethod->set_active(0);
+ retinexMethodConn = retinexMethod->signal_changed().connect ( sigc::mem_fun(*this, &Retinex::retinexMethodChanged) );
+ retinexMethod->set_tooltip_markup (M("TP_RETINEX_METHOD_TOOLTIP"));
+
+ retinexcolorspace = Gtk::manage (new MyComboBoxText ());
+ retinexcolorspace->append_text (M("TP_RETINEX_LABSPACE"));
+ retinexcolorspace->append_text (M("TP_RETINEX_HSLSPACE_LOG"));
+ retinexcolorspace->append_text (M("TP_RETINEX_HSLSPACE_LIN"));
+ retinexcolorspace->set_active(0);
+ retinexColorSpaceConn = retinexcolorspace->signal_changed().connect ( sigc::mem_fun(*this, &Retinex::retinexColorSpaceChanged) );
+
+ dhbox->pack_start(*retinexMethod);
+ dhbox->pack_start(*retinexcolorspace);
+ retinexVBox->pack_start(*dhbox);
+
+
+ // Histogram equalizer Lab curve
+ curveEditorGD = new CurveEditorGroup (options.lastRetinexDir, M("TP_RETINEX_CONTEDIT_LAB"));
+ curveEditorGD->setCurveListener (this);
+ cdshape = static_cast(curveEditorGD->addCurve(CT_Diagonal, M("TP_RETINEX_CURVEEDITOR_CD")));
+ cdshape->setTooltip(M("TP_RETINEX_CURVEEDITOR_CD_TOOLTIP"));
+ std::vector milestones22;
+
+ milestones22.push_back( GradientMilestone(0., 0., 0., 0.) );
+ milestones22.push_back( GradientMilestone(1., 1., 1., 1.) );
+ cdshape->setBottomBarBgGradient(milestones22);
+ cdshape->setLeftBarBgGradient(milestones22);
+
+ curveEditorGD->curveListComplete();
+
+
+ // Histogram equalizer HSL curve
+ curveEditorGDH = new CurveEditorGroup (options.lastRetinexDir, M("TP_RETINEX_CONTEDIT_HSL"));
+ curveEditorGDH->setCurveListener (this);
+ cdshapeH = static_cast(curveEditorGDH->addCurve(CT_Diagonal, M("TP_RETINEX_CURVEEDITOR_CD")));
+ cdshapeH->setTooltip(M("TP_RETINEX_CURVEEDITOR_CD_TOOLTIP"));
+ std::vector milestones22H;
+
+ milestones22H.push_back( GradientMilestone(0., 0., 0., 0.) );
+ milestones22H.push_back( GradientMilestone(1., 1., 1., 1.) );
+ cdshapeH->setBottomBarBgGradient(milestones22H);
+ cdshapeH->setLeftBarBgGradient(milestones22H);
+
+ curveEditorGDH->curveListComplete();
+
+
+ // Transmission map curve
+ transmissionCurveEditorG = new CurveEditorGroup (options.lastRetinexDir, M("TP_RETINEX_TRANSMISSION"));
+ transmissionCurveEditorG->setCurveListener (this);
+
+ std::vector defaultCurve;
+ rtengine::RetinexParams::getDefaulttransmissionCurve(defaultCurve);
+ transmissionShape = static_cast(transmissionCurveEditorG->addCurve(CT_Flat, "", NULL, false));
+ transmissionShape->setIdentityValue(0.);
+ transmissionShape->setResetCurve(FlatCurveType(defaultCurve.at(0)), defaultCurve);
+ transmissionShape->setBottomBarBgGradient(milestones);
+ transmissionCurveEditorG->set_tooltip_markup (M("TP_RETINEX_TRANSMISSION_TOOLTIP"));
+
+ transmissionCurveEditorG->curveListComplete();
+
+ gambox = Gtk::manage (new Gtk::HBox ());
+ labgam = Gtk::manage (new Gtk::Label (M("TP_RETINEX_GAMMA") + ":"));
+ gambox->pack_start (*labgam, Gtk::PACK_SHRINK, 1);
+
+ gammaretinex = Gtk::manage (new MyComboBoxText ());
+ gammaretinex->append_text (M("TP_RETINEX_GAMMA_NONE"));
+ gammaretinex->append_text (M("TP_RETINEX_GAMMA_LOW"));
+ gammaretinex->append_text (M("TP_RETINEX_GAMMA_MID"));
+ gammaretinex->append_text (M("TP_RETINEX_GAMMA_HIGH"));
+ gammaretinex->append_text (M("TP_RETINEX_GAMMA_FREE"));
+ gammaretinex->set_active(0);
+ gammaretinexConn = gammaretinex->signal_changed().connect ( sigc::mem_fun(*this, &Retinex::gammaretinexChanged) );
+ gammaretinex->set_tooltip_markup (M("TP_RETINEX_GAMMA_TOOLTIP"));
+
+ gam = Gtk::manage (new Adjuster (M("TP_RETINEX_GAMMA"), 0.6, 3.0, 0.01, 1.30));
+ slope = Gtk::manage (new Adjuster (M("TP_RETINEX_SLOPE"), 1., 20., 0.1, 3.));
+
+ str = Gtk::manage (new Adjuster (M("TP_RETINEX_STRENGTH"), 0, 100., 1., 20.));
+ neigh = Gtk::manage (new Adjuster (M("TP_RETINEX_NEIGHBOR"), 6, 100., 1., 80.));
+ highl = Gtk::manage (new Adjuster (M("TP_RETINEX_HIGHLIGHT"), 1, 100, 1, 10));
+ highl->set_tooltip_markup (M("TP_RETINEX_HIGHLIGHT_TOOLTIP"));
+ vart = Gtk::manage (new Adjuster (M("TP_RETINEX_VARIANCE"), 50, 500, 1, 200));
+ vart->set_tooltip_markup (M("TP_RETINEX_VARIANCE_TOOLTIP"));
+
+ expsettings = new MyExpander (false, M("TP_RETINEX_SETTINGS"));
+ expsettings->signal_button_release_event().connect_notify( sigc::bind( sigc::mem_fun(this, &Retinex::foldAllButMe), expsettings) );
+
+ retinexVBox->pack_start (*str);
+ str->show ();
+
+ retinexVBox->pack_start (*neigh);
+ neigh->show ();
+
+ retinexVBox->pack_start (*vart);
+ vart->show ();
+
+ retinexVBox->pack_start (*highl);
+ highl->show ();
+
+ mMLabels = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER));
+ mMLabels->set_tooltip_markup (M("TP_RETINEX_MLABEL_TOOLTIP"));
+
+ transLabels = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER));
+ transLabels->set_tooltip_markup (M("TP_RETINEX_TLABEL_TOOLTIP"));
+ transLabels2 = Gtk::manage(new Gtk::Label("---", Gtk::ALIGN_CENTER));
+
+ scal = Gtk::manage (new Adjuster (M("TP_RETINEX_SCALES"), 1, 8., 1., 3.));
+ gain = Gtk::manage (new Adjuster (M("TP_RETINEX_GAIN"), 20, 200, 1, 50));
+ offs = Gtk::manage (new Adjuster (M("TP_RETINEX_OFFSET"), -10000, 10000, 1, 0));
+// vart = Gtk::manage (new Adjuster (M("TP_RETINEX_VARIANCE"), 50, 500, 1, 125));
+ limd = Gtk::manage (new Adjuster (M("TP_RETINEX_THRESHOLD"), 2, 100, 1, 8));
+ baselog = Gtk::manage (new Adjuster (M("TP_RETINEX_BASELOG"), 1.1, 100., 0.001, 2.718));
+// grbl = Gtk::manage (new Adjuster (M("TP_RETINEX_HIGHLIGHT3"), 1, 100, 1, 50));
+ gain->set_tooltip_markup (M("TP_RETINEX_GAIN_TOOLTIP"));
+ scal->set_tooltip_markup (M("TP_RETINEX_SCALES_TOOLTIP"));
+// vart->set_tooltip_markup (M("TP_RETINEX_VARIANCE_TOOLTIP"));
+ limd->set_tooltip_markup (M("TP_RETINEX_THRESHOLD_TOOLTIP"));
+ baselog->set_tooltip_markup (M("TP_RETINEX_BASELOG_TOOLTIP"));
+
+ curveEditorGH = new CurveEditorGroup (options.lastRetinexDir, M("TP_RETINEX_CONTEDIT_LH"));
+ curveEditorGH->setCurveListener (this);
+
+ lhshape = static_cast(curveEditorGH->addCurve(CT_Flat, M("TP_RETINEX_CURVEEDITOR_LH")));
+ lhshape->setTooltip(M("TP_RETINEX_CURVEEDITOR_LH_TOOLTIP"));
+ lhshape->setCurveColorProvider(this, 4);
+
+ milestones.clear();
+
+ for (int i = 0; i < 7; i++) {
+ float R, G, B;
+ float x = float(i) * (1.0f / 6.0);
+ Color::hsv2rgb01(x, 0.5f, 0.5f, R, G, B);
+ milestones.push_back( GradientMilestone(double(x), double(R), double(G), double(B)) );
+ }
+
+ lhshape->setBottomBarBgGradient(milestones);
+
+ curveEditorGH->curveListComplete();
+
+ medianmap = Gtk::manage (new Gtk::CheckButton (M("TP_RETINEX_MEDIAN")));
+ medianmap->set_active (true);
+ medianmapConn = medianmap->signal_toggled().connect( sigc::mem_fun(*this, &Retinex::medianmapChanged) );
+
+ settingsVBox->pack_start (*mMLabels);
+ mMLabels->show ();
+
+ settingsVBox->pack_start (*transLabels);
+ transLabels->show ();
+
+ settingsVBox->pack_start (*transLabels2);
+ transLabels2->show ();
+
+ settingsVBox->pack_start (*curveEditorGD, Gtk::PACK_SHRINK, 4);
+ curveEditorGD->show();
+
+ settingsVBox->pack_start (*curveEditorGDH, Gtk::PACK_SHRINK, 4);
+ curveEditorGDH->show();
+
+ settingsVBox->pack_start (*curveEditorGH, Gtk::PACK_SHRINK, 4);
+ curveEditorGH->show();
+
+ gambox->pack_start(*gammaretinex);
+
+ settingsVBox->pack_start(*gambox);
+ gammaretinex->show();
+
+ settingsVBox->pack_start (*gam);
+ gam->show ();
+
+ settingsVBox->pack_start (*slope);
+ slope->show ();
+
+
+// settingsVBox->pack_start (*scal);
+// scal->show ();
+
+ settingsVBox->pack_start (*gain);
+ gain->show ();
+
+ settingsVBox->pack_start (*offs);
+ offs->show ();
+
+// settingsVBox->pack_start (*vart);
+// vart->show ();
+
+ settingsVBox->pack_start (*limd);
+ limd->show ();
+
+// settingsVBox->pack_start (*highl);
+// highl->show ();
+
+// settingsVBox->pack_start (*baselog);
+// baselog->show ();
+
+// settingsVBox->pack_start (*grbl);
+// grbl->show ();
+
+ settingsVBox->pack_start( *transmissionCurveEditorG, Gtk::PACK_SHRINK, 2);
+ transmissionCurveEditorG->show();
+
+ settingsVBox->pack_start (*medianmap);
+ medianmap->show ();
+ expsettings->add(*settingsVBox);
+
+ neutrHBox = Gtk::manage (new Gtk::HBox ());
+ neutrHBox->set_border_width (2);
+
+ neutral = Gtk::manage (new Gtk::Button (M("TP_RETINEX_NEUTRAL")));
+ RTImage *resetImg = Gtk::manage (new RTImage ("gtk-undo-ltr-small.png", "gtk-undo-rtl-small.png"));
+ neutral->set_image(*resetImg);
+ neutral->set_tooltip_text (M("TP_RETINEX_NEUTRAL_TIP"));
+ neutralconn = neutral->signal_pressed().connect( sigc::mem_fun(*this, &Retinex::neutral_pressed) );
+ neutral->show();
+ neutrHBox->pack_start (*neutral);
+
+
+
+ str->setAdjusterListener (this);
+
+ if (str->delay < 200) {
+ str->delay = 200;
+ }
+
+ scal->setAdjusterListener (this);
+
+ if (scal->delay < 200) {
+ scal->delay = 200;
+ }
+
+ gam->setAdjusterListener (this);
+
+ if (gam->delay < 500) {
+ gam->delay = 500;
+ }
+
+ slope->setAdjusterListener (this);
+
+ if (slope->delay < 500) {
+ slope->delay = 500;
+ }
+
+ neigh->setAdjusterListener (this);
+
+ if (neigh->delay < 200) {
+ neigh->delay = 200;
+ }
+
+ gain->setAdjusterListener (this);
+
+ if (gain->delay < 200) {
+ gain->delay = 200;
+ }
+
+ offs->setAdjusterListener (this);
+
+ if (offs->delay < 200) {
+ offs->delay = 200;
+ }
+
+ vart->setAdjusterListener (this);
+
+ if (vart->delay < 200) {
+ vart->delay = 200;
+ }
+
+ limd->setAdjusterListener (this);
+
+ if (limd->delay < 200) {
+ limd->delay = 200;
+ }
+
+ highl->setAdjusterListener (this);
+
+ if (highl->delay < 200) {
+ highl->delay = 200;
+ }
+
+ baselog->setAdjusterListener (this);
+
+ if (baselog->delay < 200) {
+ baselog->delay = 200;
+ }
+
+ /* grbl->setAdjusterListener (this);
+
+ if (grbl->delay < 200) {
+ grbl->delay = 200;
+ }
+ */
+ pack_start (*retinexVBox);
+ pack_start (*expsettings);
+ pack_start (*neutrHBox);
+
+ disableListener();
+ retinexColorSpaceChanged();
+ gammaretinexChanged();
+ medianmapChanged();
+ enableListener();
+
+}
+
+Retinex::~Retinex()
+{
+ delete curveEditorGD;
+ delete curveEditorGDH;
+ delete transmissionCurveEditorG;
+ delete curveEditorGH;
+
+}
+void Retinex::neutral_pressed ()
+{
+ neigh->resetValue(false);
+ gain->resetValue(false);
+ offs->resetValue(false);
+ str->resetValue(false);
+ scal->resetValue(false);
+ vart->resetValue(false);
+ limd->resetValue(false);
+ highl->resetValue(false);
+ baselog->resetValue(false);
+ gam->resetValue(false);
+ slope->resetValue(false);
+ transmissionShape->reset();
+ cdshape->reset();
+ cdshapeH->reset();
+ lhshape->reset();
+}
+
+void Retinex::foldAllButMe (GdkEventButton* event, MyExpander *expander)
+{
+ if (event->button == 3) {
+ expsettings->set_expanded(expsettings == expander);
+ }
+}
+
+void Retinex::writeOptions(std::vector &tpOpen)
+{
+ tpOpen.push_back (expsettings->get_expanded ());
+}
+
+void Retinex::updateToolState(std::vector &tpOpen)
+{
+ if(tpOpen.size() == 10) {
+ expsettings->set_expanded(tpOpen.at(9));
+ }
+}
+
+
+
+
+
+int minmaxChangedUI (void* data)
+{
+ GThreadLock lock; // All GUI access from idle_add callbacks or separate thread HAVE to be protected
+ (static_cast(data))->minmaxComputed_ ();
+ return 0;
+}
+
+void Retinex::minmaxChanged (double cdma, double cdmin, double mini, double maxi, double Tmean, double Tsigma, double Tmin, double Tmax)
+{
+ nextmin = cdmin;
+ nextmax = cdma;
+ nextminiT = mini;
+ nextmaxiT = maxi;
+ nextmeanT = Tmean;
+ nextsigma = Tsigma;
+ nextminT = Tmin;
+ nextmaxT = Tmax;
+ g_idle_add (minmaxChangedUI, this);
+
+}
+
+bool Retinex::minmaxComputed_ ()
+{
+
+ disableListener ();
+ enableListener ();
+ updateLabel ();
+ updateTrans ();
+ return false;
+
+}
+void Retinex::updateLabel ()
+{
+ if (!batchMode) {
+ float nX, nY;
+ nX = nextmin;
+ nY = nextmax;
+ {
+ mMLabels->set_text(
+ Glib::ustring::compose(M("TP_RETINEX_MLABEL"),
+ Glib::ustring::format(std::fixed, std::setprecision(0), nX),
+ Glib::ustring::format(std::fixed, std::setprecision(0), nY))
+ );
+ }
+ }
+}
+
+void Retinex::updateTrans ()
+{
+ if (!batchMode) {
+ float nm, nM, nZ, nA, nB, nS;
+ nm = nextminiT;
+ nM = nextmaxiT;
+ nZ = nextmeanT;
+ nA = nextminT;
+ nB = nextmaxT;
+ nS = nextsigma;
+ {
+ transLabels->set_text(
+ Glib::ustring::compose(M("TP_RETINEX_TLABEL"),
+ Glib::ustring::format(std::fixed, std::setprecision(1), nm),
+ Glib::ustring::format(std::fixed, std::setprecision(1), nM),
+ Glib::ustring::format(std::fixed, std::setprecision(1), nZ),
+ Glib::ustring::format(std::fixed, std::setprecision(1), nS))
+ );
+ transLabels2->set_text(
+ Glib::ustring::compose(M("TP_RETINEX_TLABEL2"),
+ Glib::ustring::format(std::fixed, std::setprecision(1), nA),
+ Glib::ustring::format(std::fixed, std::setprecision(1), nB))
+ );
+
+
+ }
+ }
+}
+
+
+
+void Retinex::read (const ProcParams* pp, const ParamsEdited* pedited)
+{
+ disableListener ();
+ retinexMethodConn.block(true);
+ retinexColorSpaceConn.block(true);
+ gammaretinexConn.block(true);
+
+
+ if (pedited) {
+ scal->setEditedState (pedited->retinex.scal ? Edited : UnEdited);
+ neigh->setEditedState (pedited->retinex.neigh ? Edited : UnEdited);
+ gam->setEditedState (pedited->retinex.gam ? Edited : UnEdited);
+ slope->setEditedState (pedited->retinex.slope ? Edited : UnEdited);
+ gain->setEditedState (pedited->retinex.gain ? Edited : UnEdited);
+ offs->setEditedState (pedited->retinex.offs ? Edited : UnEdited);
+ vart->setEditedState (pedited->retinex.vart ? Edited : UnEdited);
+ limd->setEditedState (pedited->retinex.limd ? Edited : UnEdited);
+ highl->setEditedState (pedited->retinex.highl ? Edited : UnEdited);
+ baselog->setEditedState (pedited->retinex.baselog ? Edited : UnEdited);
+// grbl->setEditedState (pedited->retinex.grbl ? Edited : UnEdited);
+ set_inconsistent (multiImage && !pedited->retinex.enabled);
+ medianmap->set_inconsistent (!pedited->retinex.medianmap);
+
+
+ if (!pedited->retinex.retinexMethod) {
+ retinexMethod->set_active_text(M("GENERAL_UNCHANGED"));
+ }
+
+ if (!pedited->retinex.retinexcolorspace) {
+ retinexcolorspace->set_active_text(M("GENERAL_UNCHANGED"));
+ }
+
+ if (!pedited->retinex.gammaretinex) {
+ gammaretinex->set_active_text(M("GENERAL_UNCHANGED"));
+ }
+
+ cdshape->setUnChanged (!pedited->retinex.cdcurve);
+ cdshapeH->setUnChanged (!pedited->retinex.cdHcurve);
+ transmissionShape->setUnChanged (!pedited->retinex.transmissionCurve);
+ lhshape->setUnChanged (!pedited->retinex.lhcurve);
+
+ }
+
+ neigh->setValue (pp->retinex.neigh);
+ gain->setValue (pp->retinex.gain);
+ offs->setValue (pp->retinex.offs);
+ str->setValue (pp->retinex.str);
+ scal->setValue (pp->retinex.scal);
+ vart->setValue (pp->retinex.vart);
+ limd->setValue (pp->retinex.limd);
+ gam->setValue (pp->retinex.gam);
+ slope->setValue (pp->retinex.slope);
+ highl->setValue (pp->retinex.highl);
+ baselog->setValue (pp->retinex.baselog);
+// grbl->setValue (pp->retinex.grbl);
+
+ setEnabled (pp->retinex.enabled);
+
+ medianmapConn.block (true);
+ medianmap->set_active (pp->retinex.medianmap);
+ medianmapConn.block (false);
+ lastmedianmap = pp->retinex.medianmap;
+
+ if (pp->retinex.retinexMethod == "low") {
+ retinexMethod->set_active (0);
+ } else if (pp->retinex.retinexMethod == "uni") {
+ retinexMethod->set_active (1);
+ } else if (pp->retinex.retinexMethod == "high") {
+ retinexMethod->set_active (2);
+ } else if (pp->retinex.retinexMethod == "highli") {
+ retinexMethod->set_active (3);
+// } else if (pp->retinex.retinexMethod == "highliplus") {
+// retinexMethod->set_active (4);
+ }
+
+ if (pp->retinex.retinexcolorspace == "Lab") {
+ retinexcolorspace->set_active (0);
+ } else if (pp->retinex.retinexcolorspace == "HSLLOG") {
+ retinexcolorspace->set_active (1);
+ } else if (pp->retinex.retinexcolorspace == "HSLLIN") {
+ retinexcolorspace->set_active (2);
+ }
+
+ if (pp->retinex.gammaretinex == "none") {
+ gammaretinex->set_active (0);
+ } else if (pp->retinex.gammaretinex == "low") {
+ gammaretinex->set_active (1);
+ } else if (pp->retinex.gammaretinex == "mid") {
+ gammaretinex->set_active (2);
+ } else if (pp->retinex.gammaretinex == "hig") {
+ gammaretinex->set_active (3);
+ } else if (pp->retinex.gammaretinex == "fre") {
+ gammaretinex->set_active (4);
+ }
+
+ retinexMethodChanged ();
+ retinexColorSpaceChanged();
+ gammaretinexChanged();
+
+ medianmapConn.block(true);
+ medianmapChanged ();
+ medianmapConn.block(false);
+
+ cdshape->setCurve (pp->retinex.cdcurve);
+ cdshapeH->setCurve (pp->retinex.cdHcurve);
+ lhshape->setCurve (pp->retinex.lhcurve);
+
+ retinexMethodConn.block(false);
+ retinexColorSpaceConn.block(false);
+ gammaretinexConn.block(false);
+ transmissionShape->setCurve (pp->retinex.transmissionCurve);
+
+
+ enableListener ();
+}
+
+
+
+void Retinex::write (ProcParams* pp, ParamsEdited* pedited)
+{
+
+ pp->retinex.str = str->getValue ();
+ pp->retinex.scal = (int)scal->getValue ();
+ pp->retinex.gam = gam->getValue ();
+ pp->retinex.slope = slope->getValue ();
+ pp->retinex.neigh = neigh->getValue ();
+ pp->retinex.gain = (int)gain->getValue ();
+ pp->retinex.offs = (int)offs->getValue ();
+ pp->retinex.vart = (int)vart->getValue ();
+ pp->retinex.limd = (int)limd->getValue ();
+ pp->retinex.highl = (int)highl->getValue ();
+ pp->retinex.baselog = baselog->getValue ();
+// pp->retinex.grbl = (int)grbl->getValue ();
+ pp->retinex.cdcurve = cdshape->getCurve ();
+ pp->retinex.lhcurve = lhshape->getCurve ();
+ pp->retinex.cdHcurve = cdshapeH->getCurve ();
+ pp->retinex.transmissionCurve = transmissionShape->getCurve ();
+ pp->retinex.enabled = getEnabled();
+ pp->retinex.medianmap = medianmap->get_active();
+
+ if (pedited) {
+ pedited->retinex.retinexMethod = retinexMethod->get_active_text() != M("GENERAL_UNCHANGED");
+ pedited->retinex.retinexcolorspace = retinexcolorspace->get_active_text() != M("GENERAL_UNCHANGED");
+ pedited->retinex.gammaretinex = gammaretinex->get_active_text() != M("GENERAL_UNCHANGED");
+
+ //%%%%%%%%%%%%%%%%%%%%%%
+ pedited->retinex.str = str->getEditedState ();
+ pedited->retinex.scal = scal->getEditedState ();
+ pedited->retinex.gam = gam->getEditedState ();
+ pedited->retinex.slope = slope->getEditedState ();
+ pedited->retinex.neigh = neigh->getEditedState ();
+ pedited->retinex.gain = gain->getEditedState ();
+ pedited->retinex.offs = offs->getEditedState ();
+ pedited->retinex.vart = vart->getEditedState ();
+ pedited->retinex.limd = limd->getEditedState ();
+ pedited->retinex.highl = highl->getEditedState ();
+ pedited->retinex.baselog = baselog->getEditedState ();
+// pedited->retinex.grbl = grbl->getEditedState ();
+ pedited->retinex.cdcurve = !cdshape->isUnChanged ();
+ pedited->retinex.cdHcurve = !cdshapeH->isUnChanged ();
+ pedited->retinex.transmissionCurve = !transmissionShape->isUnChanged ();
+ pedited->retinex.enabled = !get_inconsistent();
+ pedited->retinex.medianmap = !medianmap->get_inconsistent();
+ pedited->retinex.lhcurve = !lhshape->isUnChanged ();
+
+ }
+
+ if (retinexMethod->get_active_row_number() == 0) {
+ pp->retinex.retinexMethod = "low";
+ } else if (retinexMethod->get_active_row_number() == 1) {
+ pp->retinex.retinexMethod = "uni";
+ } else if (retinexMethod->get_active_row_number() == 2) {
+ pp->retinex.retinexMethod = "high";
+ } else if (retinexMethod->get_active_row_number() == 3) {
+ pp->retinex.retinexMethod = "highli";
+// } else if (retinexMethod->get_active_row_number() == 4) {
+// pp->retinex.retinexMethod = "highliplus";
+ }
+
+ if (retinexcolorspace->get_active_row_number() == 0) {
+ pp->retinex.retinexcolorspace = "Lab";
+ } else if (retinexcolorspace->get_active_row_number() == 1) {
+ pp->retinex.retinexcolorspace = "HSLLOG";
+ } else if (retinexcolorspace->get_active_row_number() == 2) {
+ pp->retinex.retinexcolorspace = "HSLLIN";
+ }
+
+ if (gammaretinex->get_active_row_number() == 0) {
+ pp->retinex.gammaretinex = "none";
+ } else if (gammaretinex->get_active_row_number() == 1) {
+ pp->retinex.gammaretinex = "low";
+ } else if (gammaretinex->get_active_row_number() == 2) {
+ pp->retinex.gammaretinex = "mid";
+ } else if (gammaretinex->get_active_row_number() == 3) {
+ pp->retinex.gammaretinex = "hig";
+ } else if (gammaretinex->get_active_row_number() == 4) {
+ pp->retinex.gammaretinex = "fre";
+ }
+
+}
+
+void Retinex::retinexMethodChanged()
+{
+
+ if(retinexMethod->get_active_row_number() == 3) {
+ highl->show();
+ } else {
+ highl->hide();
+ }
+
+ if (listener) {
+ listener->panelChanged (EvretinexMethod, retinexMethod->get_active_text ());
+ }
+}
+
+void Retinex::ColorSpaceUpdateUI ()
+{
+ if (!batchMode) {
+ curveEditorGH->show();
+
+ if(retinexcolorspace->get_active_row_number() == 0) {
+ curveEditorGD->show();
+ curveEditorGDH->hide();
+ baselog->show();
+ } else if(retinexcolorspace->get_active_row_number() == 1) {
+ curveEditorGD->hide();
+ curveEditorGDH->show();
+ baselog->show();
+ } else if(retinexcolorspace->get_active_row_number() == 2) {
+ curveEditorGD->hide();
+ curveEditorGDH->show();
+ baselog->hide();
+ }
+ }
+}
+
+
+void Retinex::retinexColorSpaceChanged()
+{
+ ColorSpaceUpdateUI();
+
+ if (listener) {
+ listener->panelChanged (EvretinexColorSpace, retinexcolorspace->get_active_text ());
+ }
+}
+
+void Retinex::gammaretinexChanged()
+{
+ if (!batchMode) {
+ if(gammaretinex->get_active_row_number() == 4) {
+ gam->show();
+ slope->show();
+ } else if(gammaretinex->get_active_row_number() != 4) {
+ gam->hide();
+ slope->hide();
+ }
+ }
+
+ ColorSpaceUpdateUI();
+
+ if (listener) {
+ listener->panelChanged (Evretinexgamma, gammaretinex->get_active_text ());
+ }
+}
+
+void Retinex::medianmapChanged ()
+{
+ if (batchMode) {
+ if (medianmap->get_inconsistent()) {
+ medianmap->set_inconsistent (false);
+ medianmapConn.block (true);
+ medianmap->set_active (false);
+ medianmapConn.block (false);
+ } else if (lastmedianmap) {
+ medianmap->set_inconsistent (true);
+ }
+
+ lastmedianmap = medianmap->get_active ();
+ }
+
+ if (listener) {
+ if (medianmap->get_active()) {
+ if (getEnabled()) {
+ listener->panelChanged (EvRetinexmedianmap, M("GENERAL_ENABLED"));
+ }
+ } else {
+ if (getEnabled()) {
+ listener->panelChanged (EvRetinexmedianmap, M("GENERAL_DISABLED"));
+ }
+ }
+
+ }
+}
+
+
+void Retinex::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited)
+{
+
+ neigh->setDefault (defParams->retinex.neigh);
+ gain->setDefault (defParams->retinex.gain);
+ offs->setDefault (defParams->retinex.offs);
+ str->setDefault (defParams->retinex.str);
+ scal->setDefault (defParams->retinex.scal);
+ vart->setDefault (defParams->retinex.vart);
+ limd->setDefault (defParams->retinex.limd);
+ highl->setDefault (defParams->retinex.highl);
+ baselog->setDefault (defParams->retinex.baselog);
+// grbl->setDefault (defParams->retinex.grbl);
+ gam->setDefault (defParams->retinex.gam);
+ slope->setDefault (defParams->retinex.slope);
+
+ if (pedited) {
+ neigh->setDefaultEditedState (pedited->retinex.neigh ? Edited : UnEdited);
+ gain->setDefaultEditedState (pedited->retinex.gain ? Edited : UnEdited);
+ offs->setDefaultEditedState (pedited->retinex.offs ? Edited : UnEdited);
+ str->setDefaultEditedState (pedited->retinex.str ? Edited : UnEdited);
+ scal->setDefaultEditedState (pedited->retinex.scal ? Edited : UnEdited);
+ vart->setDefaultEditedState (pedited->retinex.vart ? Edited : UnEdited);
+ limd->setDefaultEditedState (pedited->retinex.limd ? Edited : UnEdited);
+ highl->setDefaultEditedState (pedited->retinex.highl ? Edited : UnEdited);
+ baselog->setDefaultEditedState (pedited->retinex.baselog ? Edited : UnEdited);
+// grbl->setDefaultEditedState (pedited->retinex.grbl ? Edited : UnEdited);
+ gam->setDefaultEditedState (pedited->retinex.gam ? Edited : UnEdited);
+ slope->setDefaultEditedState (pedited->retinex.slope ? Edited : UnEdited);
+
+ } else {
+ neigh->setDefaultEditedState (Irrelevant);
+ gain->setDefaultEditedState (Irrelevant);
+ offs->setDefaultEditedState (Irrelevant);
+ vart->setDefaultEditedState (Irrelevant);
+ limd->setDefaultEditedState (Irrelevant);
+ highl->setDefaultEditedState (Irrelevant);
+ baselog->setDefaultEditedState (Irrelevant);
+// grbl->setDefaultEditedState (Irrelevant);
+ str->setDefaultEditedState (Irrelevant);
+ scal->setDefaultEditedState (Irrelevant);
+ gam->setDefaultEditedState (Irrelevant);
+ slope->setDefaultEditedState (Irrelevant);
+ }
+}
+
+void Retinex::setAdjusterBehavior (bool strAdd, bool neighAdd, bool scalAdd, bool limdAdd, bool gainAdd, bool offsAdd, bool vartAdd, bool gamAdd, bool slopeAdd)
+{
+ str->setAddMode(strAdd);
+ neigh->setAddMode(neighAdd);
+ scal->setAddMode(scalAdd);
+ limd->setAddMode(limdAdd);
+ gain->setAddMode(gainAdd);
+ offs->setAddMode(offsAdd);
+ vart->setAddMode(vartAdd);
+ gam->setAddMode(gamAdd);
+ slope->setAddMode(slopeAdd);
+}
+
+
+void Retinex::adjusterChanged (Adjuster* a, double newval)
+{
+
+ if (!listener || !getEnabled()) {
+ return;
+ }
+
+ if (a == neigh) {
+ listener->panelChanged (EvLneigh, neigh->getTextValue());
+ } else if (a == str) {
+ listener->panelChanged (EvLstr, str->getTextValue());
+ } else if (a == scal) {
+ listener->panelChanged (EvLscal, scal->getTextValue());
+ } else if (a == gain) {
+ listener->panelChanged (EvLgain, gain->getTextValue());
+ } else if (a == offs) {
+ listener->panelChanged (EvLoffs, offs->getTextValue());
+ } else if (a == vart) {
+ listener->panelChanged (EvLvart, vart->getTextValue());
+ } else if (a == limd) {
+ listener->panelChanged (EvLlimd, limd->getTextValue());
+ } else if (a == highl) {
+ listener->panelChanged (EvLhighl, highl->getTextValue());
+ } else if (a == baselog) {
+ listener->panelChanged (EvLbaselog, baselog->getTextValue());
+// } else if (a == grbl) {
+// listener->panelChanged (EvLgrbl, grbl->getTextValue());
+ } else if (a == gam) {
+ listener->panelChanged (EvLgam, gam->getTextValue());
+ } else if (a == slope) {
+ listener->panelChanged (EvLslope, slope->getTextValue());
+ }
+
+}
+
+
+
+void Retinex::autoOpenCurve ()
+{
+ cdshape->openIfNonlinear();
+ cdshapeH->openIfNonlinear();
+ transmissionShape->openIfNonlinear();
+ lhshape->openIfNonlinear();
+
+}
+
+
+void Retinex::curveChanged (CurveEditor* ce)
+{
+ if (listener && getEnabled()) {
+ if (ce == cdshape) {
+ listener->panelChanged (EvLCDCurve, M("HISTORY_CUSTOMCURVE"));
+ } else if (ce == cdshapeH) {
+ listener->panelChanged (EvLCDHCurve, M("HISTORY_CUSTOMCURVE"));
+ } else if (ce == transmissionShape) {
+ listener->panelChanged (EvRetinextransmission, M("HISTORY_CUSTOMCURVE"));
+ } else if (ce == lhshape) {
+ listener->panelChanged (EvRetinexlhcurve, M("HISTORY_CUSTOMCURVE"));
+ }
+ }
+}
+
+void Retinex::enabledChanged ()
+{
+
+ if (listener) {
+ if (get_inconsistent()) {
+ listener->panelChanged (EvRetinexEnabled, M("GENERAL_UNCHANGED"));
+ } else if (getEnabled()) {
+ listener->panelChanged (EvRetinexEnabled, M("GENERAL_ENABLED"));
+ } else {
+ listener->panelChanged (EvRetinexEnabled, M("GENERAL_DISABLED"));
+ }
+ }
+}
+
+
+void Retinex::trimValues (rtengine::procparams::ProcParams* pp)
+{
+ str->trimValue(pp->retinex.str);
+ scal->trimValue(pp->retinex.scal);
+ neigh->trimValue(pp->retinex.neigh);
+ gain->trimValue(pp->retinex.gain);
+ offs->trimValue(pp->retinex.offs);
+ vart->trimValue(pp->retinex.vart);
+ limd->trimValue(pp->retinex.limd);
+ highl->trimValue(pp->retinex.highl);
+ baselog->trimValue(pp->retinex.baselog);
+// grbl->trimValue(pp->retinex.grbl);
+ gam->trimValue(pp->retinex.gam);
+ slope->trimValue(pp->retinex.slope);
+
+}
+void Retinex::updateCurveBackgroundHistogram (LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve,/* LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histLRETI)
+{
+
+ cdshape->updateBackgroundHistogram (histLRETI);
+ cdshapeH->updateBackgroundHistogram (histLRETI);
+}
+
+void Retinex::colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller *caller)
+{
+
+ float R, G, B;
+
+ if (elemType == ColorCaller::CCET_VERTICAL_BAR) {
+ valY = 0.5;
+ }
+
+ if (callerId == 1) { // ch - main curve
+
+ Color::hsv2rgb01(float(valX), float(valY), 0.5f, R, G, B);
+ } else if (callerId == 2) { // cc - bottom bar
+
+ float value = (1.f - 0.7f) * float(valX) + 0.7f;
+ // whole hue range
+ // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before)
+ Color::hsv2rgb01(float(valY), float(valX), value, R, G, B);
+ } else if (callerId == 3) { // lc - bottom bar
+
+ float value = (1.f - 0.7f) * float(valX) + 0.7f;
+
+ // whole hue range
+ // Y axis / from 0.15 up to 0.75 (arbitrary values; was 0.45 before)
+ Color::hsv2rgb01(float(valY), float(valX), value, R, G, B);
+ } else if (callerId == 4) { // LH - bottom bar
+ Color::hsv2rgb01(float(valX), 0.5f, float(valY), R, G, B);
+ } else if (callerId == 5) { // HH - bottom bar
+ float h = float((valY - 0.5) * 0.3 + valX);
+
+ if (h > 1.0f) {
+ h -= 1.0f;
+ } else if (h < 0.0f) {
+ h += 1.0f;
+ }
+
+ Color::hsv2rgb01(h, 0.5f, 0.5f, R, G, B);
+ }
+
+ caller->ccRed = double(R);
+ caller->ccGreen = double(G);
+ caller->ccBlue = double(B);
+}
+
+
+
+void Retinex::setBatchMode (bool batchMode)
+{
+ ToolPanel::setBatchMode (batchMode);
+ neigh->showEditedCB ();
+ gain->showEditedCB ();
+ offs->showEditedCB ();
+ str->showEditedCB ();
+ scal->showEditedCB ();
+ gam->showEditedCB ();
+ slope->showEditedCB ();
+ vart->showEditedCB ();
+ limd->showEditedCB ();
+ highl->showEditedCB ();
+ baselog->showEditedCB ();
+// grbl->showEditedCB ();
+ curveEditorGD->setBatchMode (batchMode);
+ curveEditorGDH->setBatchMode (batchMode);
+ transmissionCurveEditorG->setBatchMode (batchMode);
+ curveEditorGH->setBatchMode (batchMode);
+
+
+}
diff --git a/rtgui/retinex.h b/rtgui/retinex.h
new file mode 100644
index 000000000..a9b462808
--- /dev/null
+++ b/rtgui/retinex.h
@@ -0,0 +1,110 @@
+/*
+ * This file is part of RawTherapee.
+ */
+#ifndef _RETINEX_H_
+#define _RETINEX_H_
+
+#include