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