diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala
index 6f713ca54..972811e43 100644
--- a/rtdata/languages/Catala
+++ b/rtdata/languages/Catala
@@ -625,6 +625,13 @@ ZOOMBAR_SMALL;Petit
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified)
index f623e30ea..af3bec853 100644
--- a/rtdata/languages/Chinese (Simplified)
+++ b/rtdata/languages/Chinese (Simplified)
@@ -629,6 +629,13 @@ ZOOMBAR_SMALL;小
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Chinese (Traditional) b/rtdata/languages/Chinese (Traditional)
index 0278da2d4..9645fe547 100644
--- a/rtdata/languages/Chinese (Traditional)
+++ b/rtdata/languages/Chinese (Traditional)
@@ -637,6 +637,13 @@ ZOOMBAR_SMALL;小
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
!MAIN_BUTTON_SAVE_TOOLTIP;Save current image Ctrl+S
diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech
index 84e0aecd8..d9fdd1691 100644
--- a/rtdata/languages/Czech
+++ b/rtdata/languages/Czech
@@ -629,6 +629,13 @@ ZOOMBAR_SMALL;Malý
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk
index 6be8dc6b6..085fb18d6 100644
--- a/rtdata/languages/Dansk
+++ b/rtdata/languages/Dansk
@@ -627,6 +627,13 @@ ZOOMBAR_SMALL;Lille
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch
index cfeba37b6..683df28a9 100644
--- a/rtdata/languages/Deutsch
+++ b/rtdata/languages/Deutsch
@@ -677,6 +677,13 @@ ZOOMPANEL_ZOOMOUT;Heraus zoomen
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
!MAIN_BUTTON_SAVE_TOOLTIP;Save current image Ctrl+S
!MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor Ctrl+E
diff --git a/rtdata/languages/English b/rtdata/languages/English
index fffea34f5..e82253e1e 100644
--- a/rtdata/languages/English
+++ b/rtdata/languages/English
@@ -219,7 +219,14 @@
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
!HISTORY_MSG_8;Exposure Compensation
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!HISTORY_MSG_9;Highlight Compression
!HISTORY_NEWSNAPSHOT;Add
!HISTORY_NEWSNAPSHOTAS;As...
diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK)
index 3e28afc43..f3c31a19a 100644
--- a/rtdata/languages/English (UK)
+++ b/rtdata/languages/English (UK)
@@ -229,7 +229,14 @@ TP_HLREC_COLOR;Colour Propagation
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
!HISTORY_MSG_8;Exposure Compensation
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!HISTORY_MSG_9;Highlight Compression
!HISTORY_NEWSNAPSHOT;Add
!HISTORY_NEWSNAPSHOTAS;As...
diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US)
index d391329be..440049d17 100644
--- a/rtdata/languages/English (US)
+++ b/rtdata/languages/English (US)
@@ -215,7 +215,14 @@
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
!HISTORY_MSG_8;Exposure Compensation
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!HISTORY_MSG_9;Highlight Compression
!HISTORY_NEWSNAPSHOT;Add
!HISTORY_NEWSNAPSHOTAS;As...
diff --git a/rtdata/languages/Espanol b/rtdata/languages/Espanol
index 1e411dd3c..07a63ba18 100644
--- a/rtdata/languages/Espanol
+++ b/rtdata/languages/Espanol
@@ -633,6 +633,13 @@ ZOOMBAR_SMALL;Pequeño
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Euskara b/rtdata/languages/Euskara
index a9bbe3716..2eb9b2aef 100644
--- a/rtdata/languages/Euskara
+++ b/rtdata/languages/Euskara
@@ -627,6 +627,13 @@ ZOOMBAR_SMALL;Txikia
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais
index 2f306b4b3..6e0b3a4e9 100644
--- a/rtdata/languages/Francais
+++ b/rtdata/languages/Francais
@@ -696,3 +696,10 @@ ZOOMPANEL_ZOOMOUT;Zoom -
!!!!!!!!!!!!!!!!!!!!!!!!!
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
diff --git a/rtdata/languages/Greek b/rtdata/languages/Greek
index 6c20c722c..5968baa69 100644
--- a/rtdata/languages/Greek
+++ b/rtdata/languages/Greek
@@ -625,6 +625,13 @@ ZOOMBAR_SMALL;Μικρό
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Hebrew b/rtdata/languages/Hebrew
index ef02cefbf..845bb6a9b 100644
--- a/rtdata/languages/Hebrew
+++ b/rtdata/languages/Hebrew
@@ -626,6 +626,13 @@ ZOOMBAR_SMALL;קטן
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Italian b/rtdata/languages/Italian
index 3c7b60646..a9068a8b9 100644
--- a/rtdata/languages/Italian
+++ b/rtdata/languages/Italian
@@ -629,6 +629,13 @@ ZOOMBAR_SMALL;Piccola
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese
index d1b19970e..4c5ba9b65 100644
--- a/rtdata/languages/Japanese
+++ b/rtdata/languages/Japanese
@@ -677,6 +677,13 @@ ZOOMPANEL_ZOOMOUT;ズームアウト
!CURVEEDITOR_NURBS;Control cage
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
!MAIN_BUTTON_SAVE_TOOLTIP;Save current image Ctrl+S
!MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor Ctrl+E
diff --git a/rtdata/languages/Latvian b/rtdata/languages/Latvian
index 266850dcb..8bfacd794 100644
--- a/rtdata/languages/Latvian
+++ b/rtdata/languages/Latvian
@@ -625,6 +625,13 @@ ZOOMBAR_SMALL;Mazs
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar
index ac1abf787..4eea760cb 100644
--- a/rtdata/languages/Magyar
+++ b/rtdata/languages/Magyar
@@ -624,6 +624,13 @@ ZOOMBAR_SMALL;Kicsi
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands
index 0a66e12c6..e4f801712 100644
--- a/rtdata/languages/Nederlands
+++ b/rtdata/languages/Nederlands
@@ -673,6 +673,13 @@ ZOOMPANEL_ZOOMOUT;Zoom uit
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
!MAIN_BUTTON_SAVE_TOOLTIP;Save current image Ctrl+S
!MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor Ctrl+E
diff --git a/rtdata/languages/Norsk BM b/rtdata/languages/Norsk BM
index 66cdb715f..f9f357dc7 100644
--- a/rtdata/languages/Norsk BM
+++ b/rtdata/languages/Norsk BM
@@ -626,6 +626,13 @@ ZOOMBAR_SMALL;Liten
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish
index 3de03f2da..6dfde0550 100644
--- a/rtdata/languages/Polish
+++ b/rtdata/languages/Polish
@@ -597,6 +597,7 @@ ZOOMBAR_PREVIEW;Widok
ZOOMBAR_SCALE;Skala
ZOOMBAR_SMALL;Mała
+
!!!!!!!!!!!!!!!!!!!!!!!!!
! Untranslated keys follow; remove the ! prefix after an entry is translated.
!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -630,6 +631,13 @@ ZOOMBAR_SMALL;Mała
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Polish (Latin Characters) b/rtdata/languages/Polish (Latin Characters)
index 7773f07e8..fb72ef43a 100644
--- a/rtdata/languages/Polish (Latin Characters)
+++ b/rtdata/languages/Polish (Latin Characters)
@@ -629,6 +629,13 @@ ZOOMBAR_SMALL;Mala
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil)
index 2f65e00bb..a14bd297a 100644
--- a/rtdata/languages/Portugues (Brasil)
+++ b/rtdata/languages/Portugues (Brasil)
@@ -626,6 +626,13 @@ ZOOMBAR_SMALL;Pequeno
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian
index 820b058f6..e22b04b14 100644
--- a/rtdata/languages/Russian
+++ b/rtdata/languages/Russian
@@ -630,6 +630,13 @@ ZOOMBAR_SMALL;Минимальное
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters)
index 7b565b2e1..375520165 100644
--- a/rtdata/languages/Serbian (Cyrilic Characters)
+++ b/rtdata/languages/Serbian (Cyrilic Characters)
@@ -1,21 +1,32 @@
-
+# Serbian translation
#00 Serbian (Cyrilic)
-#01 by gpopac 2010-09-15
+#01 by gpopac 2010-09-21
ADJUSTER_RESET_TO_DEFAULT;Врати на подразумевано
+BATCHQUEUE_AUTOSTART;Сам започни
+BATCH_PROCESSING;обрада
+CURVEEDITOR_CUSTOM;Произвољно
+CURVEEDITOR_DARKS;Тамно
CURVEEDITOR_FILEDLGFILTERANY;Све датотеке
CURVEEDITOR_FILEDLGFILTERCURVE;Датотеке са кривама
+CURVEEDITOR_HIGHLIGHTS;Пресветло
+CURVEEDITOR_LIGHTS;Светло
CURVEEDITOR_LINEAR;Линеарно
CURVEEDITOR_LOADDLGLABEL;Учитај криву...
+CURVEEDITOR_NURBS;Са кавезом
+CURVEEDITOR_PARAMETRIC;Параметарски
CURVEEDITOR_SAVEDLGLABEL;Сачувај криву...
+CURVEEDITOR_SHADOWS;Сенке
CURVEEDITOR_TOOLTIPLINEAR;Враћа криву на линеарну
CURVEEDITOR_TOOLTIPLOAD;Учитава кривуљу из датотеке
CURVEEDITOR_TOOLTIPSAVE;Чува тренутну кривуљу
+CURVEEDITOR_TYPE;Врста:
EXIFFILTER_APERTURE;Отвор бленде
EXIFFILTER_CAMERA;Фото апарат
EXIFFILTER_DIALOGLABEL;Exif филтер
EXIFFILTER_FOCALLEN;Жижна даљина
EXIFFILTER_ISO;ИСО
EXIFFILTER_LENS;Објектив
+EXIFFILTER_METADATAFILTER;Филтрирај метаподатке
EXIFFILTER_SHUTTER;Експозиција
EXIFPANEL_ADDEDIT;Додај/Измени
EXIFPANEL_ADDEDITHINT;Додаје нову ознаку или уређује постојећу
@@ -31,10 +42,12 @@ EXIFPANEL_RESETALL;Врати све
EXIFPANEL_RESETALLHINT;Враћа све ознаке на почетне вредности
EXIFPANEL_RESETHINT;Враћа изабрану ознаку на почетну вредности
EXIFPANEL_SUBDIRECTORY;Поддиректоријум
+FILEBROWSER_ADDDELTEMPLATE;Додај/уклони шаблоне...
FILEBROWSER_APPLYPROFILE;Примени профил
FILEBROWSER_ARRANGEMENTHINT;Размењује вертикални и хоризонтални распоред умањених приказа
FILEBROWSER_CLEARPROFILE;Обриши профил
FILEBROWSER_COPYPROFILE;Умножи профил
+FILEBROWSER_CURRENT_NAME;Тренутно име:
FILEBROWSER_DELETEDLGLABEL;Брисање датотеке
FILEBROWSER_DELETEDLGMSG;Да ли сигурно желите да обришете %1 датотека?
FILEBROWSER_EMPTYTRASH;Избаци смеће
@@ -44,6 +57,7 @@ FILEBROWSER_EXIFFILTERAPPLYHINT;Укључује/искључује exif фил
FILEBROWSER_EXIFFILTERLABEL;Exif филтер
FILEBROWSER_EXIFFILTERSETTINGS;Подеси
FILEBROWSER_EXIFFILTERSETTINGSHINT;Мења подешавања exif филтера
+FILEBROWSER_NEW_NAME;Ново име:
FILEBROWSER_PARTIALPASTEPROFILE;Делимично убаци
FILEBROWSER_PASTEPROFILE;Убаци профил
FILEBROWSER_POPUPCANCELJOB;Откажи задатак
@@ -67,27 +81,33 @@ FILEBROWSER_PROCESSINGSETTINGSHINT;Поставља формат датотек
FILEBROWSER_RENAMEDLGLABEL;Преименуј датотеку
FILEBROWSER_RENAMEDLGMSG;Преименуј датотеку „%1“ у:
FILEBROWSER_SHOWDIRHINT;Приказује све слике из директоријума
+FILEBROWSER_SHOWEXIFINFO;Приказује EXIF податке и
FILEBROWSER_SHOWQUEUEHINT;Приказује слике заказане за обраду
FILEBROWSER_SHOWRANK1HINT;Приказује слике оцењене са 1 звездицом
-FILEBROWSER_SHOWRANK2HINT;Приказује слике оцењене са 2 звездицом
-FILEBROWSER_SHOWRANK3HINT;Приказује слике оцењене са 3 звездицом
-FILEBROWSER_SHOWRANK4HINT;Приказује слике оцењене са 5 звездицом
-FILEBROWSER_SHOWRANK5HINT;Приказује слике оцењене са 5 звездицом
+FILEBROWSER_SHOWRANK2HINT;Приказује слике оцењене са 2 звездице
+FILEBROWSER_SHOWRANK3HINT;Приказује слике оцењене са 3 звездице
+FILEBROWSER_SHOWRANK4HINT;Приказује слике оцењене са 4 звездице
+FILEBROWSER_SHOWRANK5HINT;Приказује слике оцењене са 5 звездица
FILEBROWSER_SHOWTRASHHINT;Приказује слике у смећу
FILEBROWSER_SHOWUNRANKHINT;Прикажи неоцењене слике
FILEBROWSER_STARTPROCESSING;Започни обраду
FILEBROWSER_STARTPROCESSINGHINT;Почиње обраду и чување заказаних слика
FILEBROWSER_STOPPROCESSING;Заустави обраду
FILEBROWSER_STOPPROCESSINGHINT;Зауставља обраду слика
-FILEBROWSER_THUMBSIZE;Вел. прегледа
+FILEBROWSER_THUMBSIZE;Преглед
+FILEBROWSER_TOOLTIP_STOPPROCESSING;Покреће обраду фотографија када их закажете
+FILEBROWSER_USETEMPLATE;Искористи шаблон:
FILEBROWSER_ZOOMINHINT;Увећава преглед
FILEBROWSER_ZOOMOUTHINT;Умањује преглед
GENERAL_ABOUT;О програму
+GENERAL_AFTER;После
+GENERAL_BEFORE;Пре
GENERAL_CANCEL;Откажи
GENERAL_DISABLE;Искључи
GENERAL_DISABLED;Искључено
GENERAL_ENABLE;Укључи
GENERAL_ENABLED;Укључи
+GENERAL_HIGH_QUALITY;Висок квалитет
GENERAL_LANDSCAPE;Положено
GENERAL_LOAD;Учитај
GENERAL_NA;нема
@@ -95,7 +115,11 @@ GENERAL_NO;Не
GENERAL_OK;У реду
GENERAL_PORTRAIT;Усправно
GENERAL_SAVE;Сачувај
+GENERAL_UNCHANGED;(неизмењено)
GENERAL_YES;Да
+HISTOGRAM_BUTTON_G;З
+HISTOGRAM_BUTTON_L;С
+HISTOGRAM_BUTTON_R;Ц
HISTOGRAM_LABEL;Хистограм
HISTOGRAM_TOOLTIP_B;Приказује плави хистограм
HISTOGRAM_TOOLTIP_G;Приказује зелени хистограм
@@ -103,7 +127,7 @@ HISTOGRAM_TOOLTIP_L;Приказује ЦиеЛаб хитограм
HISTOGRAM_TOOLTIP_R;Приказује црвени хистограм
HISTORY_CHANGED;Измењено
HISTORY_CUSTOMCURVE;Произвољна крива
-HISTORY_DELSNAPSHOT;Избиши
+HISTORY_DELSNAPSHOT;Уклони
HISTORY_FROMCLIPBOARD;Из оставе
HISTORY_LABEL;Историјат
HISTORY_MSG_10;Сабијање сенки
@@ -185,6 +209,9 @@ HISTORY_MSG_79;Ширина при промени величине
HISTORY_MSG_7;Црна
HISTORY_MSG_80;Висина при промени величине
HISTORY_MSG_81;Укључена промена величина
+HISTORY_MSG_82;Профил је измењен
+HISTORY_MSG_83;Квалитетно светлост/сенке
+HISTORY_MSG_84;Исправљање перспективе
HISTORY_MSG_8;Компензација експозиције
HISTORY_MSG_9;Сабијање светлог
HISTORY_NEWSNAPSHOT;Додај
@@ -250,35 +277,71 @@ IPTCPANEL_TITLE;Натпис
IPTCPANEL_TITLEHINT;Кратни назив слике (име објекта).
IPTCPANEL_TRANSREFERENCE;Реф. преноса
IPTCPANEL_TRANSREFERENCEHINT;Код којји представља место првобитног преноса (референца првог преноса).
+MAIN_BUTTON_EXIT;Изађи
+MAIN_BUTTON_FULLSCREEN;Цео екран
MAIN_BUTTON_PREFERENCES;Поставке
-MAIN_BUTTON_SAVE;Сачувај слику
+MAIN_BUTTON_PUTTOQUEUE;Закажи
+MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Додаје тренутну слику у заказане Ctrl+Q
+MAIN_BUTTON_QUEUE;Закажи
+MAIN_BUTTON_SAVE;Сачувај
MAIN_BUTTON_SAVEAS;Као...
-MAIN_BUTTON_SENDTOEDITOR;Пошаљи за уређивање
+MAIN_BUTTON_SAVE_TOOLTIP;Чува тренутну слику Ctrl+С
+MAIN_BUTTON_SENDTOEDITOR;Уреди
+MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Уређује тренутну слику у спољном програму Ctrl+Е
+MAIN_BUTTON_UNFULLSCREEN;Напусти цео екран
+MAIN_FRAME_BATCHQUEUE;Заказане датотеке
+MAIN_FRAME_FILEBROWSER;Разгледач датотека
+MAIN_FRAME_PLACES;Места
+MAIN_FRAME_PLACES_ADD;Додај
+MAIN_FRAME_PLACES_DEL;Уклони
+MAIN_FRAME_RECENT;Recent Фасцикле
MAIN_MSG_ALREADYEXISTS;Датотека већ постоји.
MAIN_MSG_CANNOTLOAD;Не могу да учитам слику
MAIN_MSG_CANNOTSAVE;Грешка при чувању датотеке
MAIN_MSG_CANNOTSTARTEDITOR;Не могу да покренем програм за уређивање.
MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Изаберите исправну путању у „Поставкама“.
+MAIN_MSG_ERRORDURINGIMAGESAVING;Грешка прилоком чувања слике
MAIN_MSG_EXITJOBSINQUEUEINFO;Заказане слике неће бити обрађене.
MAIN_MSG_EXITJOBSINQUEUEQUEST;Да ли заиста желите да изађете? Неке слике су још увек заказане за обраду.
MAIN_MSG_JOBSINQUEUE;слика(е) у заказаним.
+MAIN_MSG_NAVIGATOR;Навигатор
+MAIN_MSG_PLACES;Места
MAIN_MSG_QOVERWRITE;Да ли желите да препишете?
MAIN_TAB_BASIC;Основно
MAIN_TAB_COLOR;Боја
MAIN_TAB_DETAIL;Детаљи
+MAIN_TAB_DEVELOP;Развијање
+MAIN_TAB_EXIF;Exif
MAIN_TAB_EXPOSURE;Светлост
+MAIN_TAB_FILTER;Филтер
MAIN_TAB_ICM;ИЦМ
MAIN_TAB_IPTC;ИПТЦ
MAIN_TAB_METADATA;Метаподаци
+MAIN_TAB_TAGGING;Ознаке
MAIN_TAB_TRANSFORM;Исправке
-MAIN_TOOLTIP_HIDEFP;Приказује/сакрива доњу површ, директоријуме и разгледач датотека (пречица: F)
-MAIN_TOOLTIP_HIDEHP;Приказује/сакрива леву површ, заједно са историјатом (пречица: H)
+MAIN_TOGGLE_BEFORE_AFTER;Б|А
+MAIN_TOOLTIP_HIDEFP;Приказује/сакрива доњу површ, директоријуме и разгледач датотека (пречица: Ф)
+MAIN_TOOLTIP_HIDEHP;Приказује/сакрива леву површ, заједно са историјатом (пречица: Х)
MAIN_TOOLTIP_INDCLIPPEDH;Приказује исечене светле делове
MAIN_TOOLTIP_INDCLIPPEDS;Приказује исечене тамне делове
MAIN_TOOLTIP_PREFERENCES;Мења поставке програма
-MAIN_TOOLTIP_QINFO;Основни подаци о слици
+MAIN_TOOLTIP_QINFO;Основни подаци о слици Иб>
MAIN_TOOLTIP_SAVE;Чува слику у подразумевану фасциклу
MAIN_TOOLTIP_SAVEAS;Чува слику у изабрану фасциклу
+MAIN_TOOLTIP_TOGGLE;Приказује слику пре и после обраде Б
+NAVIGATOR_B_NA;П = ○
+NAVIGATOR_B_VALUE;П = %1
+NAVIGATOR_G_NA;З = ○
+NAVIGATOR_G_VALUE;З = %1
+NAVIGATOR_H_NA;Х = ○
+NAVIGATOR_H_VALUE;Х = %1
+NAVIGATOR_R_NA;Ц = ○
+NAVIGATOR_R_VALUE;Ц = %1
+NAVIGATOR_S_NA;С = ○
+NAVIGATOR_S_VALUE;С = %1
+NAVIGATOR_V_NA;В = ○
+NAVIGATOR_V_VALUE;В = %1
+NAVIGATOR_XY_NA;x = ○, y = ○
PARTIALPASTE_BASICGROUP;Основна подешавања
PARTIALPASTE_CACORRECTION;Исправљање аберација
PARTIALPASTE_COARSETRANS;Ротација за 90˚ / извртање
@@ -307,7 +370,10 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;Сенке/Светлост
PARTIALPASTE_SHARPENING;Оштрење
PARTIALPASTE_VIGNETTING;Исправљање вињетарења
PARTIALPASTE_WHITEBALANCE;Баланс беле
+PREFERENCES_ADD;Додај
PREFERENCES_APPLNEXTSTARTUP;примењује се након поновног покретања
+PREFERENCES_BATCH_PROCESSING;Обрада закзаног
+PREFERENCES_BEHAVIOR;Понашање
PREFERENCES_BLINKCLIPPED;Покажи претамне/пресветле делове
PREFERENCES_CACHECLEARALL;Обриши све
PREFERENCES_CACHECLEARPROFILES;Обриши профиле
@@ -321,6 +387,7 @@ PREFERENCES_CACHESTRAT2;Мала заузетост меморије, уз сп
PREFERENCES_CACHESTRAT;Остава
PREFERENCES_CACHETHUMBFORM;Формат умањених приказа
PREFERENCES_CACHETHUMBHEIGHT;Највећа висина приказа
+PREFERENCES_CACORRECTION;Исправи хроматске аберације
PREFERENCES_CLEARDLG_LINE1;Чишћење оставе
PREFERENCES_CLEARDLG_LINE2;Ово може да потраје неколико секунди.
PREFERENCES_CLEARDLG_TITLE;Сачекајте
@@ -328,6 +395,8 @@ PREFERENCES_CLIPPINGIND;Показивачи одсечених делова
PREFERENCES_CMETRICINTENT;Колориметријска намера
PREFERENCES_DATEFORMAT;Формат датума
PREFERENCES_DATEFORMATHINT;Можете задати следеће формате:\n%y :година\n%m : месец\n%d : дан\n\nУ Србији се највише користи:\n%d.%m.%y
+PREFERENCES_DCBENHANCE;Примени ДЦБ побољшање
+PREFERENCES_DCBITERATIONS;Број ДЦБ пролаза
PREFERENCES_DEFAULTLANG;Језик програма
PREFERENCES_DEFAULTTHEME;Тема програма
PREFERENCES_DEMOSAICINGALGO;Алгоритам за склапање
@@ -345,15 +414,18 @@ PREFERENCES_FILEFORMAT;Формат датотеке
PREFERENCES_FORIMAGE;За датотеке са сликама
PREFERENCES_FORRAW;За RAW датотеке
PREFERENCES_GIMPPATH;Директоријум са инсталираним Гимпом
+PREFERENCES_GREENEQUIL;Калибрација зелене боје
PREFERENCES_GTKTHEME;ГТК тема
PREFERENCES_HINT;Савет
PREFERENCES_HLTHRESHOLD;Праг за одсечене светле делове
+PREFERENCES_HOTDEADPIXFILT;Избаци прегореле и мртве пикселе
PREFERENCES_ICCDIR;ИЦЦ директоријум
PREFERENCES_IMPROCPARAMS;Подразумевани параметри за обраду слика
PREFERENCES_INTENT_ABSOLUTE;Апсолутно колориметријски
PREFERENCES_INTENT_PERCEPTUAL;Перцептуално
PREFERENCES_INTENT_RELATIVE;Релативно колориметријски
PREFERENCES_INTENT_SATURATION;Засићени приказ
+PREFERENCES_LINEDENOISE;Линијски филтер шума
PREFERENCES_LIVETHUMBNAILS;„Живи“ прикази (спорије)
PREFERENCES_MONITORICC;Профил монитора
PREFERENCES_OUTDIR;Излазни директоријум
@@ -362,6 +434,7 @@ PREFERENCES_OUTDIRFOLDERHINT;Ставља сачуване слике у
PREFERENCES_OUTDIRHINT;Можете да задате следеће скраћенице за форматирање:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nОви знакови за форматирање се односе на директоријуме, подпутање путања до raw датотеке.\n\nНа пример, уколико је отворена слика /home/ivan/слике/02.09.2010/dsc0012.nef, скраћенице означавају:\n%f=dsc0012, %d1=02.09.2010, %d2=слике, ...\n%p1=/home/ivan/слике/02.09.2010, %p2=/home/ivan/слике, %p3=/home/ivan, ...\n\nУколико желите да сачувате развијену слику поред оригинала, унесите:\n%p1/%f\n\nУколико желите да сачувате излазну слику у директоријум „развијене“ који се налази где и оригинална слика, унесите:\n%p1/развијене/%f\n\nУколико желите да сачувате развијену слику у директоријум „/home/ivan/развијене“, а да структура поддиректоријума остане очувана, унесите:\n%p2/развијене/%d1/%f
PREFERENCES_OUTDIRTEMPLATE;Употреби шаблон
PREFERENCES_OUTDIRTEMPLATEHINT;Можете да задате следеће скраћенице за форматирање:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nОви знакови за форматирање се односе на директоријуме, подпутање путања до raw датотеке.\n\nНа пример, уколико је отворена слика /home/ivan/слике/02.09.2010/dsc0012.nef, скраћенице означавају:\n%f=dsc0012, %d1=02.09.2010, %d2=слике, ...\n%p1=/home/ivan/слике/02.09.2010, %p2=/home/ivan/слике, %p3=/home/ivan, ...\n\nУколико желите да сачувате развијену слику поред оригинала, унесите:\n%p1/%f\n\nУколико желите да сачувате излазну слику у директоријум „развијене“ који се налази где и оригинална слика, унесите:\n%p1/развијене/%f\n\nУколико желите да сачувате развијену слику у директоријум „/home/ivan/развијене“, а да структура поддиректоријума остане очувана, унесите:\n%p2/развијене/%d1/%f
+PREFERENCES_OVERLAY_FILENAMES;Постави преко умањеног приказа
PREFERENCES_PARSEDEXT;Екстензије за приказ
PREFERENCES_PARSEDEXTADD;Додај екстензију
PREFERENCES_PARSEDEXTADDHINT;Додаје уписану екстензију на списак
@@ -372,11 +445,13 @@ PREFERENCES_PROFILEPRCACHE;Профил у оставу
PREFERENCES_PROFILEPRFILE;Профил уз улазну датотеку
PREFERENCES_PROFILESAVECACHE;Сачувај рапаметре обраде у оставу
PREFERENCES_PROFILESAVEINPUT;Сачувај парамтре обраде поред улазне датотеке
+PREFERENCES_PROPERTY;Особина
PREFERENCES_PSPATH;Директоријум са инсталираним Адобе Фотошопом
PREFERENCES_SELECTICCDIRDLG;Изаберите директоријум са ИЦЦ профилима...
PREFERENCES_SELECTLANG;Језик
PREFERENCES_SELECTMONITORPROFDLG;Изаберите ИЦЦ профил екрана...
PREFERENCES_SELECTTHEME;Тема
+PREFERENCES_SET;Постави
PREFERENCES_SHOWBASICEXIF;Прикажи основне Exif податке
PREFERENCES_SHOWDATETIME;Прикажи датум и време
PREFERENCES_SHOWONLYRAW;Прикажи само RAW датотеке
@@ -415,11 +490,13 @@ PROGRESSBAR_SAVEPNG;Чувам PNG датотеку...
PROGRESSBAR_SAVETIFF;Чувам TIFF датотеку...
PROGRESSDLG_LOADING;Учитавам датотеку...
PROGRESSDLG_PROCESSING;Обрађујем слику...
+PROGRESSDLG_PROFILECHANGEDINBROWSER;Профил измењен у разгледачу
PROGRESSDLG_SAVING;Чувам датотеку...
QINFO_FOCALLENGTH;Жижна дужина
QINFO_ISO;ИСО
QINFO_LENS;Објектив
QINFO_NOEXIF;Нису доступни Exif подаци.
+SAVEDLG_AUTOSUFFIX;Сам додај суфикс уколико датотека већ постоји
SAVEDLG_FILEFORMAT;Формат датотеке
SAVEDLG_JPEGQUAL;JPEG квалитет
SAVEDLG_JPGFILTER;JPEG датотеке
@@ -431,9 +508,10 @@ SAVEDLG_PUTTOQUEUETAIL;Премешта слику на крај заказан
SAVEDLG_SAVEIMMEDIATELY;Одмах сачувај
SAVEDLG_SAVESPP;Сачувај параметре обраде уз слику
SAVEDLG_TIFFFILTER;TIFF датотеке
-TOOLBAR_TOOLTIP_CROP;Поставља оквир за исецање (пречица: C)
-TOOLBAR_TOOLTIP_HAND;Алат за померање (пречица: N)
-TOOLBAR_TOOLTIP_STRAIGHTEN;Исправља линију хоризонта (пречица: S)
+SAVEDLG_TIFFUNCOMPRESSED;Незапаковани TIFF
+TOOLBAR_TOOLTIP_CROP;Поставља оквир за исецање (пречица: Ц)
+TOOLBAR_TOOLTIP_HAND;Алат за померање (пречица: Н)
+TOOLBAR_TOOLTIP_STRAIGHTEN;Исправља линију хоризонта (пречица: С)
TOOLBAR_TOOLTIP_WB;Одређује баланс беле из тачке (пречица: W)
TP_CACORRECTION_BLUE;Плава
TP_CACORRECTION_LABEL;Хроматке аберације
@@ -478,12 +556,25 @@ TP_CROP_H;В
TP_CROP_LABEL;Исецање
TP_CROP_SELECTCROP; Изабери област
TP_CROP_W;Ш
+TP_CROP_X;x
+TP_CROP_Y;y
+TP_DETAIL_AMOUNT;Количина
+TP_DIRPYRDENOISE_CHROMA;Боја
+TP_DIRPYRDENOISE_GAMMA;Гама
+TP_DIRPYRDENOISE_LABEL;Дирекционо пирамидно уклањање шума
+TP_DIRPYRDENOISE_LUMA;Луминанса
TP_DISTORTION_AMOUNT;Количина
TP_DISTORTION_LABEL;Изобличења
-TP_EXPOSURE_AUTOLEVELS;Сам постави нивое
+TP_EQUALIZER_CONTRAST_MINUS;Контраст -
+TP_EQUALIZER_CONTRAST_PLUS;Контраст +
+TP_EQUALIZER_FINEST;најфиније
+TP_EQUALIZER_LABEL;Таласно уједначење
+TP_EQUALIZER_LARGEST;најгрубље
+TP_EQUALIZER_NEUTRAL;Неутрално
+TP_EXPOSURE_AUTOLEVELS;Ауто-нивои
TP_EXPOSURE_BLACKLEVEL;Црна
TP_EXPOSURE_BRIGHTNESS;Осветљеност
-TP_EXPOSURE_CLIP;Одсецање
+TP_EXPOSURE_CLIP;Одсеци
TP_EXPOSURE_COMPRHIGHLIGHTS;Сабијање светлог
TP_EXPOSURE_COMPRSHADOWS;Сабијање сенки
TP_EXPOSURE_CONTRAST;Контраст
@@ -509,6 +600,11 @@ TP_ICM_OUTPUTDLGLABEL;Изаберите излазни ИЦЦ профил...
TP_ICM_OUTPUTPROFILE;Излазни профил
TP_ICM_SAVEREFERENCE;Сачувај слику као референцу за профил
TP_ICM_WORKINGPROFILE;Радни профил
+TP_IMPULSEDENOISE_LABEL;Импулсно уклањање шума
+TP_IMPULSEDENOISE_THRESH;Праг
+TP_LENSGEOM_AUTOCROP;Сам исеци
+TP_LENSGEOM_FILL;Сам попуни
+TP_LENSGEOM_LABEL;Објектив и геометрија
TP_LUMACURVE_BLACKLEVEL;Црна
TP_LUMACURVE_BRIGHTNESS;Осветљење
TP_LUMACURVE_COMPRHIGHLIGHTS;Сабијање светлог
@@ -519,17 +615,25 @@ TP_LUMACURVE_LABEL;Крива луминансе
TP_LUMADENOISE_EDGETOLERANCE;Толеранција ивице
TP_LUMADENOISE_LABEL;Уклањање светлосног шума
TP_LUMADENOISE_RADIUS;Полупречник
+TP_PERSPECTIVE_HORIZONTAL;Хоризонтална
+TP_PERSPECTIVE_LABEL;Перспектива
+TP_PERSPECTIVE_VERTICAL;Вертикална
TP_RESIZE_BICUBIC;Бикубично
TP_RESIZE_BICUBICSF;Бикубично (мекше)
TP_RESIZE_BICUBICSH;Бикубично (оштрије)
TP_RESIZE_BILINEAR;Билинеарно
+TP_RESIZE_DOWNSCALEB;Смањење размере (боље)
+TP_RESIZE_DOWNSCALEF;Смањење размере (брже)
TP_RESIZE_FULLSIZE;Стварна величина слике:
TP_RESIZE_H;В:
+TP_RESIZE_HEIGHT;Висину
TP_RESIZE_LABEL;Величина слике
TP_RESIZE_METHOD;Начин:
TP_RESIZE_NEAREST;Најближе
-TP_RESIZE_SCALE;Умањено
+TP_RESIZE_SCALE;Умањење
+TP_RESIZE_SPECIFY;Изабери:
TP_RESIZE_W;Ш:
+TP_RESIZE_WIDTH;Ширину
TP_ROTATE_AUTOCROP;Сам исеци
TP_ROTATE_DEGREE;Степени:
TP_ROTATE_FILL;Попуни
@@ -576,8 +680,13 @@ ZOOMBAR_NORMAL;Нормално
ZOOMBAR_PREVIEW;Преглед
ZOOMBAR_SCALE;Умањено
ZOOMBAR_SMALL;Мало
-изабрану фасциклу
-# Serbian translation
+ZOOMPANEL_100;(100%)
+ZOOMPANEL_NEWCROPWINDOW;Отвара нови прозор са детаљима
+ZOOMPANEL_ZOOM100;Повећава преглед на 100% 1
+ZOOMPANEL_ZOOMFITSCREEN;Уклапа слику у величину прозора Ф
+ZOOMPANEL_ZOOMIN;Увећава приказ слике +
+ZOOMPANEL_ZOOMOUT;Умањује приказ слике -
+HISTOGRAM_BUTTON_B;П
!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -585,114 +694,11 @@ ZOOMBAR_SMALL;Мало
!!!!!!!!!!!!!!!!!!!!!!!!!
-!BATCHQUEUE_AUTOSTART;Auto start
-!BATCH_PROCESSING;batch processing
-!CURVEEDITOR_CUSTOM;Custom
-!CURVEEDITOR_DARKS;Darks
-!CURVEEDITOR_HIGHLIGHTS;Highlights
-!CURVEEDITOR_LIGHTS;Lights
-!CURVEEDITOR_NURBS;Control cage
-!CURVEEDITOR_PARAMETRIC;Parametric
-!CURVEEDITOR_SHADOWS;Shadows
-!CURVEEDITOR_TYPE;Type:
-!EXIFFILTER_METADATAFILTER;Enable Metadata Filters
-!FILEBROWSER_ADDDELTEMPLATE;Add/Del templates...
-!FILEBROWSER_CURRENT_NAME;Current name:
-!FILEBROWSER_NEW_NAME;New name:
-!FILEBROWSER_SHOWEXIFINFO;Show EXIF info i
-!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives
-!FILEBROWSER_USETEMPLATE;Use template:
-!GENERAL_AFTER;After
-!GENERAL_BEFORE;Before
-!GENERAL_HIGH_QUALITY;High Quality
-!GENERAL_UNCHANGED;(Unchanged)
!HISTOGRAM_BUTTON_B;B
-!HISTOGRAM_BUTTON_G;G
-!HISTOGRAM_BUTTON_L;L
-!HISTOGRAM_BUTTON_R;R
-!HISTORY_MSG_82;Profile Changed
-!HISTORY_MSG_83;High quality shadows/highlights
-!HISTORY_MSG_84;Perspective correction
-!MAIN_BUTTON_EXIT;Exit
-!MAIN_BUTTON_FULLSCREEN;Fullscreen
-!MAIN_BUTTON_PUTTOQUEUE;Put to queue
-!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
-!MAIN_BUTTON_QUEUE;Put to queue
-!MAIN_BUTTON_SAVE_TOOLTIP;Save current image Ctrl+S
-!MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor Ctrl+E
-!MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen
-!MAIN_FRAME_BATCHQUEUE;Batch Queue
-!MAIN_FRAME_FILEBROWSER;File Browser
-!MAIN_FRAME_PLACES;Places
-!MAIN_FRAME_PLACES_ADD;Add
-!MAIN_FRAME_PLACES_DEL;Del
-!MAIN_FRAME_RECENT;Recent Folders
-!MAIN_MSG_ERRORDURINGIMAGESAVING;Error during image saving
-!MAIN_MSG_NAVIGATOR;Navigator
-!MAIN_MSG_PLACES;Places
-!MAIN_TAB_DEVELOP;Develop
-!MAIN_TAB_EXIF;Exif
-!MAIN_TAB_FILTER;Filter
-!MAIN_TAB_TAGGING;Tagging
-!MAIN_TOGGLE_BEFORE_AFTER;B|A
-!MAIN_TOOLTIP_TOGGLE;Toggle before/after view B
-!NAVIGATOR_B_NA;B = n/a
-!NAVIGATOR_B_VALUE;B = %1
-!NAVIGATOR_G_NA;G = n/a
-!NAVIGATOR_G_VALUE;G = %1
-!NAVIGATOR_H_NA;H = n/a
-!NAVIGATOR_H_VALUE;H = %1
-!NAVIGATOR_R_NA;R = n/a
-!NAVIGATOR_R_VALUE;R = %1
-!NAVIGATOR_S_NA;S = n/a
-!NAVIGATOR_S_VALUE;S = %1
-!NAVIGATOR_V_NA;V = n/a
-!NAVIGATOR_V_VALUE;V = %1
-!NAVIGATOR_XY_NA;x = n/a, y = n/a
-!PREFERENCES_ADD;ADD
-!PREFERENCES_BATCH_PROCESSING;batch processing
-!PREFERENCES_BEHAVIOR;Behavior
-!PREFERENCES_CACORRECTION;Apply CA auto correction
-!PREFERENCES_DCBENHANCE;Apply DCB enhancement step
-!PREFERENCES_DCBITERATIONS;Number of DCB iterations
-!PREFERENCES_GREENEQUIL;Green equilibration
-!PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter
-!PREFERENCES_LINEDENOISE;Line noise filter
-!PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails
-!PREFERENCES_PROPERTY;Property
-!PREFERENCES_SET;SET
-!PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser
-!SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists
-!SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
-!TP_CROP_X;x
-!TP_CROP_Y;y
-!TP_DETAIL_AMOUNT;Amount
-!TP_DIRPYRDENOISE_CHROMA;Chrominance
-!TP_DIRPYRDENOISE_GAMMA;Gamma
-!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction
-!TP_DIRPYRDENOISE_LUMA;Luminance
-!TP_EQUALIZER_CONTRAST_MINUS;Contrast-
-!TP_EQUALIZER_CONTRAST_PLUS;Contrast+
-!TP_EQUALIZER_FINEST;finest
-!TP_EQUALIZER_LABEL;Wavelet equalizer
-!TP_EQUALIZER_LARGEST;coarsest
-!TP_EQUALIZER_NEUTRAL;Neutral
-!TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction
-!TP_IMPULSEDENOISE_THRESH;Threshold
-!TP_LENSGEOM_AUTOCROP;Auto Crop
-!TP_LENSGEOM_FILL;Auto Fill
-!TP_LENSGEOM_LABEL;Lens / Geometry
-!TP_PERSPECTIVE_HORIZONTAL;Horizontal
-!TP_PERSPECTIVE_LABEL;Perspective
-!TP_PERSPECTIVE_VERTICAL;Vertical
-!TP_RESIZE_DOWNSCALEB;Downscale (Better)
-!TP_RESIZE_DOWNSCALEF;Downscale (Faster)
-!TP_RESIZE_HEIGHT;Height
-!TP_RESIZE_SPECIFY;Specify:
-!TP_RESIZE_WIDTH;Width
-!ZOOMPANEL_100;(100%)
-!ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window
-!ZOOMPANEL_ZOOM100;Zoom to 100% 1
-!ZOOMPANEL_ZOOMFITSCREEN;Fit to screen F
-!ZOOMPANEL_ZOOMIN;Zoom In +
-!ZOOMPANEL_ZOOMOUT;Zoom Out -
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
diff --git a/rtdata/languages/Serbian (Latin Characters) b/rtdata/languages/Serbian (Latin Characters)
index 4ae918fa9..0ac8b9510 100644
--- a/rtdata/languages/Serbian (Latin Characters)
+++ b/rtdata/languages/Serbian (Latin Characters)
@@ -1,20 +1,32 @@
-
-#00 Serbian (Latin)
-#01 by gpopac 2010-09-15
+# Serbian translation
+#00 Serbian (Cyrilic)
+#01 by gpopac 2010-09-21
ADJUSTER_RESET_TO_DEFAULT;Vrati na podrazumevano
+BATCHQUEUE_AUTOSTART;Sam započni
+BATCH_PROCESSING;obrada
+CURVEEDITOR_CUSTOM;Proizvoljno
+CURVEEDITOR_DARKS;Tamno
CURVEEDITOR_FILEDLGFILTERANY;Sve datoteke
CURVEEDITOR_FILEDLGFILTERCURVE;Datoteke sa krivama
+CURVEEDITOR_HIGHLIGHTS;Presvetlo
+CURVEEDITOR_LIGHTS;Svetlo
CURVEEDITOR_LINEAR;Linearno
CURVEEDITOR_LOADDLGLABEL;Učitaj krivu...
+CURVEEDITOR_NURBS;Sa kavezom
+CURVEEDITOR_PARAMETRIC;Parametarski
CURVEEDITOR_SAVEDLGLABEL;Sačuvaj krivu...
+CURVEEDITOR_SHADOWS;Senke
CURVEEDITOR_TOOLTIPLINEAR;Vraća krivu na linearnu
CURVEEDITOR_TOOLTIPLOAD;Učitava krivulju iz datoteke
CURVEEDITOR_TOOLTIPSAVE;Čuva trenutnu krivulju
+CURVEEDITOR_TYPE;Vrsta:
EXIFFILTER_APERTURE;Otvor blende
EXIFFILTER_CAMERA;Foto aparat
EXIFFILTER_DIALOGLABEL;Exif filter
EXIFFILTER_FOCALLEN;Žižna daljina
+EXIFFILTER_ISO;ISO
EXIFFILTER_LENS;Objektiv
+EXIFFILTER_METADATAFILTER;Filtriraj metapodatke
EXIFFILTER_SHUTTER;Ekspozicija
EXIFPANEL_ADDEDIT;Dodaj/Izmeni
EXIFPANEL_ADDEDITHINT;Dodaje novu oznaku ili uređuje postojeću
@@ -30,10 +42,12 @@ EXIFPANEL_RESETALL;Vrati sve
EXIFPANEL_RESETALLHINT;Vraća sve oznake na početne vrednosti
EXIFPANEL_RESETHINT;Vraća izabranu oznaku na početnu vrednosti
EXIFPANEL_SUBDIRECTORY;Poddirektorijum
+FILEBROWSER_ADDDELTEMPLATE;Dodaj/ukloni šablone...
FILEBROWSER_APPLYPROFILE;Primeni profil
FILEBROWSER_ARRANGEMENTHINT;Razmenjuje vertikalni i horizontalni raspored umanjenih prikaza
FILEBROWSER_CLEARPROFILE;Obriši profil
FILEBROWSER_COPYPROFILE;Umnoži profil
+FILEBROWSER_CURRENT_NAME;Trenutno ime:
FILEBROWSER_DELETEDLGLABEL;Brisanje datoteke
FILEBROWSER_DELETEDLGMSG;Da li sigurno želite da obrišete %1 datoteka?
FILEBROWSER_EMPTYTRASH;Izbaci smeće
@@ -43,6 +57,7 @@ FILEBROWSER_EXIFFILTERAPPLYHINT;Uključuje/isključuje exif filter u razgledaču
FILEBROWSER_EXIFFILTERLABEL;Exif filter
FILEBROWSER_EXIFFILTERSETTINGS;Podesi
FILEBROWSER_EXIFFILTERSETTINGSHINT;Menja podešavanja exif filtera
+FILEBROWSER_NEW_NAME;Novo ime:
FILEBROWSER_PARTIALPASTEPROFILE;Delimično ubaci
FILEBROWSER_PASTEPROFILE;Ubaci profil
FILEBROWSER_POPUPCANCELJOB;Otkaži zadatak
@@ -66,27 +81,33 @@ FILEBROWSER_PROCESSINGSETTINGSHINT;Postavlja format datoteke i izlazni direktori
FILEBROWSER_RENAMEDLGLABEL;Preimenuj datoteku
FILEBROWSER_RENAMEDLGMSG;Preimenuj datoteku „%1“ u:
FILEBROWSER_SHOWDIRHINT;Prikazuje sve slike iz direktorijuma
+FILEBROWSER_SHOWEXIFINFO;Prikazuje EXIF podatke i
FILEBROWSER_SHOWQUEUEHINT;Prikazuje slike zakazane za obradu
FILEBROWSER_SHOWRANK1HINT;Prikazuje slike ocenjene sa 1 zvezdicom
-FILEBROWSER_SHOWRANK2HINT;Prikazuje slike ocenjene sa 2 zvezdicom
-FILEBROWSER_SHOWRANK3HINT;Prikazuje slike ocenjene sa 3 zvezdicom
-FILEBROWSER_SHOWRANK4HINT;Prikazuje slike ocenjene sa 5 zvezdicom
-FILEBROWSER_SHOWRANK5HINT;Prikazuje slike ocenjene sa 5 zvezdicom
+FILEBROWSER_SHOWRANK2HINT;Prikazuje slike ocenjene sa 2 zvezdice
+FILEBROWSER_SHOWRANK3HINT;Prikazuje slike ocenjene sa 3 zvezdice
+FILEBROWSER_SHOWRANK4HINT;Prikazuje slike ocenjene sa 4 zvezdice
+FILEBROWSER_SHOWRANK5HINT;Prikazuje slike ocenjene sa 5 zvezdica
FILEBROWSER_SHOWTRASHHINT;Prikazuje slike u smeću
FILEBROWSER_SHOWUNRANKHINT;Prikaži neocenjene slike
FILEBROWSER_STARTPROCESSING;Započni obradu
FILEBROWSER_STARTPROCESSINGHINT;Počinje obradu i čuvanje zakazanih slika
FILEBROWSER_STOPPROCESSING;Zaustavi obradu
FILEBROWSER_STOPPROCESSINGHINT;Zaustavlja obradu slika
-FILEBROWSER_THUMBSIZE;Vel. pregleda
+FILEBROWSER_THUMBSIZE;Pregled
+FILEBROWSER_TOOLTIP_STOPPROCESSING;Pokreće obradu fotografija kada ih zakažete
+FILEBROWSER_USETEMPLATE;Iskoristi šablon:
FILEBROWSER_ZOOMINHINT;Uvećava pregled
FILEBROWSER_ZOOMOUTHINT;Umanjuje pregled
GENERAL_ABOUT;O programu
+GENERAL_AFTER;Posle
+GENERAL_BEFORE;Pre
GENERAL_CANCEL;Otkaži
GENERAL_DISABLE;Isključi
GENERAL_DISABLED;Isključeno
GENERAL_ENABLE;Uključi
GENERAL_ENABLED;Uključi
+GENERAL_HIGH_QUALITY;Visok kvalitet
GENERAL_LANDSCAPE;Položeno
GENERAL_LOAD;Učitaj
GENERAL_NA;nema
@@ -94,14 +115,19 @@ GENERAL_NO;Ne
GENERAL_OK;U redu
GENERAL_PORTRAIT;Uspravno
GENERAL_SAVE;Sačuvaj
+GENERAL_UNCHANGED;(neizmenjeno)
GENERAL_YES;Da
+HISTOGRAM_BUTTON_G;Z
+HISTOGRAM_BUTTON_L;S
+HISTOGRAM_BUTTON_R;C
+HISTOGRAM_LABEL;Histogram
HISTOGRAM_TOOLTIP_B;Prikazuje plavi histogram
HISTOGRAM_TOOLTIP_G;Prikazuje zeleni histogram
HISTOGRAM_TOOLTIP_L;Prikazuje CieLab hitogram
HISTOGRAM_TOOLTIP_R;Prikazuje crveni histogram
HISTORY_CHANGED;Izmenjeno
HISTORY_CUSTOMCURVE;Proizvoljna kriva
-HISTORY_DELSNAPSHOT;Izbiši
+HISTORY_DELSNAPSHOT;Ukloni
HISTORY_FROMCLIPBOARD;Iz ostave
HISTORY_LABEL;Istorijat
HISTORY_MSG_10;Sabijanje senki
@@ -183,6 +209,9 @@ HISTORY_MSG_79;Širina pri promeni veličine
HISTORY_MSG_7;Crna
HISTORY_MSG_80;Visina pri promeni veličine
HISTORY_MSG_81;Uključena promena veličina
+HISTORY_MSG_82;Profil je izmenjen
+HISTORY_MSG_83;Kvalitetno svetlost/senke
+HISTORY_MSG_84;Ispravljanje perspektive
HISTORY_MSG_8;Kompenzacija ekspozicije
HISTORY_MSG_9;Sabijanje svetlog
HISTORY_NEWSNAPSHOT;Dodaj
@@ -248,33 +277,71 @@ IPTCPANEL_TITLE;Natpis
IPTCPANEL_TITLEHINT;Kratni naziv slike (ime objekta).
IPTCPANEL_TRANSREFERENCE;Ref. prenosa
IPTCPANEL_TRANSREFERENCEHINT;Kod kojji predstavlja mesto prvobitnog prenosa (referenca prvog prenosa).
+MAIN_BUTTON_EXIT;Izađi
+MAIN_BUTTON_FULLSCREEN;Ceo ekran
MAIN_BUTTON_PREFERENCES;Postavke
-MAIN_BUTTON_SAVE;Sačuvaj sliku
+MAIN_BUTTON_PUTTOQUEUE;Zakaži
+MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Dodaje trenutnu sliku u zakazane Ctrl+Q
+MAIN_BUTTON_QUEUE;Zakaži
+MAIN_BUTTON_SAVE;Sačuvaj
MAIN_BUTTON_SAVEAS;Kao...
-MAIN_BUTTON_SENDTOEDITOR;Pošalji za uređivanje
+MAIN_BUTTON_SAVE_TOOLTIP;Čuva trenutnu sliku Ctrl+S
+MAIN_BUTTON_SENDTOEDITOR;Uredi
+MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Uređuje trenutnu sliku u spoljnom programu Ctrl+E
+MAIN_BUTTON_UNFULLSCREEN;Napusti ceo ekran
+MAIN_FRAME_BATCHQUEUE;Zakazane datoteke
+MAIN_FRAME_FILEBROWSER;Razgledač datoteka
+MAIN_FRAME_PLACES;Mesta
+MAIN_FRAME_PLACES_ADD;Dodaj
+MAIN_FRAME_PLACES_DEL;Ukloni
+MAIN_FRAME_RECENT;Recent Fascikle
MAIN_MSG_ALREADYEXISTS;Datoteka već postoji.
MAIN_MSG_CANNOTLOAD;Ne mogu da učitam sliku
MAIN_MSG_CANNOTSAVE;Greška pri čuvanju datoteke
MAIN_MSG_CANNOTSTARTEDITOR;Ne mogu da pokrenem program za uređivanje.
MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY;Izaberite ispravnu putanju u „Postavkama“.
+MAIN_MSG_ERRORDURINGIMAGESAVING;Greška prilokom čuvanja slike
MAIN_MSG_EXITJOBSINQUEUEINFO;Zakazane slike neće biti obrađene.
MAIN_MSG_EXITJOBSINQUEUEQUEST;Da li zaista želite da izađete? Neke slike su još uvek zakazane za obradu.
MAIN_MSG_JOBSINQUEUE;slika(e) u zakazanim.
+MAIN_MSG_NAVIGATOR;Navigator
+MAIN_MSG_PLACES;Mesta
MAIN_MSG_QOVERWRITE;Da li želite da prepišete?
MAIN_TAB_BASIC;Osnovno
MAIN_TAB_COLOR;Boja
MAIN_TAB_DETAIL;Detalji
+MAIN_TAB_DEVELOP;Razvijanje
+MAIN_TAB_EXIF;Exif
MAIN_TAB_EXPOSURE;Svetlost
+MAIN_TAB_FILTER;Filter
+MAIN_TAB_ICM;ICM
+MAIN_TAB_IPTC;IPTC
MAIN_TAB_METADATA;Metapodaci
+MAIN_TAB_TAGGING;Oznake
MAIN_TAB_TRANSFORM;Ispravke
+MAIN_TOGGLE_BEFORE_AFTER;B|A
MAIN_TOOLTIP_HIDEFP;Prikazuje/sakriva donju površ, direktorijume i razgledač datoteka (prečica: F)
MAIN_TOOLTIP_HIDEHP;Prikazuje/sakriva levu površ, zajedno sa istorijatom (prečica: H)
MAIN_TOOLTIP_INDCLIPPEDH;Prikazuje isečene svetle delove
MAIN_TOOLTIP_INDCLIPPEDS;Prikazuje isečene tamne delove
MAIN_TOOLTIP_PREFERENCES;Menja postavke programa
-MAIN_TOOLTIP_QINFO;Osnovni podaci o slici
+MAIN_TOOLTIP_QINFO;Osnovni podaci o slici I
MAIN_TOOLTIP_SAVE;Čuva sliku u podrazumevanu fasciklu
MAIN_TOOLTIP_SAVEAS;Čuva sliku u izabranu fasciklu
+MAIN_TOOLTIP_TOGGLE;Prikazuje sliku pre i posle obrade B
+NAVIGATOR_B_NA;P = ○
+NAVIGATOR_B_VALUE;P = %1
+NAVIGATOR_G_NA;Z = ○
+NAVIGATOR_G_VALUE;Z = %1
+NAVIGATOR_H_NA;H = ○
+NAVIGATOR_H_VALUE;H = %1
+NAVIGATOR_R_NA;C = ○
+NAVIGATOR_R_VALUE;C = %1
+NAVIGATOR_S_NA;S = ○
+NAVIGATOR_S_VALUE;S = %1
+NAVIGATOR_V_NA;V = ○
+NAVIGATOR_V_VALUE;V = %1
+NAVIGATOR_XY_NA;x = ○, y = ○
PARTIALPASTE_BASICGROUP;Osnovna podešavanja
PARTIALPASTE_CACORRECTION;Ispravljanje aberacija
PARTIALPASTE_COARSETRANS;Rotacija za 90˚ / izvrtanje
@@ -303,7 +370,10 @@ PARTIALPASTE_SHADOWSHIGHLIGHTS;Senke/Svetlost
PARTIALPASTE_SHARPENING;Oštrenje
PARTIALPASTE_VIGNETTING;Ispravljanje vinjetarenja
PARTIALPASTE_WHITEBALANCE;Balans bele
+PREFERENCES_ADD;Dodaj
PREFERENCES_APPLNEXTSTARTUP;primenjuje se nakon ponovnog pokretanja
+PREFERENCES_BATCH_PROCESSING;Obrada zakzanog
+PREFERENCES_BEHAVIOR;Ponašanje
PREFERENCES_BLINKCLIPPED;Pokaži pretamne/presvetle delove
PREFERENCES_CACHECLEARALL;Obriši sve
PREFERENCES_CACHECLEARPROFILES;Obriši profile
@@ -317,6 +387,7 @@ PREFERENCES_CACHESTRAT2;Mala zauzetost memorije, uz sporiji rad
PREFERENCES_CACHESTRAT;Ostava
PREFERENCES_CACHETHUMBFORM;Format umanjenih prikaza
PREFERENCES_CACHETHUMBHEIGHT;Najveća visina prikaza
+PREFERENCES_CACORRECTION;Ispravi hromatske aberacije
PREFERENCES_CLEARDLG_LINE1;Čišćenje ostave
PREFERENCES_CLEARDLG_LINE2;Ovo može da potraje nekoliko sekundi.
PREFERENCES_CLEARDLG_TITLE;Sačekajte
@@ -324,6 +395,8 @@ PREFERENCES_CLIPPINGIND;Pokazivači odsečenih delova
PREFERENCES_CMETRICINTENT;Kolorimetrijska namera
PREFERENCES_DATEFORMAT;Format datuma
PREFERENCES_DATEFORMATHINT;Možete zadati sledeće formate:\n%y :godina\n%m : mesec\n%d : dan\n\nU Srbiji se najviše koristi:\n%d.%m.%y
+PREFERENCES_DCBENHANCE;Primeni DCB poboljšanje
+PREFERENCES_DCBITERATIONS;Broj DCB prolaza
PREFERENCES_DEFAULTLANG;Jezik programa
PREFERENCES_DEFAULTTHEME;Tema programa
PREFERENCES_DEMOSAICINGALGO;Algoritam za sklapanje
@@ -341,15 +414,18 @@ PREFERENCES_FILEFORMAT;Format datoteke
PREFERENCES_FORIMAGE;Za datoteke sa slikama
PREFERENCES_FORRAW;Za RAW datoteke
PREFERENCES_GIMPPATH;Direktorijum sa instaliranim Gimpom
+PREFERENCES_GREENEQUIL;Kalibracija zelene boje
PREFERENCES_GTKTHEME;GTK tema
PREFERENCES_HINT;Savet
PREFERENCES_HLTHRESHOLD;Prag za odsečene svetle delove
+PREFERENCES_HOTDEADPIXFILT;Izbaci pregorele i mrtve piksele
PREFERENCES_ICCDIR;ICC direktorijum
PREFERENCES_IMPROCPARAMS;Podrazumevani parametri za obradu slika
PREFERENCES_INTENT_ABSOLUTE;Apsolutno kolorimetrijski
PREFERENCES_INTENT_PERCEPTUAL;Perceptualno
PREFERENCES_INTENT_RELATIVE;Relativno kolorimetrijski
PREFERENCES_INTENT_SATURATION;Zasićeni prikaz
+PREFERENCES_LINEDENOISE;Linijski filter šuma
PREFERENCES_LIVETHUMBNAILS;„Živi“ prikazi (sporije)
PREFERENCES_MONITORICC;Profil monitora
PREFERENCES_OUTDIR;Izlazni direktorijum
@@ -358,6 +434,7 @@ PREFERENCES_OUTDIRFOLDERHINT;Stavlja sačuvane slike u
PREFERENCES_OUTDIRHINT;Možete da zadate sledeće skraćenice za formatiranje:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nOvi znakovi za formatiranje se odnose na direktorijume, podputanje putanja do raw datoteke.\n\nNa primer, ukoliko je otvorena slika /home/ivan/slike/02.09.2010/dsc0012.nef, skraćenice označavaju:\n%f=dsc0012, %d1=02.09.2010, %d2=slike, ...\n%p1=/home/ivan/slike/02.09.2010, %p2=/home/ivan/slike, %p3=/home/ivan, ...\n\nUkoliko želite da sačuvate razvijenu sliku pored originala, unesite:\n%p1/%f\n\nUkoliko želite da sačuvate izlaznu sliku u direktorijum „razvijene“ koji se nalazi gde i originalna slika, unesite:\n%p1/razvijene/%f\n\nUkoliko želite da sačuvate razvijenu sliku u direktorijum „/home/ivan/razvijene“, a da struktura poddirektorijuma ostane očuvana, unesite:\n%p2/razvijene/%d1/%f
PREFERENCES_OUTDIRTEMPLATE;Upotrebi šablon
PREFERENCES_OUTDIRTEMPLATEHINT;Možete da zadate sledeće skraćenice za formatiranje:\n%f, %d1, %d2, ..., %p1, %p2, ...\n\nOvi znakovi za formatiranje se odnose na direktorijume, podputanje putanja do raw datoteke.\n\nNa primer, ukoliko je otvorena slika /home/ivan/slike/02.09.2010/dsc0012.nef, skraćenice označavaju:\n%f=dsc0012, %d1=02.09.2010, %d2=slike, ...\n%p1=/home/ivan/slike/02.09.2010, %p2=/home/ivan/slike, %p3=/home/ivan, ...\n\nUkoliko želite da sačuvate razvijenu sliku pored originala, unesite:\n%p1/%f\n\nUkoliko želite da sačuvate izlaznu sliku u direktorijum „razvijene“ koji se nalazi gde i originalna slika, unesite:\n%p1/razvijene/%f\n\nUkoliko želite da sačuvate razvijenu sliku u direktorijum „/home/ivan/razvijene“, a da struktura poddirektorijuma ostane očuvana, unesite:\n%p2/razvijene/%d1/%f
+PREFERENCES_OVERLAY_FILENAMES;Postavi preko umanjenog prikaza
PREFERENCES_PARSEDEXT;Ekstenzije za prikaz
PREFERENCES_PARSEDEXTADD;Dodaj ekstenziju
PREFERENCES_PARSEDEXTADDHINT;Dodaje upisanu ekstenziju na spisak
@@ -368,11 +445,13 @@ PREFERENCES_PROFILEPRCACHE;Profil u ostavu
PREFERENCES_PROFILEPRFILE;Profil uz ulaznu datoteku
PREFERENCES_PROFILESAVECACHE;Sačuvaj rapametre obrade u ostavu
PREFERENCES_PROFILESAVEINPUT;Sačuvaj paramtre obrade pored ulazne datoteke
+PREFERENCES_PROPERTY;Osobina
PREFERENCES_PSPATH;Direktorijum sa instaliranim Adobe Fotošopom
PREFERENCES_SELECTICCDIRDLG;Izaberite direktorijum sa ICC profilima...
PREFERENCES_SELECTLANG;Jezik
PREFERENCES_SELECTMONITORPROFDLG;Izaberite ICC profil ekrana...
PREFERENCES_SELECTTHEME;Tema
+PREFERENCES_SET;Postavi
PREFERENCES_SHOWBASICEXIF;Prikaži osnovne Exif podatke
PREFERENCES_SHOWDATETIME;Prikaži datum i vreme
PREFERENCES_SHOWONLYRAW;Prikaži samo RAW datoteke
@@ -411,10 +490,13 @@ PROGRESSBAR_SAVEPNG;Čuvam PNG datoteku...
PROGRESSBAR_SAVETIFF;Čuvam TIFF datoteku...
PROGRESSDLG_LOADING;Učitavam datoteku...
PROGRESSDLG_PROCESSING;Obrađujem sliku...
+PROGRESSDLG_PROFILECHANGEDINBROWSER;Profil izmenjen u razgledaču
PROGRESSDLG_SAVING;Čuvam datoteku...
QINFO_FOCALLENGTH;Žižna dužina
+QINFO_ISO;ISO
QINFO_LENS;Objektiv
QINFO_NOEXIF;Nisu dostupni Exif podaci.
+SAVEDLG_AUTOSUFFIX;Sam dodaj sufiks ukoliko datoteka već postoji
SAVEDLG_FILEFORMAT;Format datoteke
SAVEDLG_JPEGQUAL;JPEG kvalitet
SAVEDLG_JPGFILTER;JPEG datoteke
@@ -426,6 +508,7 @@ SAVEDLG_PUTTOQUEUETAIL;Premešta sliku na kraj zakazanih
SAVEDLG_SAVEIMMEDIATELY;Odmah sačuvaj
SAVEDLG_SAVESPP;Sačuvaj parametre obrade uz sliku
SAVEDLG_TIFFFILTER;TIFF datoteke
+SAVEDLG_TIFFUNCOMPRESSED;Nezapakovani TIFF
TOOLBAR_TOOLTIP_CROP;Postavlja okvir za isecanje (prečica: C)
TOOLBAR_TOOLTIP_HAND;Alat za pomeranje (prečica: N)
TOOLBAR_TOOLTIP_STRAIGHTEN;Ispravlja liniju horizonta (prečica: S)
@@ -473,12 +556,25 @@ TP_CROP_H;V
TP_CROP_LABEL;Isecanje
TP_CROP_SELECTCROP; Izaberi oblast
TP_CROP_W;Š
+TP_CROP_X;x
+TP_CROP_Y;y
+TP_DETAIL_AMOUNT;Količina
+TP_DIRPYRDENOISE_CHROMA;Boja
+TP_DIRPYRDENOISE_GAMMA;Gama
+TP_DIRPYRDENOISE_LABEL;Direkciono piramidno uklanjanje šuma
+TP_DIRPYRDENOISE_LUMA;Luminansa
TP_DISTORTION_AMOUNT;Količina
TP_DISTORTION_LABEL;Izobličenja
-TP_EXPOSURE_AUTOLEVELS;Sam postavi nivoe
+TP_EQUALIZER_CONTRAST_MINUS;Kontrast -
+TP_EQUALIZER_CONTRAST_PLUS;Kontrast +
+TP_EQUALIZER_FINEST;najfinije
+TP_EQUALIZER_LABEL;Talasno ujednačenje
+TP_EQUALIZER_LARGEST;najgrublje
+TP_EQUALIZER_NEUTRAL;Neutralno
+TP_EXPOSURE_AUTOLEVELS;Auto-nivoi
TP_EXPOSURE_BLACKLEVEL;Crna
TP_EXPOSURE_BRIGHTNESS;Osvetljenost
-TP_EXPOSURE_CLIP;Odsecanje
+TP_EXPOSURE_CLIP;Odseci
TP_EXPOSURE_COMPRHIGHLIGHTS;Sabijanje svetlog
TP_EXPOSURE_COMPRSHADOWS;Sabijanje senki
TP_EXPOSURE_CONTRAST;Kontrast
@@ -498,11 +594,17 @@ TP_ICM_INPUTCUSTOM;Proizvoljno
TP_ICM_INPUTDLGLABEL;Izaberite ulazni ICC profil...
TP_ICM_INPUTEMBEDDED;Ugnježđeno, ukoliko je moguće
TP_ICM_INPUTPROFILE;Ulazni profil
+TP_ICM_LABEL;ICM
TP_ICM_NOICM;No ICM: sRGB izlaz
TP_ICM_OUTPUTDLGLABEL;Izaberite izlazni ICC profil...
TP_ICM_OUTPUTPROFILE;Izlazni profil
TP_ICM_SAVEREFERENCE;Sačuvaj sliku kao referencu za profil
TP_ICM_WORKINGPROFILE;Radni profil
+TP_IMPULSEDENOISE_LABEL;Impulsno uklanjanje šuma
+TP_IMPULSEDENOISE_THRESH;Prag
+TP_LENSGEOM_AUTOCROP;Sam iseci
+TP_LENSGEOM_FILL;Sam popuni
+TP_LENSGEOM_LABEL;Objektiv i geometrija
TP_LUMACURVE_BLACKLEVEL;Crna
TP_LUMACURVE_BRIGHTNESS;Osvetljenje
TP_LUMACURVE_COMPRHIGHLIGHTS;Sabijanje svetlog
@@ -513,17 +615,25 @@ TP_LUMACURVE_LABEL;Kriva luminanse
TP_LUMADENOISE_EDGETOLERANCE;Tolerancija ivice
TP_LUMADENOISE_LABEL;Uklanjanje svetlosnog šuma
TP_LUMADENOISE_RADIUS;Poluprečnik
+TP_PERSPECTIVE_HORIZONTAL;Horizontalna
+TP_PERSPECTIVE_LABEL;Perspektiva
+TP_PERSPECTIVE_VERTICAL;Vertikalna
TP_RESIZE_BICUBIC;Bikubično
TP_RESIZE_BICUBICSF;Bikubično (mekše)
TP_RESIZE_BICUBICSH;Bikubično (oštrije)
TP_RESIZE_BILINEAR;Bilinearno
+TP_RESIZE_DOWNSCALEB;Smanjenje razmere (bolje)
+TP_RESIZE_DOWNSCALEF;Smanjenje razmere (brže)
TP_RESIZE_FULLSIZE;Stvarna veličina slike:
TP_RESIZE_H;V:
+TP_RESIZE_HEIGHT;Visinu
TP_RESIZE_LABEL;Veličina slike
TP_RESIZE_METHOD;Način:
TP_RESIZE_NEAREST;Najbliže
-TP_RESIZE_SCALE;Umanjeno
+TP_RESIZE_SCALE;Umanjenje
+TP_RESIZE_SPECIFY;Izaberi:
TP_RESIZE_W;Š:
+TP_RESIZE_WIDTH;Širinu
TP_ROTATE_AUTOCROP;Sam iseci
TP_ROTATE_DEGREE;Stepeni:
TP_ROTATE_FILL;Popuni
@@ -570,8 +680,13 @@ ZOOMBAR_NORMAL;Normalno
ZOOMBAR_PREVIEW;Pregled
ZOOMBAR_SCALE;Umanjeno
ZOOMBAR_SMALL;Malo
-izabranu fasciklu
-# Serbian translation
+ZOOMPANEL_100;(100%)
+ZOOMPANEL_NEWCROPWINDOW;Otvara novi prozor sa detaljima
+ZOOMPANEL_ZOOM100;Povećava pregled na 100% 1
+ZOOMPANEL_ZOOMFITSCREEN;Uklapa sliku u veličinu prozora F
+ZOOMPANEL_ZOOMIN;Uvećava prikaz slike +
+ZOOMPANEL_ZOOMOUT;Umanjuje prikaz slike -
+HISTOGRAM_BUTTON_B;P
!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -579,120 +694,11 @@ izabranu fasciklu
!!!!!!!!!!!!!!!!!!!!!!!!!
-!BATCHQUEUE_AUTOSTART;Auto start
-!BATCH_PROCESSING;batch processing
-!CURVEEDITOR_CUSTOM;Custom
-!CURVEEDITOR_DARKS;Darks
-!CURVEEDITOR_HIGHLIGHTS;Highlights
-!CURVEEDITOR_LIGHTS;Lights
-!CURVEEDITOR_NURBS;Control cage
-!CURVEEDITOR_PARAMETRIC;Parametric
-!CURVEEDITOR_SHADOWS;Shadows
-!CURVEEDITOR_TYPE;Type:
-!EXIFFILTER_ISO;ISO
-!EXIFFILTER_METADATAFILTER;Enable Metadata Filters
-!FILEBROWSER_ADDDELTEMPLATE;Add/Del templates...
-!FILEBROWSER_CURRENT_NAME;Current name:
-!FILEBROWSER_NEW_NAME;New name:
-!FILEBROWSER_SHOWEXIFINFO;Show EXIF info i
-!FILEBROWSER_TOOLTIP_STOPPROCESSING;Start processing automatically when a new job arrives
-!FILEBROWSER_USETEMPLATE;Use template:
-!GENERAL_AFTER;After
-!GENERAL_BEFORE;Before
-!GENERAL_HIGH_QUALITY;High Quality
-!GENERAL_UNCHANGED;(Unchanged)
!HISTOGRAM_BUTTON_B;B
-!HISTOGRAM_BUTTON_G;G
-!HISTOGRAM_BUTTON_L;L
-!HISTOGRAM_BUTTON_R;R
-!HISTOGRAM_LABEL;Histogram
-!HISTORY_MSG_82;Profile Changed
-!HISTORY_MSG_83;High quality shadows/highlights
-!HISTORY_MSG_84;Perspective correction
-!MAIN_BUTTON_EXIT;Exit
-!MAIN_BUTTON_FULLSCREEN;Fullscreen
-!MAIN_BUTTON_PUTTOQUEUE;Put to queue
-!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
-!MAIN_BUTTON_QUEUE;Put to queue
-!MAIN_BUTTON_SAVE_TOOLTIP;Save current image Ctrl+S
-!MAIN_BUTTON_SENDTOEDITOR_TOOLTIP;Edit current image in external editor Ctrl+E
-!MAIN_BUTTON_UNFULLSCREEN;Exit fullscreen
-!MAIN_FRAME_BATCHQUEUE;Batch Queue
-!MAIN_FRAME_FILEBROWSER;File Browser
-!MAIN_FRAME_PLACES;Places
-!MAIN_FRAME_PLACES_ADD;Add
-!MAIN_FRAME_PLACES_DEL;Del
-!MAIN_FRAME_RECENT;Recent Folders
-!MAIN_MSG_ERRORDURINGIMAGESAVING;Error during image saving
-!MAIN_MSG_NAVIGATOR;Navigator
-!MAIN_MSG_PLACES;Places
-!MAIN_TAB_DEVELOP;Develop
-!MAIN_TAB_EXIF;Exif
-!MAIN_TAB_FILTER;Filter
-!MAIN_TAB_ICM;ICM
-!MAIN_TAB_IPTC;IPTC
-!MAIN_TAB_TAGGING;Tagging
-!MAIN_TOGGLE_BEFORE_AFTER;B|A
-!MAIN_TOOLTIP_TOGGLE;Toggle before/after view B
-!NAVIGATOR_B_NA;B = n/a
-!NAVIGATOR_B_VALUE;B = %1
-!NAVIGATOR_G_NA;G = n/a
-!NAVIGATOR_G_VALUE;G = %1
-!NAVIGATOR_H_NA;H = n/a
-!NAVIGATOR_H_VALUE;H = %1
-!NAVIGATOR_R_NA;R = n/a
-!NAVIGATOR_R_VALUE;R = %1
-!NAVIGATOR_S_NA;S = n/a
-!NAVIGATOR_S_VALUE;S = %1
-!NAVIGATOR_V_NA;V = n/a
-!NAVIGATOR_V_VALUE;V = %1
-!NAVIGATOR_XY_NA;x = n/a, y = n/a
-!PREFERENCES_ADD;ADD
-!PREFERENCES_BATCH_PROCESSING;batch processing
-!PREFERENCES_BEHAVIOR;Behavior
-!PREFERENCES_CACORRECTION;Apply CA auto correction
-!PREFERENCES_DCBENHANCE;Apply DCB enhancement step
-!PREFERENCES_DCBITERATIONS;Number of DCB iterations
-!PREFERENCES_GREENEQUIL;Green equilibration
-!PREFERENCES_HOTDEADPIXFILT;Apply hot/dead pixel filter
-!PREFERENCES_LINEDENOISE;Line noise filter
-!PREFERENCES_OVERLAY_FILENAMES;Overlay filenames on thumbnails
-!PREFERENCES_PROPERTY;Property
-!PREFERENCES_SET;SET
-!PROGRESSDLG_PROFILECHANGEDINBROWSER;Profile changed in browser
-!QINFO_ISO;ISO
-!SAVEDLG_AUTOSUFFIX;Automatically add a suffix if the file already exists
-!SAVEDLG_TIFFUNCOMPRESSED;Uncompressed TIFF
-!TP_CROP_X;x
-!TP_CROP_Y;y
-!TP_DETAIL_AMOUNT;Amount
-!TP_DIRPYRDENOISE_CHROMA;Chrominance
-!TP_DIRPYRDENOISE_GAMMA;Gamma
-!TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction
-!TP_DIRPYRDENOISE_LUMA;Luminance
-!TP_EQUALIZER_CONTRAST_MINUS;Contrast-
-!TP_EQUALIZER_CONTRAST_PLUS;Contrast+
-!TP_EQUALIZER_FINEST;finest
-!TP_EQUALIZER_LABEL;Wavelet equalizer
-!TP_EQUALIZER_LARGEST;coarsest
-!TP_EQUALIZER_NEUTRAL;Neutral
-!TP_ICM_LABEL;ICM
-!TP_IMPULSEDENOISE_LABEL;Impulse Noise Reduction
-!TP_IMPULSEDENOISE_THRESH;Threshold
-!TP_LENSGEOM_AUTOCROP;Auto Crop
-!TP_LENSGEOM_FILL;Auto Fill
-!TP_LENSGEOM_LABEL;Lens / Geometry
-!TP_PERSPECTIVE_HORIZONTAL;Horizontal
-!TP_PERSPECTIVE_LABEL;Perspective
-!TP_PERSPECTIVE_VERTICAL;Vertical
-!TP_RESIZE_DOWNSCALEB;Downscale (Better)
-!TP_RESIZE_DOWNSCALEF;Downscale (Faster)
-!TP_RESIZE_HEIGHT;Height
-!TP_RESIZE_SPECIFY;Specify:
-!TP_RESIZE_WIDTH;Width
-!ZOOMPANEL_100;(100%)
-!ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window
-!ZOOMPANEL_ZOOM100;Zoom to 100% 1
-!ZOOMPANEL_ZOOMFITSCREEN;Fit to screen F
-!ZOOMPANEL_ZOOMIN;Zoom In +
-!ZOOMPANEL_ZOOMOUT;Zoom Out -
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
diff --git a/rtdata/languages/Slovak b/rtdata/languages/Slovak
index 0f3202638..32e63978f 100644
--- a/rtdata/languages/Slovak
+++ b/rtdata/languages/Slovak
@@ -627,6 +627,13 @@ ZOOMBAR_SMALL;Malý
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Suomi b/rtdata/languages/Suomi
index e0347db6f..914592b0b 100644
--- a/rtdata/languages/Suomi
+++ b/rtdata/languages/Suomi
@@ -627,6 +627,13 @@ ZOOMBAR_SMALL;Pieni
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish
index 21c1e1b2e..a40b41d80 100644
--- a/rtdata/languages/Swedish
+++ b/rtdata/languages/Swedish
@@ -627,6 +627,13 @@ ZOOMBAR_SMALL;Liten
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/Turkish b/rtdata/languages/Turkish
index ed27e201e..e9c6de3c6 100644
--- a/rtdata/languages/Turkish
+++ b/rtdata/languages/Turkish
@@ -627,6 +627,13 @@ ZOOMBAR_SMALL;Küçük
!HISTORY_MSG_82;Profile Changed
!HISTORY_MSG_83;High quality shadows/highlights
!HISTORY_MSG_84;Perspective correction
+!HISTORY_MSG_85;Wavelet coefficients
+!HISTORY_MSG_86;Wavelet equalizer
+!HISTORY_MSG_87;Impulse noise reduction
+!HISTORY_MSG_89;Directional pyramid
+!HISTORY_MSG_90;Directional pyramid luminance
+!HISTORY_MSG_91;Directional pyramid chominance
+!HISTORY_MSG_92;Directional pyramid gamma
!MAIN_BUTTON_FULLSCREEN;Fullscreen
!MAIN_BUTTON_PUTTOQUEUE;Put to queue
!MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Add current image to processing queue Ctrl+Q
diff --git a/rtdata/languages/default b/rtdata/languages/default
index 7caa288ae..a2acbba04 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -212,7 +212,14 @@ HISTORY_MSG_81;Resize enabled
HISTORY_MSG_82;Profile Changed
HISTORY_MSG_83;High quality shadows/highlights
HISTORY_MSG_84;Perspective correction
+HISTORY_MSG_85;Wavelet coefficients
+HISTORY_MSG_86;Wavelet equalizer
+HISTORY_MSG_87;Impulse noise reduction
+HISTORY_MSG_89;Directional pyramid
HISTORY_MSG_8;Exposure Compensation
+HISTORY_MSG_90;Directional pyramid luminance
+HISTORY_MSG_91;Directional pyramid chominance
+HISTORY_MSG_92;Directional pyramid gamma
HISTORY_MSG_9;Highlight Compression
HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOTAS;As...
@@ -561,8 +568,15 @@ TP_CROP_Y;y
TP_DETAIL_AMOUNT;Amount
TP_DIRPYRDENOISE_CHROMA;Chrominance
TP_DIRPYRDENOISE_GAMMA;Gamma
-TP_DIRPYRDENOISE_LABEL;Directional Pyramid Noise Reduction
+TP_DIRPYRDENOISE_LABEL;Directional pyramid noise reduction
TP_DIRPYRDENOISE_LUMA;Luminance
+TP_DIRPYREQUALIZER_LUMACOARSEST;Coarsest
+TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS;Contrast-
+TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS;Contrast+
+TP_DIRPYREQUALIZER_LUMAFINEST;Finest
+TP_DIRPYREQUALIZER_LUMANEUTRAL;Neutral
+TP_DIRPYREQUALIZER_LABEL;Directional pyramid equalizer
+TP_DIRPYREQUALIZER_THRESHOLD;Threshold
TP_DISTORTION_AMOUNT;Amount
TP_DISTORTION_LABEL;Distortion
TP_EQUALIZER_CONTRAST_MINUS;Contrast-
diff --git a/rtengine/CA_correct_RT.cc b/rtengine/CA_correct_RT.cc
index 81fcf13cb..bcd6ebfb9 100644
--- a/rtengine/CA_correct_RT.cc
+++ b/rtengine/CA_correct_RT.cc
@@ -105,10 +105,7 @@ void RawImageSource::CA_correct_RT() {
#define PIX_SORT(a,b) { if ((a)>(b)) {temp=(a);(a)=(b);(b)=temp;} }
#define SQR(x) ((x)*(x))
-
- /*static const float pre_mul[3] = {MIN(ri->red_multiplier,ri->green_multiplier), ri->green_multiplier, \
- MIN(ri->blue_multiplier,ri->green_multiplier)};*/
-
+
const float clip_pt = ri->defgain;
// local variables
@@ -230,14 +227,16 @@ void RawImageSource::CA_correct_RT() {
memset(buffer1,0,vblsz*hblsz*3*2*sizeof(float));
// block CA shifts
blockshifts = (float (*)[3][2]) buffer1;*/
-
-
-
+
+ int vctr=0, hctr=0;
// Main algorithm: Tile loop
//#pragma omp parallel for shared(image,height,width) private(top,left,indx,indx1) schedule(dynamic)
- for (top=-border, vblock=1; top < height; top += TS-border2, vblock++)
+ for (top=-border, vblock=1; top < height; top += TS-border2, vblock++) {
+ hctr=0;
+ vctr++;
for (left=-border, hblock=1; left < width; left += TS-border2, hblock++) {
+ hctr++;
int bottom = MIN( top+TS,height+border);
int right = MIN(left+TS, width+border);
int rr1 = bottom - top;
@@ -387,6 +386,8 @@ void RawImageSource::CA_correct_RT() {
grblpfh[indx] = glpfh + 0.25*(2*rgb[indx][c]+rgb[indx+2][c]+rgb[indx-2][c]);
}
+ for (c=0;c<3;c++) {areawt[0][c]=areawt[1][c]=0;}
+
// along line segments, find the point along each segment that minimizes the color variance
// averaged over the tile; evaluate for up/down and left/right away from R/B grid point
for (rr=8; rr < rr1-8; rr++)
@@ -394,8 +395,6 @@ void RawImageSource::CA_correct_RT() {
if (rgb[indx][c]>0.8*clip_pt || Gtmp[indx]>0.8*clip_pt) continue;
- areawt[0][c]=areawt[1][c]=0;
-
//in linear interpolation, color differences are a quadratic function of interpolation position;
//solve for the interpolation position that minimizes color difference variance over the tile
@@ -404,24 +403,24 @@ void RawImageSource::CA_correct_RT() {
deltgrb=(rgb[indx][c]-rgb[indx][1])-0.5*((rgb[indx-v4][c]-rgb[indx-v4][1])+(rgb[indx+v4][c]-rgb[indx+v4][1]));
gradwt=fabs(0.25*rbhpfv[indx]+0.125*(rbhpfv[indx+2]+rbhpfv[indx-2]) );//*(grblpfv[indx-v2]+grblpfv[indx+v2])/(eps+0.1*grblpfv[indx-v2]+rblpfv[indx-v2]+0.1*grblpfv[indx+v2]+rblpfv[indx+v2]);
-
+ if (gradwt>eps) {
coeff[0][0][c] += gradwt*deltgrb*deltgrb;
coeff[0][1][c] += gradwt*gdiff*deltgrb;
coeff[0][2][c] += gradwt*gdiff*gdiff;
- areawt[0][c]+=1;
-
+ areawt[0][c]++;
+ }
//horizontal
gdiff=0.3125*(rgb[indx+1][1]-rgb[indx-1][1])+0.09375*(rgb[indx+1+TS][1]-rgb[indx-1+TS][1]+rgb[indx+1-TS][1]-rgb[indx-1-TS][1]);
deltgrb=(rgb[indx][c]-rgb[indx][1])-0.5*((rgb[indx-4][c]-rgb[indx-4][1])+(rgb[indx+4][c]-rgb[indx+4][1]));
gradwt=fabs(0.25*rbhpfh[indx]+0.125*(rbhpfh[indx+v2]+rbhpfh[indx-v2]) );//*(grblpfh[indx-2]+grblpfh[indx+2])/(eps+0.1*grblpfh[indx-2]+rblpfh[indx-2]+0.1*grblpfh[indx+2]+rblpfh[indx+2]);
-
+ if (gradwt>eps) {
coeff[1][0][c] += gradwt*deltgrb*deltgrb;
coeff[1][1][c] += gradwt*gdiff*deltgrb;
coeff[1][2][c] += gradwt*gdiff*gdiff;
- areawt[1][c]+=1;
-
+ areawt[1][c]++;
+ }
// In Mathematica,
// f[x_]=Expand[Total[Flatten[
@@ -430,8 +429,8 @@ void RawImageSource::CA_correct_RT() {
}
for (c=0; c<3; c+=2){
for (j=0; j<2; j++) {// vert/hor
-
- if (areawt[j][c]>0) {
+ //printf("hblock %d vblock %d j %d c %d areawt %d \n",hblock,vblock,j,c,areawt[j][c]);
+ if (areawt[j][c]>500) {
CAshift[j][c]=coeff[j][1][c]/coeff[j][2][c];
blockwt[vblock*hblsz+hblock]= areawt[j][c];//*coeff[j][2][c]/(eps+coeff[j][0][c]) ;
} else {
@@ -478,6 +477,7 @@ void RawImageSource::CA_correct_RT() {
if(plistener) plistener->setProgress(0.5*fabs((float)top/height));
}
+ }
//end of diagnostic pass
for (j=0; j<2; j++)
@@ -551,14 +551,15 @@ void RawImageSource::CA_correct_RT() {
if (SQR(blockshifts[(vblock)*hblsz+hblock][c][0])>4.0*blockvar[0][c] || SQR(blockshifts[(vblock)*hblsz+hblock][c][1])>4.0*blockvar[1][c]) continue;
numblox[c] += 1;
for (dir=0; dir<2; dir++) {
- for (i=0; iclip_pt || Gtmp[indx]>clip_pt) continue;
grbdiffold = rgb[indx][1]-rgb[indx][c];
-
+
//interpolate color difference from optical R/B locations to grid locations
grbdiffinthfloor=(1-shifthfrac[c]/2)*grbdiff[indx]+(shifthfrac[c]/2)*grbdiff[indx-2*GRBdir[1][c]];
grbdiffinthceil=(1-shifthfrac[c]/2)*grbdiff[(rr-2*GRBdir[0][c])*TS+cc]+(shifthfrac[c]/2)*grbdiff[(rr-2*GRBdir[0][c])*TS+cc-2*GRBdir[1][c]];
diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt
index 299cf9ed3..638b21613 100644
--- a/rtengine/CMakeLists.txt
+++ b/rtengine/CMakeLists.txt
@@ -13,7 +13,7 @@ set (RTENGINESOURCEFILES colortemp.cc curves.cc dcraw.cc iccstore.cc
stdimagesource.cc myfile.cc iccjpeg.c hlmultipliers.cc improccoordinator.cc
processingjob.cc rtthumbnail.cc utils.cc labimage.cc
iplab2rgb.cc ipsharpen.cc iptransform.cc ipresize.cc
- wavelet_dec.cc ipequalizer.cc dirpyrLab_denoise.cc )
+ wavelet_dec.cc ipequalizer.cc dirpyrLab_denoise.cc dirpyrLab_equalizer.cc dirpyr_equalizer.cc)
add_library (rtengine ${RTENGINESOURCEFILES})
#It may be nice to store library version too
diff --git a/rtengine/amaze_interpolate_RT.cc b/rtengine/amaze_interpolate_RT.cc
index d3ce7a1aa..073543e91 100644
--- a/rtengine/amaze_interpolate_RT.cc
+++ b/rtengine/amaze_interpolate_RT.cc
@@ -51,7 +51,7 @@ void RawImageSource::amaze_demosaic_RT() {
}
- static const float clip_pt = 1/ri->defgain;
+ const float clip_pt = 1/ri->defgain;
#define TS 512 // Tile size; the image is processed in square tiles to lower memory requirements and facilitate multi-threading
diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc
index 09fe0ce40..e5b732581 100644
--- a/rtengine/dcraw.cc
+++ b/rtengine/dcraw.cc
@@ -6099,7 +6099,7 @@ void CLASS adobe_coeff (const char *make, const char *model)
{ "Canon EOS", 0, 0,
{ 8197,-2000,-1118,-6714,14335,2592,-2536,3178,8266 } },
{ "Canon PowerShot A530", 0, 0,
- { 0 } }, /* don't want the A5 matrix */
+ { 0 } }, /* don't want the A5 matrix */
{ "Canon PowerShot A50", 0, 0,
{ -5300,9846,1776,3436,684,3939,-5540,9879,6200,-1404,11175,217 } },
{ "Canon PowerShot A5", 0, 0,
@@ -8937,7 +8937,7 @@ dcrMutex->lock ();
ifname = fname;//strdup (fname);
image = NULL;
-
+
exif_base = -1;
ciff_base = -1;
ciff_len = -1;
@@ -8973,13 +8973,6 @@ dcrMutex->lock ();
image = (UshORt (*)[4])calloc (height*width*sizeof *image + meta_length, 1);
meta_data = (char *) (image + height*width);
- if(!image)
- {
- fclose(ifp);
- dcrMutex->unlock ();
- return 3;
- }
-
if (setjmp (failure)) {
if (image)
free (image);
@@ -9019,23 +9012,23 @@ dcrMutex->lock ();
if (filters) {
ri->allocation = (short unsigned int*)calloc(height*width, sizeof(unsigned short));
ri->data = (unsigned short**)calloc(height, sizeof(unsigned short*));
- for (int i=0; idata[i] = ri->allocation + i*width;
- for (int row = 0; row < height; row++)
- for (int col = 0; col < width; col++)
+ for (int row = 0; row < height; row++)
+ for (int col = 0; col < width; col++)
if (ISGREEN(ri,row,col))
ri->data[row][col] = image[row*width+col][1];
else if (ISRED(ri,row,col))
ri->data[row][col] = image[row*width+col][0];
- else
+ else
ri->data[row][col] = image[row*width+col][2];
}
else {
ri->allocation = (short unsigned int*)calloc(3*height*width, sizeof(unsigned short));
ri->data = (unsigned short**)calloc(height, sizeof(unsigned short*));
- for (int i=0; idata[i] = ri->allocation + 3*i*width;
- for (int row = 0; row < height; row++)
+ for (int row = 0; row < height; row++)
for (int col = 0; col < width; col++) {
ri->data[row][3*col+0] = image[row*width+col][0];
ri->data[row][3*col+1] = image[row*width+col][1];
@@ -9086,7 +9079,7 @@ dcrMutex->lock ();
exif_base = -1;
ciff_base = -1;
ciff_len = -1;
-
+
half_size = 1;
bright = 1.0;
verbose = settings->verbose;
@@ -9172,8 +9165,8 @@ t1.set ();
fclose (ifp);
dcrMutex->unlock ();
return NULL;
- }
-
+ }
+
use_camera_wb = 0;
highlight = 1;
half_size = 0;
@@ -9187,7 +9180,7 @@ t1.set ();
}
t2.set();
-
+
iheight = ::height;
iwidth = ::width;
@@ -9200,7 +9193,7 @@ t2.set();
if (zero_is_bad) remove_zeroes();
rtengine::Thumbnail* tpp = new rtengine::Thumbnail;
-
+
tpp->isRaw = true;
tpp->embProfileLength = 0;
if (profile_length) {
@@ -9214,12 +9207,12 @@ t2.set();
tpp->embProfile = NULL;
tpp->embProfileData = NULL;
}
-
+
fclose(ifp);
tpp->redMultiplier = pre_mul[0];
tpp->greenMultiplier = pre_mul[1];
tpp->blueMultiplier = pre_mul[2];
-
+
t3.set ();
scale_colors();
@@ -9228,13 +9221,13 @@ t3.set ();
unsigned filter = filters;
int firstgreen = 1;
// locate first green location in the first row
- while (!FISGREEN(filter,1,firstgreen))
+ while (!FISGREEN(filter,1,firstgreen))
firstgreen++;
int skip = 1;
if (fixwh==1) // fix height, scale width
skip = (::height-firstgreen-1) / h;
- else
+ else
skip = (::width-firstgreen-1) / w;
if (skip%2)
skip--;
@@ -9244,7 +9237,7 @@ t3.set ();
int hskip = skip, vskip = skip;
if (!strcmp (model, "D1X"))
hskip *=2;
-
+
rml.exifBase = exif_base;
rml.ciffBase = ciff_base;
rml.ciffLength = ciff_len;
@@ -9252,7 +9245,7 @@ t3.set ();
tpp->camwbGreen = tpp->greenMultiplier / pre_mul[1];
tpp->camwbBlue = tpp->blueMultiplier / pre_mul[2];
- tpp->defGain = 1.0 / MIN(MIN(pre_mul[0],pre_mul[1]),pre_mul[2]);
+ tpp->defGain = 1.0 / MIN(MIN(pre_mul[0],pre_mul[1]),pre_mul[2]);
tpp->gammaCorrected = true;
int ix = 0;
@@ -9279,7 +9272,7 @@ t3.set ();
tmpImg->g[y][x] = g;
tmpImg->b[y][x] = b;
}
- }
+ }
}
else {
for (int row=1, y=0; row< ::height-1 && yg[y][x] = image[ofs][1];
tmpImg->b[y][x] = image[ofs][2];
}
- }
+ }
}
-
+
if (fuji_width) {
int fw = fuji_width / hskip;
double step = sqrt(0.5);
@@ -9305,7 +9298,7 @@ t3.set ();
for (int col=0; col < wide; col++) {
unsigned ur = r = fw + (row-col)*step;
unsigned uc = c = (row+col)*step;
- if (ur > tmph-2 || uc > tmpw-2)
+ if (ur > tmph-2 || uc > tmpw-2)
continue;
double fr = r - ur;
double fc = c - uc;
@@ -9318,22 +9311,22 @@ t3.set ();
delete tmpImg;
tmpImg = fImg;
}
-
-
+
+
if (fixwh==1) // fix height, scale width
w = tmpw * h / tmph;
else
h = tmph * w / tmpw;
-
+
tpp->thumbImg = tmpImg->resize (w, h, TI_Bilinear);
delete tmpImg;
if (fuji_width)
tpp->scale = (double)(::height - fuji_width) / sqrt(0.5) / h;
else
- tpp->scale = (double)::height / h;
-
-t4.set ();
+ tpp->scale = (double)::height / h;
+
+t4.set ();
// generate histogram for auto exposure
tpp->aeHistCompression = 3;
@@ -9355,7 +9348,7 @@ t4.set ();
start = 8;
end = ::width-8;
}
- for (int j=start; jaeHistogram[image[i* ::width+j][1]>>tpp->aeHistCompression]+=gadd;
else if (FISRED(filter,i,j))
@@ -9363,7 +9356,7 @@ t4.set ();
else if (FISBLUE(filter,i,j))
tpp->aeHistogram[image[i* ::width+j][2]>>tpp->aeHistCompression]+=badd;
}
-
+
t5.set ();
// generate autoWB
@@ -9383,35 +9376,35 @@ t5.set ();
start = 32;
end = ::width-32;
}
- for (int j=start; jdefGain * image[i* ::width+j][1];
if (d>64000)
continue;
- avg_g += d*d*d*d*d*d;
+ avg_g += d;
gn++;
}
if (FISRED(filter,i,j)) {
double d = tpp->defGain * image[i* ::width+j][0];
if (d>64000)
continue;
- avg_r += d*d*d*d*d*d;
+ avg_r += d;
rn++;
}
if (FISBLUE(filter,i,j)) {
double d = tpp->defGain * image[i* ::width+j][2];
if (d>64000)
continue;
- avg_b += d*d*d*d*d*d;
+ avg_b += d;
bn++;
}
}
}
- double reds = pow (avg_r/rn, 1.0/6.0) * tpp->camwbRed;
- double greens = pow (avg_g/gn, 1.0/6.0) * tpp->camwbGreen;
- double blues = pow (avg_b/bn, 1.0/6.0) * tpp->camwbBlue;
-
+ double reds = avg_r/rn * tpp->camwbRed;
+ double greens = avg_g/gn * tpp->camwbGreen;
+ double blues = avg_b/bn * tpp->camwbBlue;
+
double rm = rgb_cam[0][0]*reds + rgb_cam[0][1]*greens + rgb_cam[0][2]*blues;
double gm = rgb_cam[1][0]*reds + rgb_cam[1][1]*greens + rgb_cam[1][2]*blues;
double bm = rgb_cam[2][0]*reds + rgb_cam[2][1]*greens + rgb_cam[2][2]*blues;
@@ -9420,7 +9413,7 @@ t5.set ();
t6.set ();
-if (settings->verbose) printf ("0: %d, 1: %d, 2: %d, 3: %d, 4: %d, 5: %d All: %d\n", t1.etime(t0), t2.etime(t1), t3.etime(t2), t4.etime(t3), t5.etime(t4), t6.etime(t5), t6.etime(t0));
+if (settings->verbose) printf ("0: %d, 1: %d, 2: %d, 3: %d, 4: %d, 5: %d All: %d\n", t1.etime(t0), t2.etime(t1), t3.etime(t2), t4.etime(t3), t5.etime(t4), t6.etime(t5), t6.etime(t0));
int deg = 0;
if (flip==5)
@@ -9441,7 +9434,7 @@ if (settings->verbose) printf ("0: %d, 1: %d, 2: %d, 3: %d, 4: %d, 5: %d All: %d
tpp->colorMatrix[a][b] = rgb_cam[a][b];
tpp->init ();
-
+
free (image);
dcrMutex->unlock ();
diff --git a/rtengine/dcraw.patch b/rtengine/dcraw.patch
index e00393219..826580dff 100644
--- a/rtengine/dcraw.patch
+++ b/rtengine/dcraw.patch
@@ -661,29 +661,29 @@
+ double d = tpp->defGain * image[i* ::width+j][1];
+ if (d>64000)
+ continue;
-+ avg_g += d*d*d*d*d*d;
++ avg_g += d;
+ gn++;
+ }
+ if (FISRED(filter,i,j)) {
+ double d = tpp->defGain * image[i* ::width+j][0];
+ if (d>64000)
+ continue;
-+ avg_r += d*d*d*d*d*d;
++ avg_r += d;
+ rn++;
+ }
+ if (FISBLUE(filter,i,j)) {
+ double d = tpp->defGain * image[i* ::width+j][2];
+ if (d>64000)
+ continue;
-+ avg_b += d*d*d*d*d*d;
++ avg_b += d;
+ bn++;
+ }
+ }
+ }
+
-+ double reds = pow (avg_r/rn, 1.0/6.0) * tpp->camwbRed;
-+ double greens = pow (avg_g/gn, 1.0/6.0) * tpp->camwbGreen;
-+ double blues = pow (avg_b/bn, 1.0/6.0) * tpp->camwbBlue;
++ double reds = avg_r/rn * tpp->camwbRed;
++ double greens = avg_g/gn * tpp->camwbGreen;
++ double blues = avg_b/bn * tpp->camwbBlue;
+
+ double rm = rgb_cam[0][0]*reds + rgb_cam[0][1]*greens + rgb_cam[0][2]*blues;
+ double gm = rgb_cam[1][0]*reds + rgb_cam[1][1]*greens + rgb_cam[1][2]*blues;
diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc
index 4d29a82d0..a0462594d 100644
--- a/rtengine/dcrop.cc
+++ b/rtengine/dcrop.cc
@@ -159,29 +159,7 @@ void Crop::update (int todo, bool internal) {
// shadows & highlights & tone curve & convert to cielab
if (todo & M_RGBCURVE)
parent->ipf.rgbProc (baseCrop, laboCrop, parent->tonecurve, cshmap);
-/*
- // apply luminance operations
- if (todo & M_LUMINANCE) {
- parent->ipf.luminanceCurve (laboCrop, labnCrop, parent->lumacurve, 0, croph);
- if (skip==1) {
- parent->ipf.impulsedenoise (labnCrop);
- parent->ipf.lumadenoise (labnCrop, cbuffer);
- //parent->ipf.sharpening (labnCrop, (unsigned short**)cbuffer);
- parent->ipf.waveletEqualizer(labnCrop, true, false);
- }
- }
- // apply color operations
- if (todo & M_COLOR) {
- parent->ipf.colorCurve (laboCrop, labnCrop);
- if (skip==1) {
- parent->ipf.colordenoise (labnCrop, cbuffer);
- parent->ipf.dirpyrdenoise (labnCrop);
- parent->ipf.sharpening (labnCrop, (unsigned short**)cbuffer);
- parent->ipf.waveletEqualizer(labnCrop, false, true);
- }
- }
-*/
// apply luminance operations
if (todo & (M_LUMINANCE+M_COLOR)) {
@@ -195,8 +173,8 @@ void Crop::update (int todo, bool internal) {
parent->ipf.dirpyrdenoise (labnCrop);
parent->ipf.sharpening (labnCrop, (unsigned short**)cbuffer);
//parent->ipf.impulsedenoise (labnCrop);
+ parent->ipf.dirpyrequalizer (labnCrop);
parent->ipf.waveletEqualizer(labnCrop, true, true);
- //parent->ipf.waveletEqualizer(labnCrop, false, true);
}
}
diff --git a/rtengine/dirpyrLab_denoise.cc b/rtengine/dirpyrLab_denoise.cc
index d63d35d24..7d9efdb17 100644
--- a/rtengine/dirpyrLab_denoise.cc
+++ b/rtengine/dirpyrLab_denoise.cc
@@ -269,9 +269,7 @@ namespace rtengine {
int width = data_fine->W;
int height = data_fine->H;
- float dirwt_l, dirwt_ab, norm_l, norm_ab;
- //float lops,aops,bops;
- float Lout, aout, bout;
+
//generate domain kernel
@@ -286,7 +284,11 @@ namespace rtengine {
}*/
//float domker[5][5] = {{1,1,1,1,1},{1,2,2,2,1},{1,2,4,2,1},{1,2,2,2,1},{1,1,1,1,1}};
- for(int i = 0, i1=0; i < height; i+=pitch, i1++) {
+#ifdef _OPENMP
+#pragma omp parallel for
+#endif
+
+ for(int i = 0; i < height; i+=pitch ) { int i1=i/pitch;
for(int j = 0, j1=0; j < width; j+=pitch, j1++)
{
//norm = DIRWT(i, j, i, j);
@@ -294,6 +296,9 @@ namespace rtengine {
//aout = -norm*data_fine->a[i][j];
//bout = -norm*data_fine->b[i][j];
//or
+ float dirwt_l, dirwt_ab, norm_l, norm_ab;
+ //float lops,aops,bops;
+ float Lout, aout, bout;
norm_l = norm_ab = 0;//if we do want to include the input pixel in the sum
Lout = 0;
aout = 0;
@@ -339,9 +344,6 @@ namespace rtengine {
int height = data_fine->H;
//float eps = 0.0;
- double wtdsum[3], norm;
- float hipass[3], hpffluct[3], tonefactor, nrfactor;
- int i1, j1;
// c[0] noise_L
// c[1] noise_ab (relative to noise_L)
@@ -366,9 +368,7 @@ namespace rtengine {
}*/
//float domker[5][5] = {{1,1,1,1,1},{1,2,2,2,1},{1,2,4,2,1},{1,2,2,2,1},{1,1,1,1,1}};
- LabImage* smooth;
- smooth = new LabImage(width, height);
// for coarsest level, take non-subsampled lopass image and subtract from lopass_fine to generate hipass image
@@ -386,28 +386,81 @@ namespace rtengine {
// step (1)
-
- for(int i = 0, i1=0; i < height; i+=pitch, i1++)
- for(int j = 0, j1=0; j < width; j+=pitch, j1++) {
-
- //copy common pixels
- smooth->L[i][j] = data_coarse->L[i1][j1];
- smooth->a[i][j] = data_coarse->a[i1][j1];
- smooth->b[i][j] = data_coarse->b[i1][j1];
- }
-
- if (pitch>1) {//pitch=2; expand coarse image, fill in missing data
+ if (pitch==1) {
- for(int i = 0; i < height-1; i+=2)
+ // step (1-2-3-4)
+#ifdef _OPENMP
+#pragma omp parallel for
+#endif
+ for(int i = 0; i < height; i++)
+ for(int j = 0; j < width; j++) {
+ double wtdsum[3], norm;
+ float hipass[3], hpffluct[3], tonefactor, nrfactor;
+
+ tonefactor = ((NRWT_L(data_coarse->L[i][j])));
+
+ //Wiener filter
+ //luma
+ if (level<2) {
+ hipass[0] = data_fine->L[i][j]-data_coarse->L[i][j];
+ hpffluct[0]=SQR(hipass[0])+0.001;
+ hipass[0] *= hpffluct[0]/(hpffluct[0]+noisevar_L);
+ data_fine->L[i][j] = CLIP(hipass[0]+data_coarse->L[i][j]);
+ }
+
+ //chroma
+ hipass[1] = data_fine->a[i][j]-data_coarse->a[i][j];
+ hipass[2] = data_fine->b[i][j]-data_coarse->b[i][j];
+ hpffluct[1]=SQR(hipass[1]*tonefactor)+0.001;
+ hpffluct[2]=SQR(hipass[2]*tonefactor)+0.001;
+ nrfactor = (hpffluct[1]+hpffluct[2]) /((hpffluct[1]+hpffluct[2]) + noisevar_ab * NRWT_AB);
+
+ hipass[1] *= nrfactor;
+ hipass[2] *= nrfactor;
+
+ data_fine->a[i][j] = hipass[1]+data_coarse->a[i][j];
+ data_fine->b[i][j] = hipass[2]+data_coarse->b[i][j];
+ }
+
+ } else {
+
+ LabImage* smooth;
+
+ smooth = new LabImage(width, height);
+#ifdef _OPENMP
+#pragma omp parallel
+#endif
+
+{
+
+#ifdef _OPENMP
+#pragma omp for
+#endif
+ for(int i = 0; i < height; i+=pitch)
+ {
+ int ix=i/pitch;
+ for(int j = 0, jx=0; j < width; j+=pitch, jx++) {
+
+ //copy common pixels
+ smooth->L[i][j] = data_coarse->L[ix][jx];
+ smooth->a[i][j] = data_coarse->a[ix][jx];
+ smooth->b[i][j] = data_coarse->b[ix][jx];
+ }
+ }
+ //if (pitch>1) {//pitch=2; step (1) expand coarse image, fill in missing data
+#ifdef _OPENMP
+#pragma omp for
+#endif
+ for(int i = 0; i < height-1; i+=2)
for(int j = 0; j < width-1; j+=2) {
//do midpoint first
- norm=0;
- wtdsum[0]=wtdsum[1]=wtdsum[2]=0.0;
- for(i1=i; i1L[i1][j1];
- wtdsum[1] += smooth->a[i1][j1];
- wtdsum[2] += smooth->b[i1][j1];
+ double norm=0.0,wtdsum[3]={0.0,0.0,0.0};
+ //wtdsum[0]=wtdsum[1]=wtdsum[2]=0.0;
+ for(int ix=i; ixL[ix][jx];
+ wtdsum[1] += smooth->a[ix][jx];
+ wtdsum[2] += smooth->b[ix][jx];
norm++;
}
norm = 1/norm;
@@ -415,23 +468,26 @@ namespace rtengine {
smooth->a[i+1][j+1]=wtdsum[1]*norm;
smooth->b[i+1][j+1]=wtdsum[2]*norm;
}
+#ifdef _OPENMP
+#pragma omp for
+#endif
for(int i = 0; i < height-1; i+=2)
for(int j = 0; j < width-1; j+=2) {
//now right neighbor
if (j+1==width) continue;
- norm=0;
- wtdsum[0]=wtdsum[1]=wtdsum[2]=0.0;
- for (j1=j; j1L[i][j1];
- wtdsum[1] += smooth->a[i][j1];
- wtdsum[2] += smooth->b[i][j1];
+ double norm=0.0,wtdsum[3]={0.0,0.0,0.0};
+
+ for (int jx=j; jxL[i][jx];
+ wtdsum[1] += smooth->a[i][jx];
+ wtdsum[2] += smooth->b[i][jx];
norm++;
}
- for (i1=MAX(0,i-1); i1L[i1][j+1];
- wtdsum[1] += smooth->a[i1][j+1];
- wtdsum[2] += smooth->b[i1][j+1];
+ for (int ix=MAX(0,i-1); ixL[ix][j+1];
+ wtdsum[1] += smooth->a[ix][j+1];
+ wtdsum[2] += smooth->b[ix][j+1];
norm++;
}
norm = 1/norm;
@@ -441,18 +497,17 @@ namespace rtengine {
//now down neighbor
if (i+1==height) continue;
- norm=0;
- wtdsum[0]=wtdsum[1]=wtdsum[2]=0.0;
- for (i1=i; i1L[i1][j];
- wtdsum[1] += smooth->a[i1][j];
- wtdsum[2] += smooth->b[i1][j];
+ norm=0.0;wtdsum[0]=wtdsum[1]=wtdsum[2]=0.0;
+ for (int ix=i; ixL[ix][j];
+ wtdsum[1] += smooth->a[ix][j];
+ wtdsum[2] += smooth->b[ix][j];
norm++;
}
- for (j1=j-1; j1L[i+1][j1];
- wtdsum[1] += smooth->a[i+1][j1];
- wtdsum[2] += smooth->b[i+1][j1];
+ for (int jx=MAX(0,j-1); jxL[i+1][jx];
+ wtdsum[1] += smooth->a[i+1][jx];
+ wtdsum[2] += smooth->b[i+1][jx];
norm++;
}
norm=1/norm;
@@ -461,42 +516,44 @@ namespace rtengine {
smooth->b[i+1][j]=wtdsum[2]*norm;
}
- }
+
+#ifdef _OPENMP
+#pragma omp for
+#endif
- // step (2-3-4)
- for(int i = 0; i < height; i++)
- for(int j = 0; j < width; j++) {
-
- tonefactor = ((NRWT_L(smooth->L[i][j])));
-
- //Wiener filter
- //luma
- if (level<2) {
- hipass[0] = data_fine->L[i][j]-smooth->L[i][j];
- hpffluct[0]=SQR(hipass[0])+0.001;
- hipass[0] *= hpffluct[0]/(hpffluct[0]+noisevar_L);
- data_fine->L[i][j] = CLIP(hipass[0]+smooth->L[i][j]);
+ // step (2-3-4)
+ for( int i = 0; i < height; i++)
+ for(int j = 0; j < width; j++) {
+
+ double tonefactor = ((NRWT_L(smooth->L[i][j])));
+ //double wtdsum[3], norm;
+ float hipass[3], hpffluct[3], nrfactor;
+ //Wiener filter
+ //luma
+ if (level<2) {
+ hipass[0] = data_fine->L[i][j]-smooth->L[i][j];
+ hpffluct[0]=SQR(hipass[0])+0.001;
+ hipass[0] *= hpffluct[0]/(hpffluct[0]+noisevar_L);
+ data_fine->L[i][j] = CLIP(hipass[0]+smooth->L[i][j]);
+ }
+
+ //chroma
+ hipass[1] = data_fine->a[i][j]-smooth->a[i][j];
+ hipass[2] = data_fine->b[i][j]-smooth->b[i][j];
+ hpffluct[1]=SQR(hipass[1]*tonefactor)+0.001;
+ hpffluct[2]=SQR(hipass[2]*tonefactor)+0.001;
+ nrfactor = (hpffluct[1]+hpffluct[2]) /((hpffluct[1]+hpffluct[2]) + noisevar_ab * NRWT_AB);
+
+ hipass[1] *= nrfactor;
+ hipass[2] *= nrfactor;
+
+ data_fine->a[i][j] = hipass[1]+smooth->a[i][j];
+ data_fine->b[i][j] = hipass[2]+smooth->b[i][j];
}
-
- //chroma
- hipass[1] = data_fine->a[i][j]-smooth->a[i][j];
- hipass[2] = data_fine->b[i][j]-smooth->b[i][j];
- hpffluct[1]=SQR(hipass[1]*tonefactor)+0.001;
- hpffluct[2]=SQR(hipass[2]*tonefactor)+0.001;
- nrfactor = (hpffluct[1]+hpffluct[2]) /((hpffluct[1]+hpffluct[2]) + noisevar_ab * NRWT_AB);
- //nrfactor *= resaturate;
- /*if (level) {
- hipass[0] *= recontrast;
- nrfactor *= resaturate;
- }*/
- hipass[1] *= nrfactor;
- hipass[2] *= nrfactor;
-
- data_fine->a[i][j] = hipass[1]+smooth->a[i][j];
- data_fine->b[i][j] = hipass[2]+smooth->b[i][j];
- }
+} // end parallel
+ delete smooth;
+ }//end of pitch>1
- delete smooth;
};
diff --git a/rtengine/dirpyrLab_equalizer.cc b/rtengine/dirpyrLab_equalizer.cc
new file mode 100644
index 000000000..03828fa1d
--- /dev/null
+++ b/rtengine/dirpyrLab_equalizer.cc
@@ -0,0 +1,559 @@
+/*
+ * This file is part of RawTherapee.
+ *
+ * RawTherapee is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * RawTherapee is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with RawTherapee. If not, see .
+ *
+ * © 2010 Emil Martinec
+ *
+ */
+
+//#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#ifdef _OPENMP
+#include
+#endif
+
+#define SQR(x) ((x)*(x))
+#define CLIPTO(a,b,c) ((a)>(b)?((a)<(c)?(a):(c)):(b))
+#define CLIPC(a) ((a)>-32000?((a)<32000?(a):32000):-32000)
+#define CLIP(a) (CLIPTO(a,0,65535))
+
+
+
+
+//#define IDIRWT(i1,j1,i,j) ( irangefn[abs((int)data_fine->L[i1][j1]-data_fine->L[i][j]) + \
+abs((int)data_fine->a[i1][j1]-data_fine->a[i][j])+abs((int)data_fine->b[i1][j1]-data_fine->b[i][j])] )
+
+#define DIRWT(i1,j1,i,j) ( /*domker[(i1-i)/scale+halfwin][(j1-j)/scale+halfwin] */ rangefn[abs((int)data_fine->L[i1][j1]-data_fine->L[i][j])+abs((int)data_fine->a[i1][j1]-data_fine->a[i][j])+abs((int)data_fine->b[i1][j1]-data_fine->b[i][j])] )
+
+namespace rtengine {
+
+ static const int maxlevel = 4;
+
+ //sequence of scales
+ static const int scales[8] = {1,2,4,8,16,32,64,128};
+ //sequence of pitches
+ static const int pitches[8] = {1,1,1,1,1,1,1,1};
+
+ //sequence of scales
+ //static const int scales[8] = {1,1,1,1,1,1,1,1};
+ //sequence of pitches
+ //static const int pitches[8] = {2,2,2,2,2,2,2,2};
+
+ //sequence of scales
+ //static const int scales[8] = {1,3,6,10,15,21,28,36};
+ //sequence of pitches
+ //static const int pitches[8] = {1,1,1,1,1,1,1,1};
+
+ //sequence of scales
+ //static const int scales[8] = {1,1,2,4,8,16,32,64};
+ //sequence of pitches
+ //static const int pitches[8] = {2,1,1,1,1,1,1,1};
+
+ //pitch is spacing of subsampling
+ //scale is spacing of directional averaging weights
+ //example 1: no subsampling at any level -- pitch=1, scale=2^n
+ //example 2: subsampling by 2 every level -- pitch=2, scale=1 at each level
+ //example 3: no subsampling at first level, subsampling by 2 thereafter --
+ // pitch =1, scale=1 at first level; pitch=2, scale=2 thereafter
+
+
+
+
+ void ImProcFunctions :: dirpyrLab_equalizer(LabImage * src, LabImage * dst, /*float luma, float chroma, float gamma*/ const double * mult )
+ {
+ /*float gam = 2.0;//MIN(3.0, 0.1*fabs(c[4])/3.0+0.001);
+ float gamthresh = 0.03;
+ float gamslope = exp(log((double)gamthresh)/gam)/gamthresh;
+ unsigned short gamcurve[65536];
+ for (int i=0; i<65536; i++) {
+ int g = (int)(CurveFactory::gamma((double)i/65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 65535.0);
+ //if (i<500) printf("%d %d \n",i,g);
+ gamcurve[i] = CLIP(g);
+ }
+
+
+ //#pragma omp parallel for if (multiThread)
+ for (int i=0; iH; i++) {
+ for (int j=0; jW; j++) {
+ src->L[i][j] = gamcurve[src->L[i][j] ];
+ }
+ }*/
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ int * rangefn = new int [0x20000];
+
+ //int * irangefn = new int [0x20000];
+
+ int intfactor = 1024;//16384;
+
+
+ //set up weights
+ float noise = 1500;
+
+
+ //set up range functions
+
+ for (int i=0; i<0x20000; i++)
+ rangefn[i] = (int)((noise/((double)i + noise))*intfactor);
+
+ /*for (int i=0; i<0x20000; i++)
+ //irangefn[i] = 1+(int)( exp(-(double)fabs(i-0x10000) / (1+16*noise) )*intfactor);
+ irangefn[i] = intfactor*(int)(SQR(noise)/((float)SQR(noise)+SQR(i)));*/
+
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+ int level;
+ int ** buffer[3];
+
+
+ LabImage * dirpyrLablo[maxlevel];
+
+ int w = src->W;
+ int h = src->H;
+
+ buffer[0] = allocArray (w+128, h+128);
+ buffer[1] = allocArray (w+128, h+128);
+ buffer[2] = allocArray (w+128, h+128);
+
+ for (int i=0; iH; i+=totalpitch, i1++)
+ for(int j = 0, j1=0; j < src->W; j+=totalpitch, j1++) {
+
+ //copy pixels
+ buffer[0][i][j] = dirpyrLablo[maxlevel-1]->L[i1][j1];
+ buffer[1][i][j] = dirpyrLablo[maxlevel-1]->a[i1][j1];
+ buffer[2][i][j] = dirpyrLablo[maxlevel-1]->b[i1][j1];
+
+ }
+
+ //if we are not subsampling, this is lots faster but does the typecasting work???
+ //memcpy(buffer[0],dirpyrLablo[maxlevel-1]->L,sizeof(buffer[0]));
+ //memcpy(buffer[1],dirpyrLablo[maxlevel-1]->a,sizeof(buffer[1]));
+ //memcpy(buffer[2],dirpyrLablo[maxlevel-1]->b,sizeof(buffer[2]));
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+ for(int level = maxlevel - 1; level > 0; level--)
+ {
+
+ //int scale = scales[level];
+ int pitch = pitches[level];
+
+ totalpitch /= pitch;
+
+ idirpyr_eq(dirpyrLablo[level], dirpyrLablo[level-1], buffer, /*i*/ rangefn, level, pitch, totalpitch, mult );
+
+ }
+
+
+ scale = scales[0];
+ pitch = pitches[0];
+ totalpitch /= pitch;
+
+ idirpyr_eq(dirpyrLablo[0], dst, buffer, /*i*/ rangefn, 0, pitch, totalpitch, mult );
+
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+ /*float igam = 1/gam;
+ float igamthresh = gamthresh*gamslope;
+ float igamslope = 1/gamslope;
+ for (int i=0; i<65536; i++) {
+ int g = (int)(CurveFactory::gamma((float)i/65535.0, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0);
+ gamcurve[i] = CLIP(g);
+ }*/
+
+
+ for (int i=0; iH; i++)
+ for (int j=0; jW; j++) {
+
+ dst->L[i][j] = CLIP((int)( buffer[0][i][j] ));
+ dst->a[i][j] = CLIPC((int)( buffer[1][i][j] ));
+ dst->b[i][j] = CLIPC((int)( buffer[2][i][j] ));
+
+
+ //dst->L[i][j] = gamcurve[ dst->L[i][j] ];
+
+ }
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+ for(int i = 0; i < maxlevel; i++)
+ {
+ delete dirpyrLablo[i];
+ }
+
+ for (int c=0;c<3;c++)
+ freeArray(buffer[c], h+128);
+
+ //delete [] rangefn_L;
+ //delete [] rangefn_ab;
+ delete [] rangefn;
+
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ };
+
+ void ImProcFunctions::dirpyr_eq(LabImage* data_fine, LabImage* data_coarse, int * rangefn, int level, int pitch, int scale, const double * mult )
+ {
+
+ //pitch is spacing of subsampling
+ //scale is spacing of directional averaging weights
+ //example 1: no subsampling at any level -- pitch=1, scale=2^n
+ //example 2: subsampling by 2 every level -- pitch=2, scale=1 at each level
+ //example 3: no subsampling at first level, subsampling by 2 thereafter --
+ // pitch =1, scale=1 at first level; pitch=2, scale=2 thereafter
+
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ // calculate weights, compute directionally weighted average
+
+ int width = data_fine->W;
+ int height = data_fine->H;
+
+
+
+ //generate domain kernel
+ int halfwin = 1;//MIN(ceil(2*sig),3);
+ int scalewin = halfwin*scale;
+ //int intfactor = 16384;
+
+ /*float domker[7][7];
+ for (int i=-halfwin; i<=halfwin; i++)
+ for (int j=-halfwin; j<=halfwin; j++) {
+ domker[i+halfwin][j+halfwin] = (int)(exp(-(i*i+j*j)/(2*sig*sig))*intfactor); //or should we use a value that depends on sigma???
+ }*/
+ //float domker[5][5] = {{1,1,1,1,1},{1,2,2,2,1},{1,2,4,2,1},{1,2,2,2,1},{1,1,1,1,1}};
+
+ //float domker[3][3] = {{1,1,1},{1,2,1},{1,1,1}};
+#ifdef _OPENMP
+#pragma omp parallel for
+#endif
+ for(int i = 0; i < height; i+=pitch) { int i1=i/pitch;
+ for(int j = 0, j1=0; j < width; j+=pitch, j1++)
+ {
+ float Lout, aout, bout;
+ float norm;
+ norm = 0;//if we do want to include the input pixel in the sum
+ Lout = 0;
+ aout = 0;
+ bout = 0;
+
+ for(int inbr=MAX(0,i-scalewin); inbr<=MIN(height-1,i+scalewin); inbr+=scale) {
+ for (int jnbr=MAX(0,j-scalewin); jnbr<=MIN(width-1,j+scalewin); jnbr+=scale) {
+ float dirwt = DIRWT(inbr, jnbr, i, j);
+ Lout += dirwt*data_fine->L[inbr][jnbr];
+ aout += dirwt*data_fine->a[inbr][jnbr];
+ bout += dirwt*data_fine->b[inbr][jnbr];
+ norm += dirwt;
+ }
+ }
+ data_coarse->L[i1][j1]=Lout/norm;//low pass filter
+ data_coarse->a[i1][j1]=aout/norm;
+ data_coarse->b[i1][j1]=bout/norm;
+ }
+ }
+
+
+
+
+ };
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ void ImProcFunctions::idirpyr_eq(LabImage* data_coarse, LabImage* data_fine, int *** buffer, int * irangefn, int level, int pitch, int scale, const double * mult )
+ {
+
+ int width = data_fine->W;
+ int height = data_fine->H;
+
+ float lumamult[4], chromamult[4];
+ for (int i=0; i<4; i++) {
+ lumamult[i] = mult[i];
+ chromamult[i] = mult[i+4];
+ }
+
+ float wtdsum[6], norm, dirwt;
+ float hipass[3];
+ int i1, j1;
+
+
+ //int halfwin = 3;//MIN(ceil(2*sig),3);
+ //int intfactor= 16384;
+ //int winwidth=1+2*halfwin;//this belongs in calling function
+ /*float domker[7][7];
+ for (int i=-halfwin; i<=halfwin; i++)
+ for (int j=-halfwin; j<=halfwin; j++) {
+ domker[i][j] = (int)(exp(-(i*i+j*j)/(2*sig*sig))*intfactor); //or should we use a value that depends on sigma???
+ }*/
+ //float domker[5][5] = {{1,1,1,1,1},{1,2,2,2,1},{1,2,4,2,1},{1,2,2,2,1},{1,1,1,1,1}};
+
+
+ // for coarsest level, take non-subsampled lopass image and subtract from lopass_fine to generate hipass image
+
+ // denoise hipass image, add back into lopass_fine to generate denoised image at fine scale
+
+ // now iterate:
+ // (1) take denoised image at level n, expand and smooth using gradient weights from lopass image at level n-1
+ // the result is the smoothed image at level n-1
+ // (2) subtract smoothed image at level n-1 from lopass image at level n-1 to make hipass image at level n-1
+ // (3) denoise the hipass image at level n-1
+ // (4) add the denoised image at level n-1 to the smoothed image at level n-1 to make the denoised image at level n-1
+
+ // note that the coarsest level amounts to skipping step (1) and doing (2,3,4).
+ // in other words, skip step one if pitch=1
+
+
+
+ if (pitch==1) {
+ // step (1-2-3-4)
+#ifdef _OPENMP
+#pragma omp parallel for
+#endif
+ for(int i = 0; i < height; i++)
+ for(int j = 0; j < width; j++) {
+
+ //luma
+ float hipass0 = (float)data_fine->L[i][j]-data_coarse->L[i][j];
+ buffer[0][i*scale][j*scale] += hipass0 * lumamult[level];//*luma;
+
+ //chroma
+ float hipass1 = data_fine->a[i][j]-data_coarse->a[i][j];
+ float hipass2 = data_fine->b[i][j]-data_coarse->b[i][j];
+ buffer[1][i*scale][j*scale] += hipass1 * chromamult[level]; //*chroma;
+ buffer[2][i*scale][j*scale] += hipass2 * chromamult[level]; //*chroma;
+ }
+
+ } else {
+
+ // step (1)
+ //if (pitch>1), pitch=2; expand coarse image, fill in missing data
+
+ LabImage* smooth;
+ smooth = new LabImage(width, height);
+#ifdef _OPENMP
+#pragma omp parallel
+#endif
+
+{
+#ifdef _OPENMP
+#pragma omp for
+#endif
+ for(int i = 0; i < height; i+=pitch){ int i2=i/pitch;
+ for(int j = 0, j2=0; j < width; j+=pitch, j2++) {
+
+ //copy common pixels
+ smooth->L[i][j] = data_coarse->L[i2][j2];
+ smooth->a[i][j] = data_coarse->a[i2][j2];
+ smooth->b[i][j] = data_coarse->b[i2][j2];
+ }
+ }
+
+#ifdef _OPENMP
+#pragma omp for
+#endif
+ for(int i = 0; i < height-1; i+=2)
+ for(int j = 0; j < width-1; j+=2) {
+ //do midpoint first
+ norm=dirwt=0;
+ wtdsum[0]=wtdsum[1]=wtdsum[2]=wtdsum[3]=wtdsum[4]=wtdsum[5]=0.0;
+ for(i1=i; i1L[i1][j1];
+ wtdsum[1] += dirwt*smooth->a[i1][j1];
+ wtdsum[2] += dirwt*smooth->b[i1][j1];
+ wtdsum[3] += dirwt*buffer[0][i1*scale][j1*scale];// not completely right if j1*scale or i1*scale is out of bounds of original image ???
+ wtdsum[4] += dirwt*buffer[1][i1*scale][j1*scale];// also should we use directional average?
+ wtdsum[5] += dirwt*buffer[2][i1*scale][j1*scale];
+ norm+=dirwt;
+ }
+ norm = 1/norm;
+ smooth->L[i+1][j+1]=wtdsum[0]*norm;
+ smooth->a[i+1][j+1]=wtdsum[1]*norm;
+ smooth->b[i+1][j+1]=wtdsum[2]*norm;
+ buffer[0][(i+1)*scale][(j+1)*scale]=wtdsum[3]*norm;
+ buffer[1][(i+1)*scale][(j+1)*scale]=wtdsum[4]*norm;
+ buffer[2][(i+1)*scale][(j+1)*scale]=wtdsum[5]*norm;
+ }
+#ifdef _OPENMP
+#pragma omp for
+#endif
+ for(int i = 0; i < height-1; i+=2)
+ for(int j = 0; j < width-1; j+=2) {
+ //now right neighbor
+ if (j+1==width) continue;
+ norm=dirwt=0;
+ wtdsum[0]=wtdsum[1]=wtdsum[2]=wtdsum[3]=wtdsum[4]=wtdsum[5]=0.0;
+ for (j1=j; j1L[i][j1];
+ wtdsum[1] += dirwt*smooth->a[i][j1];
+ wtdsum[2] += dirwt*smooth->b[i][j1];
+ wtdsum[3] += dirwt*buffer[0][i*scale][j1*scale];
+ wtdsum[4] += dirwt*buffer[1][i*scale][j1*scale];
+ wtdsum[5] += dirwt*buffer[2][i*scale][j1*scale];
+ norm+=dirwt;
+ }
+ for (i1=MAX(0,i-1); i1L[i1][j+1];
+ wtdsum[1] += dirwt*smooth->a[i1][j+1];
+ wtdsum[2] += dirwt*smooth->b[i1][j+1];
+ wtdsum[3] += dirwt*buffer[0][i1*scale][(j+1)*scale];
+ wtdsum[4] += dirwt*buffer[1][i1*scale][(j+1)*scale];
+ wtdsum[5] += dirwt*buffer[2][i1*scale][(j+1)*scale];
+ norm+=dirwt;
+ }
+ norm = 1/norm;
+ smooth->L[i][j+1]=wtdsum[0]*norm;
+ smooth->a[i][j+1]=wtdsum[1]*norm;
+ smooth->b[i][j+1]=wtdsum[2]*norm;
+ buffer[0][i][(j+1)*scale]=wtdsum[3]*norm;
+ buffer[1][i][(j+1)*scale]=wtdsum[4]*norm;
+ buffer[2][i][(j+1)*scale]=wtdsum[5]*norm;
+
+ //now down neighbor
+ if (i+1==height) continue;
+ norm=0;
+ wtdsum[0]=wtdsum[1]=wtdsum[2]=wtdsum[3]=wtdsum[4]=wtdsum[5]=0.0;
+ for (i1=i; i1L[i1][j];
+ wtdsum[1] += dirwt*smooth->a[i1][j];
+ wtdsum[2] += dirwt*smooth->b[i1][j];
+ wtdsum[3] += dirwt*buffer[0][i1*scale][j*scale];
+ wtdsum[4] += dirwt*buffer[1][i1*scale][j*scale];
+ wtdsum[5] += dirwt*buffer[2][i1*scale][j*scale];
+ norm+=dirwt;
+ }
+ for (j1=MAX(0,j-1); j1L[i+1][j1];
+ wtdsum[1] += dirwt*smooth->a[i+1][j1];
+ wtdsum[2] += dirwt*smooth->b[i+1][j1];
+ wtdsum[3] += dirwt*buffer[0][(i+1)*scale][j1*scale];
+ wtdsum[4] += dirwt*buffer[1][(i+1)*scale][j1*scale];
+ wtdsum[5] += dirwt*buffer[2][(i+1)*scale][j1*scale];
+ norm+=dirwt;
+ }
+ norm=1/norm;
+ smooth->L[i+1][j]=wtdsum[0]*norm;
+ smooth->a[i+1][j]=wtdsum[1]*norm;
+ smooth->b[i+1][j]=wtdsum[2]*norm;
+ buffer[0][(i+1)*scale][j*scale]=wtdsum[3]*norm;
+ buffer[1][(i+1)*scale][j*scale]=wtdsum[4]*norm;
+ buffer[2][(i+1)*scale][j*scale]=wtdsum[5]*norm;
+
+ }
+
+
+ // step (2-3-4)
+#ifdef _OPENMP
+#pragma omp for
+#endif
+ for(int i = 0; i < height; i++)
+ for(int j = 0; j < width; j++) {
+
+ //luma
+ hipass[0] = (float)data_fine->L[i][j]-smooth->L[i][j];
+ buffer[0][i*scale][j*scale] += hipass[0] * lumamult[level]; //*luma;
+
+ //chroma
+ hipass[1] = data_fine->a[i][j]-smooth->a[i][j];
+ hipass[2] = data_fine->b[i][j]-smooth->b[i][j];
+ buffer[1][i*scale][j*scale] += hipass[1] * chromamult[level]; //*chroma;
+ buffer[2][i*scale][j*scale] += hipass[2] * chromamult[level]; //*chroma;
+ }
+} // end parallel
+ delete smooth;
+
+ }
+ };
+
+
+#undef DIRWT_L
+#undef DIRWT_AB
+
+#undef NRWT_L
+#undef NRWT_AB
+
+}
+
diff --git a/rtengine/dirpyr_equalizer.cc b/rtengine/dirpyr_equalizer.cc
new file mode 100644
index 000000000..67ce8f1f0
--- /dev/null
+++ b/rtengine/dirpyr_equalizer.cc
@@ -0,0 +1,286 @@
+/*
+ * This file is part of RawTherapee.
+ *
+ * RawTherapee is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * RawTherapee is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with RawTherapee. If not, see .
+ *
+ * © 2010 Emil Martinec
+ *
+ */
+
+//#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#ifdef _OPENMP
+#include
+#endif
+
+#define SQR(x) ((x)*(x))
+#define CLIPTO(a,b,c) ((a)>(b)?((a)<(c)?(a):(c)):(b))
+#define CLIPC(a) ((a)>-32000?((a)<32000?(a):32000):-32000)
+#define CLIP(a) (CLIPTO(a,0,65535))
+
+
+
+#define DIRWT(i1,j1,i,j) ( domker[(i1-i)/scale+halfwin][(j1-j)/scale+halfwin] * rangefn[abs((int)data_fine[i1][j1]-data_fine[i][j])] )
+
+namespace rtengine {
+
+ static const int maxlevel = 4;
+ static const float noise = 2000;
+ static const float thresh = 1000;
+
+ //sequence of scales
+ static const int scales[8] = {1,2,4,8,16,32,64,128};
+
+ //sequence of scales
+ //static const int scales[8] = {1,2,3,6,15,21,28,36};
+ //scale is spacing of directional averaging weights
+
+
+ void ImProcFunctions :: dirpyr_equalizer(unsigned short ** src, unsigned short ** dst, int srcwidth, int srcheight, const double * mult )
+ {
+ int lastlevel=maxlevel;
+
+ while (fabs(mult[lastlevel-1]-1)<0.001 && lastlevel>0) {
+ lastlevel--;
+ //printf("last level to process %d \n",lastlevel);
+ }
+ if (lastlevel==0) return;
+
+ /*float gam = 2.0;//MIN(3.0, 0.1*fabs(c[4])/3.0+0.001);
+ float gamthresh = 0.03;
+ float gamslope = exp(log((double)gamthresh)/gam)/gamthresh;
+ unsigned short gamcurve[65536];
+ for (int i=0; i<65536; i++) {
+ int g = (int)(CurveFactory::gamma((double)i/65535.0, gam, gamthresh, gamslope, 1.0, 0.0) * 65535.0);
+ //if (i<500) printf("%d %d \n",i,g);
+ gamcurve[i] = CLIP(g);
+ }
+
+
+ //#pragma omp parallel for if (multiThread)
+ for (int i=0; iH; i++) {
+ for (int j=0; jW; j++) {
+ src[i][j] = gamcurve[src[i][j] ];
+ }
+ }*/
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ int * rangefn = new int [0x20000];
+
+ int intfactor = 1024;//16384;
+
+
+ //set up range functions
+
+ for (int i=0; i<0x10000; i++) {
+ rangefn[i] = (int)((thresh/((double)(i) + thresh))*intfactor);
+ //rangefn[i] = (int)(exp(-(double)abs(i)/(5*thresh))*(thresh/((double)(i) + thresh))*intfactor);
+ //rangefn[i] = (int)((thresh*thresh/((double)(i)*(double)(i) + thresh*thresh))*intfactor);
+ }
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+ int level;
+ int ** buffer;
+
+ unsigned short ** dirpyrlo[maxlevel];
+
+
+ buffer = allocArray (srcwidth, srcheight);
+
+ for (int i=0; i (srcwidth, srcheight);
+
+ dirpyr_channel(src, dirpyrlo[0], srcwidth, srcheight, rangefn, 0, scale, mult );
+
+ level = 1;
+
+ while(level < lastlevel)
+ {
+ scale = scales[level];
+
+ dirpyrlo[level] = allocArray(srcwidth, srcheight);
+
+ dirpyr_channel(dirpyrlo[level-1], dirpyrlo[level], srcwidth, srcheight, rangefn, level, scale, mult );
+
+ level ++;
+ }
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ //initiate buffer for final image
+ for(int i = 0; i < srcheight; i++)
+ for(int j = 0; j < srcwidth; j++) {
+
+ //copy pixels
+ buffer[i][j] = dirpyrlo[lastlevel-1][i][j];
+
+ }
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+ for(int level = lastlevel - 1; level > 0; level--)
+ {
+ idirpyr_eq_channel(dirpyrlo[level], dirpyrlo[level-1], buffer, srcwidth, srcheight, level, mult );
+ }
+
+
+ scale = scales[0];
+
+ idirpyr_eq_channel(dirpyrlo[0], dst, buffer, srcwidth, srcheight, 0, mult );
+
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+ /*float igam = 1/gam;
+ float igamthresh = gamthresh*gamslope;
+ float igamslope = 1/gamslope;
+ for (int i=0; i<65536; i++) {
+ int g = (int)(CurveFactory::gamma((float)i/65535.0, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0);
+ gamcurve[i] = CLIP(g);
+ }*/
+
+
+ for (int i=0; iL[i][j] ];
+
+ }
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+ for(int i = 0; i < lastlevel; i++)
+ {
+ freeArray(dirpyrlo[i], srcheight);
+ }
+
+ freeArray(buffer, srcheight);
+
+ delete [] rangefn;
+
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ };
+
+ void ImProcFunctions::dirpyr_channel(unsigned short ** data_fine, unsigned short ** data_coarse, int width, int height, int * rangefn, int level, int scale, const double * mult )
+ {
+ //scale is spacing of directional averaging weights
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ // calculate weights, compute directionally weighted average
+
+ int halfwin=2;
+ int domker[5][5] = {{1,1,1,1,1},{1,2,2,2,1},{1,2,2,2,1},{1,2,2,2,1},{1,1,1,1,1}};
+
+ //generate domain kernel
+ if (level<2) {
+ halfwin = 1;
+ domker[1][1]=domker[1][2]=domker[2][1]=domker[2][2]=1;
+ }
+
+
+ int scalewin = halfwin*scale;
+
+#ifdef _OPENMP
+#pragma omp parallel for
+#endif
+ for(int i = 0; i < height; i++) {
+ for(int j = 0; j < width; j++)
+ {
+ float val=0;
+ float norm=0;
+
+ for(int inbr=MAX(0,i-scalewin); inbr<=MIN(height-1,i+scalewin); inbr+=scale) {
+ for (int jnbr=MAX(0,j-scalewin); jnbr<=MIN(width-1,j+scalewin); jnbr+=scale) {
+ float dirwt = DIRWT(inbr, jnbr, i, j);
+ val += dirwt*data_fine[inbr][jnbr];
+ norm += dirwt;
+ }
+ }
+ data_coarse[i][j]=val/norm;//low pass filter
+ }
+ }
+
+
+
+
+ };
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ void ImProcFunctions::idirpyr_eq_channel(unsigned short ** data_coarse, unsigned short ** data_fine, int ** buffer, int width, int height, int level, const double * mult )
+ {
+ int hipass;
+
+ float noisehi = 1.33*noise*mult[4]/pow(3,level), noiselo = 0.66*noise*mult[4]/pow(3,level);
+ float * irangefn = new float [0x20000];
+
+ for (int i=0; i<0x20000; i++) {
+ if (abs(i-0x10000)>noisehi || mult[level]<1.0) {
+ irangefn[i] = mult[level] ;
+ } else {
+ if (abs(i-0x10000)setProgressStr ("Fast demosaicing...");
@@ -36,11 +38,12 @@ void RawImageSource::fast_demo() {
float progress = 0.0;
//allocate output arrays
+
red = new unsigned short*[H];
for (int i=0; idefgain;
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//first, interpolate borders using bilinear
- for (i=0; i -1 && i1 < H && j1 > -1) {
- c = FC(i1,j1);
+ for (int i=0; i -1) && (i1 < H) && (j1 > -1)) {
+ int c = FC(i1,j1);
sum[c] += ri->data[i1][j1];
sum[c+3]++;
}
}
- c=FC(i,j);
+ int c=FC(i,j);
if (c==1) {
red[i][j]=sum[0]/sum[3];
green[i][j]=ri->data[i][j];
@@ -83,16 +89,18 @@ void RawImageSource::fast_demo() {
}
}//j
- for (j=W-bord; j -1 && i1 < H && j1 < W) {
- c = FC(i1,j1);
+ for (int j=W-bord; j -1) && (i1 < H ) && (j1 < W)) {
+ int c = FC(i1,j1);
sum[c] += ri->data[i1][j1];
sum[c+3]++;
}
}
- c=FC(i,j);
+ int c=FC(i,j);
if (c==1) {
red[i][j]=sum[0]/sum[3];
green[i][j]=ri->data[i][j];
@@ -112,17 +120,19 @@ void RawImageSource::fast_demo() {
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- for (j=bord; j -1 && j1 < W && i1 > -1) {
- c = FC(i1,j1);
+ for (int j=bord; j -1) && (j1 < W) && (i1 > -1)) {
+ int c = FC(i1,j1);
sum[c] += ri->data[i1][j1];
sum[c+3]++;
}
}
- c=FC(i,j);
+ int c=FC(i,j);
if (c==1) {
red[i][j]=sum[0]/sum[3];
green[i][j]=ri->data[i][j];
@@ -139,16 +149,18 @@ void RawImageSource::fast_demo() {
}
}//i
- for (i=H-bord; i -1 && j1 < W && i1 < H) {
- c = FC(i1,j1);
+ for (int i=H-bord; i -1) && (j1 < W) && (i1 < H)) {
+ int c = FC(i1,j1);
sum[c] += ri->data[i1][j1];
sum[c+3]++;
}
}
- c=FC(i,j);
+ int c=FC(i,j);
if (c==1) {
red[i][j]=sum[0]/sum[3];
green[i][j]=ri->data[i][j];
@@ -169,27 +181,20 @@ void RawImageSource::fast_demo() {
if(plistener) plistener->setProgress(0.05);
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-#pragma omp parallel private(i,j,c)
- {
- int rb;
+ float * dirwt = new float [0x20000];
- float wtu, wtd, wtl, wtr;
+ //set up directional weight function
+ for (int i=0; i<0x10000; i++)
+ dirwt[i] = 1.0/SQR(1.0+i);
- float * dirwt = new float [0x20000];
-
-#pragma omp for schedule(dynamic) nowait
+#pragma omp parallel
+ {
- //set up directional weight function
- for (int i=0; i<0x10000; i++)
- dirwt[i] = 1.0/SQR(1.0+i);
-
-
-#pragma omp for schedule(dynamic) nowait
-
+#pragma omp for
// interpolate G using gradient weights
- for (i=bord; i< H-bord; i++) {
- for (j=bord; j < W-bord; j++) {
+ for (int i=bord; i< H-bord; i++) {
+ float wtu, wtd, wtl, wtr;
+ for (int j=bord; j < W-bord; j++) {
if (FC(i,j)==1) {
green[i][j] = ri->data[i][j];
@@ -198,16 +203,11 @@ void RawImageSource::fast_demo() {
} else {
//compute directional weights using image gradients
- wtu=dirwt[(abs(ri->data[i+1][j]-ri->data[i-1][j])+abs(ri->data[i][j]-ri->data[i-2][j])+abs(ri->data[i-1][j]-ri->data[i-3][j])) >>8];
- wtd=dirwt[(abs(ri->data[i-1][j]-ri->data[i+1][j])+abs(ri->data[i][j]-ri->data[i+2][j])+abs(ri->data[i+1][j]-ri->data[i+3][j])) >>8];
- wtl=dirwt[(abs(ri->data[i][j+1]-ri->data[i][j-1])+abs(ri->data[i][j]-ri->data[i][j-2])+abs(ri->data[i][j-1]-ri->data[i][j-3])) >>8];
- wtr=dirwt[(abs(ri->data[i][j-1]-ri->data[i][j+1])+abs(ri->data[i][j]-ri->data[i][j+2])+abs(ri->data[i][j+1]-ri->data[i][j+3])) >>8];
-
- //wtu=1/SQR(1.0+fabs((int)ri->data[i+1][j]-ri->data[i-1][j])+fabs((int)ri->data[i][j]-ri->data[i-2][j])+fabs((int)ri->data[i-1][j]-ri->data[i-3][j]));
- //wtd=1/SQR(1.0+fabs((int)ri->data[i-1][j]-ri->data[i+1][j])+fabs((int)ri->data[i][j]-ri->data[i+2][j])+fabs((int)ri->data[i+1][j]-ri->data[i+3][j]));
- //wtl=1/SQR(1.0+fabs((int)ri->data[i][j+1]-ri->data[i][j-1])+fabs((int)ri->data[i][j]-ri->data[i][j-2])+fabs((int)ri->data[i][j-1]-ri->data[i][j-3]));
- //wtr=1/SQR(1.0+fabs((int)ri->data[i][j-1]-ri->data[i][j+1])+fabs((int)ri->data[i][j]-ri->data[i][j+2])+fabs((int)ri->data[i][j+1]-ri->data[i][j+3]));
-
+ wtu=dirwt[(abs(ri->data[i+1][j]-ri->data[i-1][j])+abs(ri->data[i][j]-ri->data[i-2][j])+abs(ri->data[i-1][j]-ri->data[i-3][j])) >>4];
+ wtd=dirwt[(abs(ri->data[i-1][j]-ri->data[i+1][j])+abs(ri->data[i][j]-ri->data[i+2][j])+abs(ri->data[i+1][j]-ri->data[i+3][j])) >>4];
+ wtl=dirwt[(abs(ri->data[i][j+1]-ri->data[i][j-1])+abs(ri->data[i][j]-ri->data[i][j-2])+abs(ri->data[i][j-1]-ri->data[i][j-3])) >>4];
+ wtr=dirwt[(abs(ri->data[i][j-1]-ri->data[i][j+1])+abs(ri->data[i][j]-ri->data[i][j+2])+abs(ri->data[i][j+1]-ri->data[i][j+3])) >>4];
+
//store in rgb array the interpolated G value at R/B grid points using directional weighted average
green[i][j]=(int)((wtu*ri->data[i-1][j]+wtd*ri->data[i+1][j]+wtl*ri->data[i][j-1]+wtr*ri->data[i][j+1])/(wtu+wtd+wtl+wtr));
//red[i][j] = green[i][j];
@@ -215,58 +215,54 @@ void RawImageSource::fast_demo() {
}
}
- progress+=(double)0.33/(H);
+ //progress+=(double)0.33/(H);
//if(plistener) plistener->setProgress(progress);
}
if(plistener) plistener->setProgress(0.4);
-#pragma omp for schedule(dynamic) nowait
-
- for (i=bord; i< H-bord; i++) {
- for (j=bord+(FC(i,2)&1); j < W-bord; j+=2) {
+#pragma omp for
+ for (int i=bord; i< H-bord; i++) {
+ for (int j=bord+(FC(i,2)&1); j < W-bord; j+=2) {
- c=FC(i,j);
+ int c=FC(i,j);
//interpolate B/R colors at R/B sites
- rb = CLIP((int)(green[i][j] - 0.25*((green[i-1][j-1]-ri->data[i-1][j-1])+(green[i-1][j+1]-ri->data[i-1][j+1])+ \
- (green[i+1][j+1]-ri->data[i+1][j+1])+(green[i+1][j-1]-ri->data[i+1][j-1]))));
+
if (c==0) {//R site
red[i][j] = ri->data[i][j];
- blue[i][j] = rb;
+ blue[i][j] = CLIP((int)(green[i][j] - 0.25*((green[i-1][j-1]+green[i-1][j+1]+green[i+1][j+1]+green[i+1][j-1]) - \
+ MIN(clip_pt,ri->data[i-1][j-1]+ri->data[i-1][j+1]+ri->data[i+1][j+1]+ri->data[i+1][j-1]))));
} else {//B site
- red[i][j] = rb;
+ red[i][j] = CLIP((int)(green[i][j] - 0.25*((green[i-1][j-1]+green[i-1][j+1]+green[i+1][j+1]+green[i+1][j-1]) - \
+ MIN(clip_pt,ri->data[i-1][j-1]+ri->data[i-1][j+1]+ri->data[i+1][j+1]+ri->data[i+1][j-1]))));
blue[i][j] = ri->data[i][j];
}
}
- progress+=(double)0.33/(H);
+ //progress+=(double)0.33/(H);
//if(plistener) plistener->setProgress(progress);
}
if(plistener) plistener->setProgress(0.7);
+#pragma omp barrier
-#pragma omp for schedule(dynamic) nowait
-
- // interpolate R/B using color differences
- for (i=bord; i< H-bord; i++) {
- for (j=bord+1-(FC(i,2)&1); j < W-bord; j+=2) {
-
- //interpolate R and B colors at G sites
- red[i][j] = CLIP((int)(green[i][j] - 0.25*((green[i-1][j]-red[i-1][j])+(green[i+1][j]-red[i+1][j])+ \
- (green[i][j-1]-red[i][j-1])+(green[i][j+1]-red[i][j+1]))));
- blue[i][j] = CLIP((int)(green[i][j] - 0.25*((green[i-1][j]-blue[i-1][j])+(green[i+1][j]-blue[i+1][j])+ \
- (green[i][j-1]-blue[i][j-1])+(green[i][j+1]-blue[i][j+1]))));
- }
- progress+=(double)0.33/(H);
- //if(plistener) plistener->setProgress(progress);
- }
- if(plistener) plistener->setProgress(0.99);
+#pragma omp for
+ // interpolate R/B using color differences
+ for (int i=bord; i< H-bord; i++) {
+ for (int j=bord+1-(FC(i,2)&1); j < W-bord; j+=2) {
+
+ //interpolate R and B colors at G sites
+ red[i][j] = CLIP((int)(green[i][j] - 0.25*((green[i-1][j]-red[i-1][j])+(green[i+1][j]-red[i+1][j])+ \
+ (green[i][j-1]-red[i][j-1])+(green[i][j+1]-red[i][j+1]))));
+ blue[i][j] = CLIP((int)(green[i][j] - 0.25*((green[i-1][j]-blue[i-1][j])+(green[i+1][j]-blue[i+1][j])+ \
+ (green[i][j-1]-blue[i][j-1])+(green[i][j+1]-blue[i][j+1]))));
+ }
+ progress+=(double)0.33/(H);
+ //if(plistener) plistener->setProgress(progress);
+ }
+ if(plistener) plistener->setProgress(0.99);
}
-
-
#undef bord
-
-
}//namespace
diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc
index 30c42a54a..38b9d5b1d 100644
--- a/rtengine/improccoordinator.cc
+++ b/rtengine/improccoordinator.cc
@@ -240,13 +240,13 @@ void ImProcCoordinator::updatePreviewImage (int todo) {
// ipf.impulsedenoise (nprevl);
//}
if (scale==1) {
+ progress ("Pyramid equalizer...",100*readyphase/numofphases);
+ ipf.dirpyrequalizer (nprevl);
+ }
+ if (scale==1) {
progress ("Wavelet...",100*readyphase/numofphases);
ipf.waveletEqualizer (nprevl, true, true);
}
- //if (scale==1) {
- // progress ("Wavelet...",100*readyphase/numofphases);
- // ipf.waveletEqualizer (nprevl, false, true);
- //}
}
@@ -460,9 +460,15 @@ void ImProcCoordinator::getSpotWB (int x, int y, int rect, double& temp, double&
if (params.coarse.vflip) tr |= TR_VFLIP;
ColorTemp ret = imgsrc->getSpotWB (red, green, blue, tr);
+ currWB = ColorTemp (params.wb.temperature, params.wb.green);
mProcessing.unlock ();
- temp = ret.getTemp ();
- tgreen = ret.getGreen ();
+ if (ret.getTemp() > 0) {
+ temp = ret.getTemp ();
+ tgreen = ret.getGreen ();
+ } else {
+ temp = currWB.getTemp ();
+ tgreen = currWB.getGreen ();
+ }
}
void ImProcCoordinator::getAutoCrop (double ratio, int &x, int &y, int &w, int &h) {
diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc
index 83962643a..7b11e1a79 100644
--- a/rtengine/improcfun.cc
+++ b/rtengine/improcfun.cc
@@ -390,7 +390,8 @@ void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew) {
}
}
- double shift_a = params->colorShift.a * chroma_scale, shift_b = params->colorShift.b * chroma_scale;
+ float eps = 0.001;
+ double shift_a = params->colorShift.a * chroma_scale + eps, shift_b = params->colorShift.b * chroma_scale + eps;
short** oa = lold->a;
short** ob = lold->b;
@@ -434,8 +435,7 @@ void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew) {
if (params->impulseDenoise.enabled && lab->W>=8 && lab->H>=8)
- impulse_nr (lab->L, lab->L, lab->W, lab->H, (float)params->impulseDenoise.thresh/20.0 /*1024*/);
- impulse_nr (lab->L, lab->L, lab->W, lab->H, 1024);
+ impulse_nr (lab->L, lab->L, lab->W, lab->H, (float)params->impulseDenoise.thresh/20.0 );
}
void ImProcFunctions::dirpyrdenoise (LabImage* lab) {
@@ -444,6 +444,16 @@ void ImProcFunctions::colorCurve (LabImage* lold, LabImage* lnew) {
dirpyrLab_denoise(lab, lab, params->dirpyrDenoise.luma, params->dirpyrDenoise.chroma, params->dirpyrDenoise.gamma/3.0 );
}
+
+ void ImProcFunctions::dirpyrequalizer (LabImage* lab) {
+
+ if (params->dirpyrequalizer.enabled && lab->W>=8 && lab->H>=8) {
+
+ //dirpyrLab_equalizer(lab, lab, params->dirpyrequalizer.mult);
+ dirpyr_equalizer(lab->L, lab->L, lab->W, lab->H, params->dirpyrequalizer.mult);
+
+ }
+ }
void ImProcFunctions::lumadenoise (LabImage* lab, int** b2) {
diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h
index 5b4e587fb..d065cfac3 100644
--- a/rtengine/improcfun.h
+++ b/rtengine/improcfun.h
@@ -94,12 +94,20 @@ class ImProcFunctions {
void impulsedenoise (LabImage* lab);//Emil's impulse denoise
void dirpyrdenoise (LabImage* lab);//Emil's impulse denoise
-
- void dirpyrLab_denoise(LabImage * src, LabImage * dst, const int luma, const int chroma, float gamma );//Emil's directional pyramid denoise
- void dirpyr(LabImage* data_fine, LabImage* data_coarse, int level, int * rangefn_L, int * rangefn_ab, int pitch, int scale, const int luma, const int chroma );
- void idirpyr(LabImage* data_coarse, LabImage* data_fine, int level, float * nrwt_l, float * nrwt_ab, int pitch, int scale, const int luma, const int chroma );
-
+ void dirpyrequalizer (LabImage* lab);//Emil's equalizer
+ void dirpyrLab_denoise(LabImage * src, LabImage * dst, int luma, int chroma, float gamma );//Emil's directional pyramid denoise
+ void dirpyr(LabImage* data_fine, LabImage* data_coarse, int level, int * rangefn_L, int * rangefn_ab, int pitch, int scale, const int luma, int chroma );
+ void idirpyr(LabImage* data_coarse, LabImage* data_fine, int level, float * nrwt_l, float * nrwt_ab, int pitch, int scale, const int luma, int chroma );
+
+ void dirpyrLab_equalizer(LabImage * src, LabImage * dst, const double * mult );//Emil's directional pyramid equalizer
+ void dirpyr_eq(LabImage* data_coarse, LabImage* data_fine, int * rangefn, int level, int pitch, int scale, const double * mult );
+ void idirpyr_eq(LabImage* data_coarse, LabImage* data_fine, int *** buffer, int * irangefn, int level, int pitch, int scale, const double * mult );
+
+ void dirpyr_equalizer(unsigned short ** src, unsigned short ** dst, int srcwidth, int srcheight, const double * mult );//Emil's directional pyramid equalizer
+ void dirpyr_channel(unsigned short ** data_fine, unsigned short ** data_coarse, int width, int height, int * rangefn, int level, int scale, const double * mult );
+ void idirpyr_eq_channel(unsigned short ** data_coarse, unsigned short ** data_fine, int ** buffer, int width, int height, int level, const double * mult );
+
Image8* lab2rgb (LabImage* lab, int cx, int cy, int cw, int ch, Glib::ustring profile);
Image16* lab2rgb16 (LabImage* lab, int cx, int cy, int cw, int ch, Glib::ustring profile);
diff --git a/rtengine/loadinitial.cc.orig b/rtengine/loadinitial.cc.orig
index 308005e30..455efdf4c 100644
--- a/rtengine/loadinitial.cc.orig
+++ b/rtengine/loadinitial.cc.orig
@@ -22,8 +22,14 @@
namespace rtengine {
+ Glib::Mutex* qMutex2 = NULL;
InitialImage* InitialImage::load (const Glib::ustring& fname, bool isRaw, int* errorCode, ProgressListener* pl) {
+ if (!qMutex2)
+ qMutex2 = new Glib::Mutex ();
+
+ qMutex2->lock();
+
ImageSource* isrc;
if (!isRaw)
@@ -32,11 +38,16 @@ InitialImage* InitialImage::load (const Glib::ustring& fname, bool isRaw, int* e
isrc = new RawImageSource ();
isrc->setProgressListener (pl);
+
+ if(isRaw && pl == NULL)
+ *errorCode = isrc->load (fname, true);
+ else
*errorCode = isrc->load (fname);
if (*errorCode) {
delete isrc;
return NULL;
}
+ qMutex2->unlock();
return isrc;
}
}
diff --git a/rtengine/procevents.h b/rtengine/procevents.h
index ee4c056ed..65e1d79ba 100644
--- a/rtengine/procevents.h
+++ b/rtengine/procevents.h
@@ -21,7 +21,7 @@
#include
-#define NUMOFEVENTS 92
+#define NUMOFEVENTS 94
namespace rtengine {
@@ -118,7 +118,9 @@ enum ProcEvent {
EvDPDNEnabled=88,
EvDPDNLuma=89,
EvDPDNChroma=90,
- EvDPDNGamma=91
+ EvDPDNGamma=91,
+ EvDirPyrEqualizer=92,
+ EvDirPyrEqlEnabled=93
};
}
#endif
diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc
index b0c5bf55d..8e1655b4e 100644
--- a/rtengine/procparams.cc
+++ b/rtengine/procparams.cc
@@ -172,7 +172,13 @@ void ProcParams::setDefaults () {
{
equalizer.c[i] = 0;
}
-
+ dirpyrequalizer.enabled = false;
+ for(int i = 0; i < 4; i ++)
+ {
+ dirpyrequalizer.mult[i] = 1.0;
+ }
+ dirpyrequalizer.mult[4] = 0.0;
+
exif.clear ();
iptc.clear ();
@@ -338,6 +344,15 @@ int ProcParams::save (Glib::ustring fname) const {
ss << "C" << i;
keyFile.set_integer("Equalizer", ss.str(), equalizer.c[i]);
}
+
+ // save directional pyramid equalizer parameters
+ keyFile.set_boolean ("Directional Pyramid Equalizer", "Enabled", dirpyrequalizer.enabled);
+ for(int i = 0; i < 5; i++)
+ {
+ std::stringstream ss;
+ ss << "Mult" << i;
+ keyFile.set_double("Directional Pyramid Equalizer", ss.str(), dirpyrequalizer.mult[i]);
+ }
// save exif change list
for (int i=0; i<(int)exif.size(); i++)
@@ -589,6 +604,17 @@ if (keyFile.has_group ("Equalizer")) {
if(keyFile.has_key ("Equalizer", ss.str())) equalizer.c[i] = keyFile.get_integer ("Equalizer", ss.str());
}
}
+
+ // load directional pyramid equalizer parameters
+if (keyFile.has_group ("Directional Pyramid Equalizer")) {
+ if (keyFile.has_key ("Directional Pyramid Equalizer", "Enabled")) dirpyrequalizer.enabled = keyFile.get_boolean ("Directional Pyramid Equalizer", "Enabled");
+ for(int i = 0; i < 5; i ++)
+ {
+ std::stringstream ss;
+ ss << "Mult" << i;
+ if(keyFile.has_key ("Directional Pyramid Equalizer", ss.str())) dirpyrequalizer.mult[i] = keyFile.get_double ("Directional Pyramid Equalizer", ss.str());
+ }
+}
// load exif change settings
if (keyFile.has_group ("Exif")) {
@@ -633,6 +659,17 @@ bool operator==(const EqualizerParams & a, const EqualizerParams & b) {
}
return true;
}
+
+bool operator==(const DirPyrEqualizerParams & a, const DirPyrEqualizerParams & b) {
+ if(a.enabled != b.enabled)
+ return false;
+
+ for(int i = 0; i < 5; i++) {
+ if(a.mult[i] != b.mult[i])
+ return false;
+ }
+ return true;
+}
bool operator==(const ExifPair& a, const ExifPair& b) {
@@ -739,6 +776,7 @@ bool ProcParams::operator== (const ProcParams& other) {
&& icm.working == other.icm.working
&& icm.output == other.icm.output
&& equalizer == other.equalizer
+ && dirpyrequalizer == other.dirpyrequalizer
&& exif==other.exif
&& iptc==other.iptc;
}
diff --git a/rtengine/procparams.h b/rtengine/procparams.h
index 9b647db70..3a6f4ea28 100644
--- a/rtengine/procparams.h
+++ b/rtengine/procparams.h
@@ -334,6 +334,16 @@ class EqualizerParams {
bool enabled;
int c[8];
};
+
+/**
+ * Directional pyramid equalizer params
+ */
+ class DirPyrEqualizerParams {
+
+ public:
+ bool enabled;
+ double mult[8];
+ };
/**
* This class holds all the processing parameters applied on the images
@@ -365,6 +375,7 @@ class ProcParams {
ResizeParams resize; ///< Resize parameters
ColorManagementParams icm; ///< profiles/color spaces used during the image processing
EqualizerParams equalizer; ///< wavelet equalizer parameters
+ DirPyrEqualizerParams dirpyrequalizer;///< directional pyramid equalizer parameters
std::vector exif; ///< List of modifications appplied on the exif tags of the input image
std::vector iptc; ///< The IPTC tags and values to be saved to the output image
int version; ///< Version of the file from which the parameters have been read
diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc
index 4b3145e3f..1a2969042 100644
--- a/rtengine/rawimagesource.cc
+++ b/rtengine/rawimagesource.cc
@@ -1841,111 +1841,114 @@ int RawImageSource::getAEHistogram (unsigned int* histogram, int& histcompr) {
}
}
return 1;
-}
-
-ColorTemp RawImageSource::getAutoWB () {
-
- double avg_r = 0;
- double avg_g = 0;
- double avg_b = 0;
- int rn = 0, gn = 0, bn = 0;
-
- if (fuji) {
- for (int i=32; iheight-32; i++) {
- int fw = ri->fuji_width;
- int start = ABS(fw-i) + 32;
- int end = MIN(ri->height+ri->width-fw-i, fw+i) - 32;
- for (int j=start; jfilters) {
- double d = CLIP(ri->defgain*ri->data[i][3*j]);
- if (d>64000)
- continue;
- avg_r += d*d*d*d*d*d; rn++;
- d = CLIP(ri->defgain*ri->data[i][3*j+1]);
- if (d>64000)
- continue;
- avg_g += d*d*d*d*d*d; gn++;
- d = CLIP(ri->defgain*ri->data[i][3*j+2]);
- if (d>64000)
- continue;
- avg_b += d*d*d*d*d*d; bn++;
- }
- else {
- double d = CLIP(ri->defgain*ri->data[i][j]);
- if (d>64000)
- continue;
- double dp = d*d*d*d*d*d;
- if (ISRED(ri,i,j)) {
- avg_r += dp;
- rn++;
- }
- else if (ISGREEN(ri,i,j)) {
- avg_g += dp;
- gn++;
- }
- else if (ISBLUE(ri,i,j)) {
- avg_b += dp;
- bn++;
- }
- }
- }
- }
- }
- else {
- for (int i=32; iheight-32; i++)
- for (int j=32; jwidth-32; j++) {
- if (!ri->filters) {
- double d = CLIP(ri->defgain*ri->data[i][3*j]);
- if (d>64000)
- continue;
- avg_r += d*d*d*d*d*d; rn++;
- d = CLIP(ri->defgain*ri->data[i][3*j+1]);
- if (d>64000)
- continue;
- avg_g += d*d*d*d*d*d; gn++;
- d = CLIP(ri->defgain*ri->data[i][3*j+2]);
- if (d>64000)
- continue;
- avg_b += d*d*d*d*d*d; bn++;
- }
- else {
- double d = CLIP(ri->defgain*ri->data[i][j]);
- if (d>64000)
- continue;
- double dp = d*d*d*d*d*d;
- if (ISRED(ri,i,j)) {
- avg_r += dp;
- rn++;
- }
- else if (ISGREEN(ri,i,j)) {
- avg_g += dp;
- gn++;
- }
- else if (ISBLUE(ri,i,j)) {
- avg_b += dp;
- bn++;
- }
- }
- }
- }
-
- printf ("AVG: %g %g %g\n", avg_r/rn, avg_g/gn, avg_b/bn);
-
-// double img_r, img_g, img_b;
-// wb.getMultipliers (img_r, img_g, img_b);
-
-// return ColorTemp (pow(avg_r/rn, 1.0/6.0)*img_r, pow(avg_g/gn, 1.0/6.0)*img_g, pow(avg_b/bn, 1.0/6.0)*img_b);
-
- double reds = pow (avg_r/rn, 1.0/6.0) * ri->camwb_red;
- double greens = pow (avg_g/gn, 1.0/6.0) * ri->camwb_green;
- double blues = pow (avg_b/bn, 1.0/6.0) * ri->camwb_blue;
-
- double rm = coeff[0][0]*reds + coeff[0][1]*greens + coeff[0][2]*blues;
- double gm = coeff[1][0]*reds + coeff[1][1]*greens + coeff[1][2]*blues;
- double bm = coeff[2][0]*reds + coeff[2][1]*greens + coeff[2][2]*blues;
-
- return ColorTemp (rm, gm, bm);
-}
+}
+
+ ColorTemp RawImageSource::getAutoWB () {
+
+ double avg_r = 0;
+ double avg_g = 0;
+ double avg_b = 0;
+ int rn = 0, gn = 0, bn = 0;
+
+ if (fuji) {
+ for (int i=32; iheight-32; i++) {
+ int fw = ri->fuji_width;
+ int start = ABS(fw-i) + 32;
+ int end = MIN(ri->height+ri->width-fw-i, fw+i) - 32;
+ for (int j=start; jfilters) {
+ double d = CLIP(ri->defgain*ri->data[i][3*j]);
+ if (d>64000)
+ continue;
+ avg_r += d; rn++;
+ d = CLIP(ri->defgain*ri->data[i][3*j+1]);
+ if (d>64000)
+ continue;
+ avg_g += d; gn++;
+ d = CLIP(ri->defgain*ri->data[i][3*j+2]);
+ if (d>64000)
+ continue;
+ avg_b += d; bn++;
+ }
+ else {
+ double d = CLIP(ri->defgain*ri->data[i][j]);
+ if (d>64000)
+ continue;
+ double dp = d;
+ if (ISRED(ri,i,j)) {
+ avg_r += dp;
+ rn++;
+ }
+ else if (ISGREEN(ri,i,j)) {
+ avg_g += dp;
+ gn++;
+ }
+ else if (ISBLUE(ri,i,j)) {
+ avg_b += dp;
+ bn++;
+ }
+ }
+ }
+ }
+ }
+ else {
+ if (!ri->filters) {
+ for (int i=32; iheight-32; i++)
+ for (int j=32; jwidth-32; j++) {
+ double dr = CLIP(ri->defgain*ri->data[i][3*j]);
+ double dg = CLIP(ri->defgain*ri->data[i][3*j+1]);
+ double db = CLIP(ri->defgain*ri->data[i][3*j+2]);
+ if (dr>64000 || dg>64000 || db>64000) continue;
+ avg_r += dr; rn++;
+ avg_g += dg;
+ avg_b += db;
+ }
+ gn = rn; bn=rn;
+ } else {
+ //determine GRBG coset; (ey,ex) is the offset of the R subarray
+ int ey, ex;
+ if (ISGREEN(ri,0,0)) {//first pixel is G
+ if (ISRED(ri,0,1)) {ey=0; ex=1;} else {ey=1; ex=0;}
+ } else {//first pixel is R or B
+ if (ISRED(ri,0,0)) {ey=0; ex=0;} else {ey=1; ex=1;}
+ }
+ double d[2][2];
+ for (int i=32; iheight-32; i+=2)
+ for (int j=32; jwidth-32; j+=2) {
+ //average a Bayer quartet if nobody is clipped
+ d[0][0] = CLIP(ri->defgain*ri->data[i][j]);
+ d[0][1] = CLIP(ri->defgain*ri->data[i][j+1]);
+ d[1][0] = CLIP(ri->defgain*ri->data[i+1][j]);
+ d[1][1] = CLIP(ri->defgain*ri->data[i+1][j+1]);
+ if ( d[0][0]>64000 || d[0][1]>64000 || d[1][0]>64000 || d[1][1]>64000 ) continue;
+ avg_r += d[ey][ex];
+ avg_g += d[1-ey][ex] + d[ey][1-ex];
+ avg_b += d[1-ey][1-ex];
+ rn++;
+ }
+ gn = 2*rn;
+ bn = rn;
+ }
+ }
+
+ printf ("AVG: %g %g %g\n", avg_r/rn, avg_g/gn, avg_b/bn);
+
+ // double img_r, img_g, img_b;
+ // wb.getMultipliers (img_r, img_g, img_b);
+
+ // return ColorTemp (pow(avg_r/rn, 1.0/6.0)*img_r, pow(avg_g/gn, 1.0/6.0)*img_g, pow(avg_b/bn, 1.0/6.0)*img_b);
+
+ double reds = avg_r/rn * ri->camwb_red;
+ double greens = avg_g/gn * ri->camwb_green;
+ double blues = avg_b/bn * ri->camwb_blue;
+
+ double rm = coeff[0][0]*reds + coeff[0][1]*greens + coeff[0][2]*blues;
+ double gm = coeff[1][0]*reds + coeff[1][1]*greens + coeff[1][2]*blues;
+ double bm = coeff[2][0]*reds + coeff[2][1]*greens + coeff[2][2]*blues;
+
+ return ColorTemp (rm, gm, bm);
+ }
+
void RawImageSource::transformPosition (int x, int y, int tran, int& ttx, int& tty) {
@@ -2003,77 +2006,83 @@ void RawImageSource::transformPosition (int x, int y, int tran, int& ttx, int& t
tty = ty;
}
}
+
ColorTemp RawImageSource::getSpotWB (std::vector red, std::vector green, std::vector& blue, int tran) {
int x; int y;
- int d[9][2] = {{0,0}, {-1,-1}, {-1,0}, {-1,1}, {0,-1}, {0,1}, {1,-1}, {1,0}, {1,1}};
double reds = 0, greens = 0, blues = 0;
- int rn = 0, gn = 0, bn = 0;
+ int rn = 0;
if (!ri->filters) {
+ int xmin, xmax, ymin, ymax;
+ int xr, xg, xb, yr, yg, yb;
for (int i=0; i=0 && y>=0 && xdata[y][3*x];
- rn++;
- }
- transformPosition (green[i].x, green[i].y, tran, x, y);
- if (x>=0 && y>=0 && xdata[y][3*x+1];
- gn++;
- }
- transformPosition (blue[i].x, blue[i].y, tran, x, y);
- if (x>=0 && y>=0 && xdata[y][3*x+2];
- bn++;
+ transformPosition (red[i].x, red[i].y, tran, xr, yr);
+ transformPosition (green[i].x, green[i].y, tran, xg, yg);
+ transformPosition (blue[i].x, blue[i].y, tran, xb, yb);
+ if (ri->defgain*ri->data[y][3*x]>52500 || ri->defgain*ri->data[y][3*x+1]>52500 || ri->defgain*ri->data[y][3*x+2]>52500) continue;
+ xmin = MIN(xr,MIN(xg,xb));
+ xmax = MAX(xr,MAX(xg,xb));
+ ymin = MIN(yr,MIN(yg,yb));
+ ymax = MAX(yr,MAX(yg,yb));
+ if (xmin>=0 && ymin>=0 && xmaxdata[yr][3*xr];
+ greens += ri->data[yg][3*xg+1];
+ blues += ri->data[yb][3*xb+2];
+ rn++;
}
}
+
+ } else {
+
+ int d[9][2] = {{0,0}, {-1,-1}, {-1,0}, {-1,1}, {0,-1}, {0,1}, {1,-1}, {1,0}, {1,1}};
+ int rloc, gloc, bloc, rnbrs, gnbrs, bnbrs;
+ for (int i=0; i=0 && yv>=0 && xvdata[yv][xv];
+ rnbrs++;
+ continue;
+ }
+ if (ISGREEN(ri,yv,xv) && xv>=0 && yv>=0 && xvdata[yv][xv];
+ gnbrs++;
+ continue;
+ }
+ if (ISBLUE(ri,yv,xv) && xv>=0 && yv>=0 && xvdata[yv][xv];
+ bnbrs++;
+ continue;
+ }
+ }
+ rloc /= rnbrs; gloc /= gnbrs; bloc /= bnbrs;
+ if (rloc*ri->defgain<64000 && gloc*ri->defgain<64000 && bloc*ri->defgain<64000) {
+ reds += rloc; greens += gloc; blues += bloc; rn++;
+ }
+ //transformPosition (green[i].x, green[i].y, tran, x, y);//these are redundant now ??? if not, repeat for these blocks same as for red[]
+ //transformPosition (blue[i].x, blue[i].y, tran, x, y);
+ }
}
- else {
- for (int i=0; i=0 && yv>=0 && xvdata[yv][xv];
- rn++;
- break;
- }
- }
- transformPosition (green[i].x, green[i].y, tran, x, y);
- for (int k=0; k<9; k++) {
- int xv = x + d[k][0];
- int yv = y + d[k][1];
- if (ISGREEN(ri,yv,xv) && xv>=0 && yv>=0 && xvdata[yv][xv];
- gn++;
- break;
- }
- }
- transformPosition (blue[i].x, blue[i].y, tran, x, y);
- for (int k=0; k<9; k++) {
- int xv = x + d[k][0];
- int yv = y + d[k][1];
- if (ISBLUE(ri,yv,xv) && xv>=0 && yv>=0 && xvdata[yv][xv];
- bn++;
- break;
- }
- }
- }
- }
-
- reds = reds/rn * ri->camwb_red;
- greens = greens/gn * ri->camwb_green;
- blues = blues/bn * ri->camwb_blue;
-
- double rm = coeff[0][0]*reds + coeff[0][1]*greens + coeff[0][2]*blues;
- double gm = coeff[1][0]*reds + coeff[1][1]*greens + coeff[1][2]*blues;
- double bm = coeff[2][0]*reds + coeff[2][1]*greens + coeff[2][2]*blues;
-
- return ColorTemp (rm, gm, bm);
+
+ if (2*rn < red.size()) {
+ return ColorTemp ();
+ }
+ else {
+ reds = reds/rn * ri->camwb_red;
+ greens = greens/rn * ri->camwb_green;
+ blues = blues/rn * ri->camwb_blue;
+
+ double rm = coeff[0][0]*reds + coeff[0][1]*greens + coeff[0][2]*blues;
+ double gm = coeff[1][0]*reds + coeff[1][1]*greens + coeff[1][2]*blues;
+ double bm = coeff[2][0]*reds + coeff[2][1]*greens + coeff[2][2]*blues;
+
+ return ColorTemp (rm, gm, bm);
+ }
}
#define FORCC for (c=0; c < colors; c++)
diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc
index 0e4994adb..a0c478b61 100644
--- a/rtengine/refreshmap.cc
+++ b/rtengine/refreshmap.cc
@@ -110,6 +110,8 @@ IMPULSEDENOISE, // EvIDNThresh,
DIRPYRDENOISE, // EvDPDNEnabled,
DIRPYRDENOISE, // EvDPDNLuma,
DIRPYRDENOISE, // EvDPDNChroma,
-DIRPYRDENOISE // EvDPDNGamma,
+DIRPYRDENOISE, // EvDPDNGamma,
+DIRPYREQUALIZER, // EvDirPyrEqualizer
+DIRPYREQUALIZER // EvDirPyrEqlEnabled
};
diff --git a/rtengine/refreshmap.h b/rtengine/refreshmap.h
index 90073c563..0364f3a32 100644
--- a/rtengine/refreshmap.h
+++ b/rtengine/refreshmap.h
@@ -39,6 +39,7 @@
#define EXIF 32768
#define IPTC 32768
#define EQUALIZER 3
+#define DIRPYREQUALIZER 3
#define NONE 0
#define M_INIT 128
diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc
index 7a7cff322..2f7c182bb 100644
--- a/rtengine/rtthumbnail.cc
+++ b/rtengine/rtthumbnail.cc
@@ -116,18 +116,19 @@ Thumbnail* Thumbnail::loadFromImage (const Glib::ustring& fname, int &w, int &h,
double avg_g = 0;
double avg_b = 0;
int n = 0;
- int p = 6;
for (int i=1; iheight-1; i++)
for (int j=1; jwidth-1; j++) {
int ofs = 3*(i*img->width + j);
- if (img->data[ofs]>250 || img->data[ofs+1]>250 || img->data[ofs+2]>250)
+ int rtmp=img->data[ofs], gtmp=img->data[ofs+1], btmp=img->data[ofs+2];
+ if (rtmp>64000 || gtmp>64000 || btmp>64000)
continue;
- avg_r += StdImageSource::intpow((double)img->data[ofs]*256, p);
- avg_g += StdImageSource::intpow((double)img->data[ofs+1]*256, p);
- avg_b += StdImageSource::intpow((double)img->data[ofs+2]*256, p);
+ avg_r += rtmp;
+ avg_g += gtmp;
+ avg_b += btmp;
n++;
}
- ColorTemp::mul2temp (pow(avg_r/n, 1.0/p), pow(avg_g/n, 1.0/p), pow(avg_b/n, 1.0/p), tpp->autowbTemp, tpp->autowbGreen);
+ if (n>0)
+ ColorTemp::mul2temp (avg_r/n, avg_g/n, avg_b/n, tpp->autowbTemp, tpp->autowbGreen);
delete img;
tpp->init ();
diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc
index 03805bf82..d9abb1082 100644
--- a/rtengine/simpleprocess.cc
+++ b/rtengine/simpleprocess.cc
@@ -166,6 +166,9 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p
// wavelet equalizer
ipf.waveletEqualizer (labView, true, true);
+
+ // directional pyramid equalizer
+ ipf.dirpyrequalizer (labView);
for (int i=0; ib[i][j], p);
n++;
}
- return ColorTemp (pow(avg_r/n, 1.0/p), pow(avg_g/n, 1.0/p), pow(avg_b/n, 1.0/p));
+ return ColorTemp (avg_r/n, avg_g/n, avg_b/n);
+ //return ColorTemp (pow(avg_r/n, 1.0/p), pow(avg_g/n, 1.0/p), pow(avg_b/n, 1.0/p));
}
void StdImageSource::transformPixel (int x, int y, int tran, int& tx, int& ty) {
diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt
index 620df9d75..e6dd87a71 100644
--- a/rtgui/CMakeLists.txt
+++ b/rtgui/CMakeLists.txt
@@ -25,7 +25,7 @@ set (BASESOURCEFILES
batchqueue.cc lwbutton.cc lwbuttonset.cc
batchqueuebuttonset.cc browserfilter.cc exiffiltersettings.cc
profilestore.cc partialpastedlg.cc
- equalizer.cc)
+ equalizer.cc dirpyrequalizer.cc)
if (WIN32)
set (EXTRA_SRC windirmonitor.cc myicon.o)
diff --git a/rtgui/cursormanager.cc b/rtgui/cursormanager.cc
index 0159dcf62..d79255a67 100644
--- a/rtgui/cursormanager.cc
+++ b/rtgui/cursormanager.cc
@@ -31,19 +31,16 @@ void CursorManager::init (Glib::RefPtr mainWin) {
cCropMoving = new Gdk::Cursor (Gdk::HAND2);
cCropSelection = new Gdk::Cursor (Gdk::CROSSHAIR);
cAdd = new Gdk::Cursor (Gdk::PLUS);
-//#ifdef _WIN32
-// cNormal = new Gdk::Cursor (Gdk::LAST_CURSOR);
-//#else
- cNormal = new Gdk::Cursor (Gdk::ARROW);
-//#endif
- Glib::RefPtr hand = safe_create_from_file(argv0+"/images/openhand22.png");
- Glib::RefPtr close_hand = safe_create_from_file(argv0+"/images/closedhand22.png");
- Glib::RefPtr wbpick = safe_create_from_file(argv0+"/images/wbpicker16.png");
- Glib::RefPtr empty = safe_create_from_file(argv0+"/images/empty.png");
- cHand = hand ? new Gdk::Cursor (cNormal->get_display(), hand, 10, 10) : new Gdk::Cursor (Gdk::HAND2);
- cClosedHand = close_hand ? new Gdk::Cursor (cNormal->get_display(), close_hand, 10, 10) : new Gdk::Cursor (Gdk::HAND2);
- cWB = wbpick ? new Gdk::Cursor (cNormal->get_display(), wbpick, 1, 12) : new Gdk::Cursor (Gdk::ARROW);
- cHidden = empty ? new Gdk::Cursor (cNormal->get_display(), empty, 12, 12) : new Gdk::Cursor (Gdk::FLEUR);
+
+ Glib::RefPtr hand = safe_create_from_file(argv0+"/images/openhand22.png");
+ Glib::RefPtr close_hand = safe_create_from_file(argv0+"/images/closedhand22.png");
+ Glib::RefPtr wbpick = safe_create_from_file(argv0+"/images/wbpicker16.png");
+ Glib::RefPtr empty = safe_create_from_file(argv0+"/images/empty.png");
+
+ cHand = hand ? new Gdk::Cursor (cAdd->get_display(), hand, 10, 10) : new Gdk::Cursor (Gdk::HAND2);
+ cClosedHand = close_hand ? new Gdk::Cursor (cAdd->get_display(), close_hand, 10, 10) : new Gdk::Cursor (Gdk::HAND2);
+ cWB = wbpick ? new Gdk::Cursor (cAdd->get_display(), wbpick, 1, 12) : new Gdk::Cursor (Gdk::ARROW);
+ cHidden = empty ? new Gdk::Cursor (cAdd->get_display(), empty, 12, 12) : new Gdk::Cursor (Gdk::FLEUR);
mainWindow = mainWin;
}
@@ -52,7 +49,8 @@ void CursorManager::init (Glib::RefPtr mainWin) {
void CursorManager::setCursor (Glib::RefPtr window, CursorShape shape) {
if (shape==CSArrow)
- window->set_cursor (*cNormal);
+ // set_cursor without any arguments to select system default
+ window->set_cursor ();
else if (shape==CSOpenHand)
window->set_cursor (*cHand);
else if (shape==CSClosedHand)
diff --git a/rtgui/dirpyrequalizer.cc b/rtgui/dirpyrequalizer.cc
new file mode 100644
index 000000000..06630b951
--- /dev/null
+++ b/rtgui/dirpyrequalizer.cc
@@ -0,0 +1,226 @@
+/*
+ * This file is part of RawTherapee.
+ *
+ * RawTherapee is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * RawTherapee is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with RawTherapee. If not, see .
+ *
+ * © 2010 Emil Martinec
+ */
+
+#include
+
+using namespace rtengine;
+using namespace rtengine::procparams;
+
+DirPyrEqualizer::DirPyrEqualizer () : ToolPanel() {
+
+ enabled = Gtk::manage (new Gtk::CheckButton (M("GENERAL_ENABLED")));
+ enabled->set_active (true);
+ pack_start(*enabled);
+ enaConn = enabled->signal_toggled().connect( sigc::mem_fun(*this, &DirPyrEqualizer::enabledToggled) );
+
+ Gtk::HSeparator *separator1 = Gtk::manage (new Gtk::HSeparator());
+ pack_start(*separator1, Gtk::PACK_SHRINK, 2);
+
+ Gtk::HBox * buttonBox1 = Gtk::manage (new Gtk::HBox());
+ pack_start(*buttonBox1, Gtk::PACK_SHRINK, 2);
+
+ Gtk::Button * lumacontrastMinusButton = Gtk::manage (new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMACONTRAST_MINUS")));
+ buttonBox1->pack_start(*lumacontrastMinusButton, Gtk::PACK_SHRINK, 2);
+ lumacontrastMinusPressedConn = lumacontrastMinusButton->signal_pressed().connect( sigc::mem_fun(*this, &DirPyrEqualizer::lumacontrastMinusPressed));
+
+ Gtk::Button * lumaneutralButton = Gtk::manage (new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMANEUTRAL")));
+ buttonBox1->pack_start(*lumaneutralButton, Gtk::PACK_SHRINK, 2);
+ lumaneutralPressedConn = lumaneutralButton->signal_pressed().connect( sigc::mem_fun(*this, &DirPyrEqualizer::lumaneutralPressed));
+
+ Gtk::Button * lumacontrastPlusButton = Gtk::manage (new Gtk::Button(M("TP_DIRPYREQUALIZER_LUMACONTRAST_PLUS")));
+ buttonBox1->pack_start(*lumacontrastPlusButton, Gtk::PACK_SHRINK, 2);
+ lumacontrastPlusPressedConn = lumacontrastPlusButton->signal_pressed().connect( sigc::mem_fun(*this, &DirPyrEqualizer::lumacontrastPlusPressed));
+
+ buttonBox1->show_all_children();
+
+ Gtk::HSeparator *separator2 = Gtk::manage (new Gtk::HSeparator());
+ pack_start(*separator2, Gtk::PACK_SHRINK, 2);
+
+ for(int i = 0; i < 4; i++)
+ {
+ std::stringstream ss;
+ ss << i;
+ if(i == 0)
+ ss << " (" << M("TP_DIRPYREQUALIZER_LUMAFINEST") << ")";
+ if(i == 3)
+ ss << " (" << M("TP_DIRPYREQUALIZER_LUMACOARSEST") << ")";
+ multiplier[i] = new Adjuster (ss.str(), 0, 4, 0.01, 1.0);
+ multiplier[i]->setAdjusterListener(this);
+ pack_start(*multiplier[i]);
+ }
+
+ Gtk::HSeparator *separator3 = Gtk::manage (new Gtk::HSeparator());
+ pack_start(*separator3, Gtk::PACK_SHRINK, 2);
+
+ std::stringstream ss;
+
+ ss << M("TP_DIRPYREQUALIZER_THRESHOLD") ;
+ multiplier[4] = new Adjuster (ss.str(), 0, 1, 0.01, 0.0);
+ multiplier[4]->setAdjusterListener(this);
+ pack_start(*multiplier[4]);
+
+ show_all_children ();
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+}
+
+DirPyrEqualizer::~DirPyrEqualizer () {
+
+}
+
+void DirPyrEqualizer::read (const ProcParams* pp, const ParamsEdited* pedited) {
+
+ disableListener ();
+
+ if (pedited) {
+
+ enabled->set_inconsistent (!pedited->dirpyrequalizer.enabled);
+
+ for(int i = 0; i < 5; i++) {
+ multiplier[i]->setEditedState (pedited->dirpyrequalizer.mult[i] ? Edited : UnEdited);
+ }
+ }
+
+ enaConn.block (true);
+ enabled->set_active (pp->dirpyrequalizer.enabled);
+ enaConn.block (false);
+ lastEnabled = pp->dirpyrequalizer.enabled;
+
+ for (int i = 0; i < 5; i++) {
+ multiplier[i]->setValue(pp->dirpyrequalizer.mult[i]);
+ }
+
+ enableListener ();
+}
+
+void DirPyrEqualizer::write (ProcParams* pp, ParamsEdited* pedited) {
+
+ pp->dirpyrequalizer.enabled = enabled->get_active ();
+
+ for (int i = 0; i < 5; i++) {
+ pp->dirpyrequalizer.mult[i] = multiplier[i]->getValue();
+ }
+
+ if (pedited) {
+
+ pedited->dirpyrequalizer.enabled = !enabled->get_inconsistent();
+
+ for(int i = 0; i < 5; i++) {
+ pedited->dirpyrequalizer.mult[i] = multiplier[i]->getEditedState();
+ }
+ }
+}
+
+void DirPyrEqualizer::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) {
+
+ for (int i = 0; i < 5; i++) {
+ multiplier[i]->setDefault(defParams->dirpyrequalizer.mult[i]);
+ }
+
+ if (pedited) {
+ for (int i = 0; i < 5; i++) {
+ multiplier[i]->setDefaultEditedState(pedited->dirpyrequalizer.mult[i] ? Edited : UnEdited);
+ }
+ }
+ else {
+ for (int i = 0; i < 5; i++) {
+ multiplier[i]->setDefaultEditedState(Irrelevant);
+ }
+ }
+}
+
+void DirPyrEqualizer::setBatchMode (bool batchMode) {
+
+ ToolPanel::setBatchMode (batchMode);
+
+ for (int i = 0; i < 5; i++) {
+ multiplier[i]->showEditedCB();
+ }
+}
+
+void DirPyrEqualizer::adjusterChanged (Adjuster* a, double newval) {
+
+ if (listener && enabled->get_active()) {
+ std::stringstream ss;
+ ss << "(";
+ int i;
+ for (i = 0; i < 5; i++) {
+ if (i > 0) {
+ ss << ", ";
+ }
+ ss << static_cast(multiplier[i]->getValue());
+ }
+ ss << ")";
+ listener->panelChanged (EvDirPyrEqualizer, ss.str());
+ }
+}
+
+void DirPyrEqualizer::enabledToggled () {
+
+ if (batchMode) {
+ if (enabled->get_inconsistent()) {
+ enabled->set_inconsistent (false);
+ enaConn.block (true);
+ enabled->set_active (false);
+ enaConn.block (false);
+ }
+ else if (lastEnabled)
+ enabled->set_inconsistent (true);
+
+ lastEnabled = enabled->get_active ();
+ }
+
+ if (listener) {
+ if (enabled->get_active ())
+ listener->panelChanged (EvDirPyrEqlEnabled, M("GENERAL_ENABLED"));
+ else
+ listener->panelChanged (EvDirPyrEqlEnabled, M("GENERAL_DISABLED"));
+ }
+}
+
+
+void DirPyrEqualizer::lumaneutralPressed () {
+
+ for (int i = 0; i < 4; i++) {
+ multiplier[i]->setValue(1.0);
+ adjusterChanged(multiplier[i], 1.0);
+ }
+}
+
+
+void DirPyrEqualizer::lumacontrastPlusPressed () {
+
+ for (int i = 0; i < 4; i++) {
+ float inc = 0.05 * (4 - i);
+ multiplier[i]->setValue(multiplier[i]->getValue() + inc);
+ adjusterChanged(multiplier[i], multiplier[i]->getValue());
+ }
+}
+
+
+void DirPyrEqualizer::lumacontrastMinusPressed () {
+
+ for (int i = 0; i < 4; i++) {
+ float inc = -0.05 * (4 - i);
+ multiplier[i]->setValue(multiplier[i]->getValue() + inc);
+ adjusterChanged(multiplier[i], multiplier[i]->getValue());
+ }
+}
+
+
diff --git a/rtgui/dirpyrequalizer.h b/rtgui/dirpyrequalizer.h
new file mode 100644
index 000000000..ddad93034
--- /dev/null
+++ b/rtgui/dirpyrequalizer.h
@@ -0,0 +1,59 @@
+/*
+ * This file is part of RawTherapee.
+ *
+ * RawTherapee is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * RawTherapee is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with RawTherapee. If not, see .
+ *
+ * © 2010 Emil Martinec
+ */
+
+#ifndef DIRPYREQUALIZER_H_INCLUDED
+#define DIRPYREQUALIZER_H_INCLUDED
+
+#include
+#include
+#include
+
+class DirPyrEqualizer : public Gtk::VBox, public AdjusterListener, public ToolPanel
+{
+
+protected:
+
+ Gtk::CheckButton * enabled;
+ Adjuster* multiplier[5];
+
+ sigc::connection enaConn;
+ sigc::connection lumaneutralPressedConn;
+ sigc::connection lumacontrastPlusPressedConn;
+ sigc::connection lumacontrastMinusPressedConn;
+
+ bool lastEnabled;
+
+public:
+
+ DirPyrEqualizer ();
+ virtual ~DirPyrEqualizer ();
+
+ void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited=NULL);
+ void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited=NULL);
+ void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited=NULL);
+ void setBatchMode (bool batchMode);
+
+ void adjusterChanged (Adjuster* a, double newval);
+ void enabledToggled ();
+ void lumaneutralPressed ();
+ void lumacontrastPlusPressed ();
+ void lumacontrastMinusPressed ();
+};
+
+#endif
diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc
index 5cb513c87..a423aca92 100644
--- a/rtgui/editorpanel.cc
+++ b/rtgui/editorpanel.cc
@@ -504,18 +504,25 @@ void EditorPanel::error (Glib::ustring descr) {
void EditorPanel::info_toggled () {
- if(!ipc)
- return;
Glib::ustring infoString;
const rtengine::ImageMetaData* idata = ipc->getInitialImage()->getMetaData();
if (idata && idata->hasExif())
- infoString = Glib::ustring::compose ("%1 %2\nF/%3 %4 sec\n%5: %6\n%7: %8 mm\n",
- Glib::ustring(idata->getMake()), Glib::ustring(idata->getModel()),
- Glib::ustring(idata->apertureToString(idata->getFNumber())), Glib::ustring(idata->shutterToString(idata->getShutterSpeed())),
+// infoString = Glib::ustring::compose ("%1 %2\nF/%3 %4 sec\n%5: %6\n%7: %8 mm\n",
+// Glib::ustring(idata->getMake()), Glib::ustring(idata->getModel()),
+// Glib::ustring(idata->apertureToString(idata->getFNumber())), Glib::ustring(idata->shutterToString(idata->getShutterSpeed())),
+// M("QINFO_ISO"), idata->getISOSpeed(),
+// M("QINFO_FOCALLENGTH"), idata->getFocalLen())
+// + Glib::ustring::compose ("%1: %2", M("QINFO_LENS"), Glib::ustring(idata->getLens()));
+ infoString = Glib::ustring::compose (
+ "%1 + %2\n%3s f/%4 %5%6 f=%7mm",
+ Glib::ustring(idata->getModel()),
+ Glib::ustring(idata->getLens()),
+ Glib::ustring(idata->shutterToString(idata->getShutterSpeed())),
+ Glib::ustring(idata->apertureToString(idata->getFNumber())),
M("QINFO_ISO"), idata->getISOSpeed(),
- M("QINFO_FOCALLENGTH"), idata->getFocalLen())
- + Glib::ustring::compose ("%1: %2", M("QINFO_LENS"), Glib::ustring(idata->getLens()));
+ idata->getFocalLen()
+ );
else
infoString = M("QINFO_NOEXIF");
@@ -895,8 +902,8 @@ bool EditorPanel::idle_sentToGimp(ProgressConnector *pc,rtengine::IImage16*
void EditorPanel::saveOptions () {
- options.historyPanelWidth = hpanedl->get_position ();
- options.toolPanelWidth = vboxright->get_width ();
+ //options.historyPanelWidth = hpanedl->get_position ();//older code
+ //options.toolPanelWidth = vboxright->get_width ();//older code
if (options.startupDir==STARTUPDIR_LAST && fCatalog->lastSelectedDir ()!="")
options.startupPath = fCatalog->lastSelectedDir ();
}
@@ -986,4 +993,4 @@ bool EditorPanel::on_expose_event(GdkEventExpose* event)
fCatalog->redrawAll();
}
return Gtk::VBox::on_expose_event(event);
-}
\ No newline at end of file
+}
diff --git a/rtgui/filepanel.cc b/rtgui/filepanel.cc
index 8a9e8fe9a..6c62b8289 100644
--- a/rtgui/filepanel.cc
+++ b/rtgui/filepanel.cc
@@ -165,8 +165,9 @@ bool FilePanel::imageLoaded( Thumbnail* thm, ProgressConnectorget_position ();
- options.dirBrowserHeight = placespaned->get_position ();
+ //options.dirBrowserWidth = dirpaned->get_position ();
+ //options.dirBrowserHeight = placespaned->get_position ();
+ //options.browserToolPanelWidth = get_position();
if (options.startupDir==STARTUPDIR_LAST && fileCatalog->lastSelectedDir ()!="")
options.startupPath = fileCatalog->lastSelectedDir ();
fileCatalog->closeDir ();
diff --git a/rtgui/imagearea.cc b/rtgui/imagearea.cc
index 36ee34705..167670c0a 100644
--- a/rtgui/imagearea.cc
+++ b/rtgui/imagearea.cc
@@ -112,7 +112,8 @@ void ImageArea::setInfoText (Glib::ustring text) {
fontd.set_weight (Pango::WEIGHT_BOLD);
fontd.set_size (12*Pango::SCALE);
context->set_font_description (fontd);
- ilayout = create_pango_layout(text);
+ ilayout = create_pango_layout("");
+ ilayout->set_markup(text);
int iw, ih;
ilayout->get_pixel_size (iw, ih);
ipixbuf = Gdk::Pixbuf::create (Gdk::COLORSPACE_RGB, true, 8, iw+8, ih+8);
diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc
index 68c76b3d3..420fa6af4 100644
--- a/rtgui/paramsedited.cc
+++ b/rtgui/paramsedited.cc
@@ -126,9 +126,12 @@ void ParamsEdited::set (bool v) {
icm.working = v;
icm.output = v;
equalizer.enabled = v;
- for(int i = 0; i < 8; i++)
+ dirpyrequalizer.enabled = v;
+
+ for(int i = 0; i < 5; i++)
{
equalizer.c[i] = v;
+ dirpyrequalizer.mult[i] = v;
}
exif.clear ();
iptc.clear ();
@@ -250,6 +253,10 @@ void ParamsEdited::initFrom (const std::vector
for(int i = 0; i < 8; i++) {
equalizer.c[i] = equalizer.c[i] && p.equalizer.c[i] == other.equalizer.c[i];
}
+ dirpyrequalizer.enabled = dirpyrequalizer.enabled && p.dirpyrequalizer.enabled == other.dirpyrequalizer.enabled;
+ for(int i = 0; i < 8; i++) {
+ dirpyrequalizer.mult[i] = dirpyrequalizer.mult[i] && p.dirpyrequalizer.mult[i] == other.dirpyrequalizer.mult[i];
+ }
// exif = exif && p.exif==other.exif
// iptc = other.iptc;
}
@@ -361,6 +368,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
for(int i = 0; i < 8; i++) {
if(equalizer.c[i]) toEdit.equalizer.c[i] = mods.equalizer.c[i];
}
+ if (dirpyrequalizer.enabled) toEdit.dirpyrequalizer.enabled = mods.dirpyrequalizer.enabled;
+ for(int i = 0; i < 8; i++) {
+ if(dirpyrequalizer.mult[i]) toEdit.dirpyrequalizer.mult[i] = mods.dirpyrequalizer.mult[i];
+ }
// if (exif) toEdit.exif==mo.exif = mods.exif==other.exif;
// if (iptc;) toEdit.iptc==other.iptc; = mods.iptc==other.iptc;;
}
diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h
index 8f9cd9569..f7c28385c 100644
--- a/rtgui/paramsedited.h
+++ b/rtgui/paramsedited.h
@@ -239,6 +239,13 @@ class EqualizerParamsEdited {
bool c[8];
};
+class DirPyrEqualizerParamsEdited {
+
+public:
+ bool enabled;
+ bool mult[8];
+};
+
class ExifPairEdited {
public:
@@ -282,6 +289,7 @@ class ParamsEdited {
ResizeParamsEdited resize;
ColorManagementParamsEdited icm;
EqualizerParamsEdited equalizer;
+ DirPyrEqualizerParamsEdited dirpyrequalizer;
std::vector exif;
std::vector iptc;
diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc
index 4c104dd85..1310d9c84 100644
--- a/rtgui/partialpastedlg.cc
+++ b/rtgui/partialpastedlg.cc
@@ -42,6 +42,8 @@ PartialPasteDlg::PartialPasteDlg () {
lumaden = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LUMADENOISE")));
lumacurve = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_LUMACURVE")));
sh = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_SHADOWSHIGHLIGHTS")));
+ dirpyreq = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYREQUALIZER")));
+ waveq = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_WAVELETEQUALIZER")));
// options in color:
colormixer = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_COLORMIXER")));
@@ -87,6 +89,8 @@ PartialPasteDlg::PartialPasteDlg () {
vboxes[1]->pack_start (*lumaden, Gtk::PACK_SHRINK, 2);
vboxes[1]->pack_start (*lumacurve, Gtk::PACK_SHRINK, 2);
vboxes[1]->pack_start (*sh, Gtk::PACK_SHRINK, 2);
+ vboxes[1]->pack_start (*dirpyreq, Gtk::PACK_SHRINK, 2);
+ vboxes[1]->pack_start (*waveq, Gtk::PACK_SHRINK, 2);
vboxes[2]->pack_start (*color, Gtk::PACK_SHRINK, 2);
vboxes[2]->pack_start (*hseps[2], Gtk::PACK_SHRINK, 2);
@@ -150,6 +154,8 @@ PartialPasteDlg::PartialPasteDlg () {
lumadenConn = lumaden->signal_toggled().connect (sigc::bind (sigc::mem_fun(*luminance, &Gtk::CheckButton::set_inconsistent), true));
lumacurveConn = lumacurve->signal_toggled().connect (sigc::bind (sigc::mem_fun(*luminance, &Gtk::CheckButton::set_inconsistent), true));
shConn = sh->signal_toggled().connect (sigc::bind (sigc::mem_fun(*luminance, &Gtk::CheckButton::set_inconsistent), true));
+ dirpyreqConn = dirpyreq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*luminance, &Gtk::CheckButton::set_inconsistent), true));
+ waveqConn = waveq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*luminance, &Gtk::CheckButton::set_inconsistent), true));
colormixerConn = colormixer->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true));
colorshiftConn = colorshift->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true));
@@ -201,6 +207,8 @@ void PartialPasteDlg::luminanceToggled () {
lumadenConn.block (true);
lumacurveConn.block (true);
shConn.block (true);
+ dirpyreqConn.block (true);
+ waveqConn.block (true);
luminance->set_inconsistent (false);
@@ -209,12 +217,16 @@ void PartialPasteDlg::luminanceToggled () {
lumaden->set_active (luminance->get_active ());
lumacurve->set_active (luminance->get_active ());
sh->set_active (luminance->get_active ());
+ dirpyreq->set_active (luminance->get_active ());
+ waveq->set_active (luminance->get_active ());
sharpenConn.block (false);
impdenConn.block (false);
lumadenConn.block (false);
lumacurveConn.block (false);
shConn.block (false);
+ dirpyreqConn.block (false);
+ waveqConn.block (false);
}
void PartialPasteDlg::colorToggled () {
@@ -306,6 +318,8 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dst, const r
if (lumaden->get_active ()) dst->lumaDenoise = src->lumaDenoise;
if (lumacurve->get_active ()) dst->lumaCurve = src->lumaCurve;
if (sh->get_active ()) dst->sh = src->sh;
+ if (dirpyreq->get_active ()) dst->dirpyrequalizer = src->dirpyrequalizer;
+ if (waveq->get_active ()) dst->equalizer = src->equalizer;
if (colormixer->get_active ()) dst->chmixer = src->chmixer;
if (colorshift->get_active ()) dst->colorShift = src->colorShift;
diff --git a/rtgui/partialpastedlg.h b/rtgui/partialpastedlg.h
index bede56698..3c4dcb152 100644
--- a/rtgui/partialpastedlg.h
+++ b/rtgui/partialpastedlg.h
@@ -44,6 +44,8 @@ class PartialPasteDlg : public Gtk::Dialog {
Gtk::CheckButton* lumaden;
Gtk::CheckButton* lumacurve;
Gtk::CheckButton* sh;
+ Gtk::CheckButton* dirpyreq;
+ Gtk::CheckButton* waveq;
// options in color:
Gtk::CheckButton* colormixer;
@@ -71,7 +73,7 @@ class PartialPasteDlg : public Gtk::Dialog {
sigc::connection basicConn, luminanceConn, colorConn, lensConn, compositionConn, metaicmConn;
sigc::connection wbConn, exposureConn, hlrecConn;
- sigc::connection sharpenConn, impdenConn, lumadenConn, lumacurveConn, shConn;
+ sigc::connection sharpenConn, impdenConn, lumadenConn, lumacurveConn, shConn, dirpyreqConn, waveqConn;
sigc::connection colormixerConn, colorshiftConn, colorboostConn, colordenConn, dirpyrdenConn;
sigc::connection distortionConn, cacorrConn, vignettingConn;
sigc::connection coarserotConn, finerotConn, cropConn, resizeConn;
diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc
index 76fc10180..51837a727 100644
--- a/rtgui/toolpanelcoord.cc
+++ b/rtgui/toolpanelcoord.cc
@@ -56,6 +56,7 @@ ToolPanelCoordinator::ToolPanelCoordinator () : ipc(NULL) {
exifpanel = Gtk::manage (new ExifPanel ());
iptcpanel = Gtk::manage (new IPTCPanel ());
equalizer = Gtk::manage (new Equalizer ());
+ dirpyrequalizer = Gtk::manage (new DirPyrEqualizer ());
addPanel (colorPanel, whitebalance, M("TP_WBALANCE_LABEL")); toolPanels.push_back (whitebalance);
addPanel (exposurePanel, curve, M("TP_EXPOSURE_LABEL")); toolPanels.push_back (curve);
@@ -70,6 +71,7 @@ ToolPanelCoordinator::ToolPanelCoordinator () : ipc(NULL) {
addPanel (detailsPanel, lumadenoise, M("TP_LUMADENOISE_LABEL")); toolPanels.push_back (lumadenoise);
addPanel (detailsPanel, colordenoise, M("TP_COLORDENOISE_LABEL")); toolPanels.push_back (colordenoise);
addPanel (detailsPanel, dirpyrdenoise, M("TP_DIRPYRDENOISE_LABEL")); toolPanels.push_back (dirpyrdenoise);
+ addPanel (detailsPanel, dirpyrequalizer, M("TP_DIRPYREQUALIZER_LABEL")); toolPanels.push_back (dirpyrequalizer);
addPanel (detailsPanel, equalizer, M("TP_EQUALIZER_LABEL")); toolPanels.push_back (equalizer);
addPanel (transformPanel, crop, M("TP_CROP_LABEL")); toolPanels.push_back (crop);
addPanel (transformPanel, resize, M("TP_RESIZE_LABEL")); toolPanels.push_back (resize);
diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h
index 363c4a358..d9ba10a1e 100644
--- a/rtgui/toolpanelcoord.h
+++ b/rtgui/toolpanelcoord.h
@@ -54,6 +54,7 @@
#include
#include
#include
+#include
class ImageEditorCoordinator;
@@ -92,6 +93,7 @@ class ToolPanelCoordinator : public ToolPanelListener,
Sharpening* sharpening;
LCurve* lcurve;
Equalizer * equalizer;
+ DirPyrEqualizer * dirpyrequalizer;
std::vector paramcListeners;
diff --git a/tools/osx/make-app-bundle b/tools/osx/make-app-bundle
index b10504343..25ee1013e 100755
--- a/tools/osx/make-app-bundle
+++ b/tools/osx/make-app-bundle
@@ -29,7 +29,7 @@ ETC=${MACOS}/etc
LIB=${MACOS}/lib
SHARE=${MACOS}/share
RELEASE=release
-DMG=${RELEASE}/rawtherapee_osx105_`date "+%Y-%m-%d"`_release-3.0-a1+`hg log | head -1 | cut -f 4 -d ' ' | sed 's/:/-/g'`.dmg
+DMG=${RELEASE}/rawtherapee_osx105_`date +%F`_`hg parents --template '{latesttag}+{latesttagdistance}-{node|short}'`.dmg
EXECUTABLE=rt
#Find where MacPorts is installed. We take a known binary (cmake), which is in /bin, and