diff --git a/AUTHORS.txt b/AUTHORS.txt
index 227390faa..aae24ff63 100644
--- a/AUTHORS.txt
+++ b/AUTHORS.txt
@@ -7,6 +7,7 @@ Development contributors, in last name alphabetical order:
Roel Baars
Martin Burri
+ Pierre Cabrera
Javier Celaya
Jacques Desmis
Pavlov Dmitry
@@ -20,6 +21,7 @@ Development contributors, in last name alphabetical order:
Steve Herrell
Philippe Hupé
Wolfgang Kuehnel
+ Lawrence Lee
Guokai Ma
Emil Martinec
Wyatt Olson
@@ -36,8 +38,9 @@ Development contributors, in last name alphabetical order:
Ingo Weyrich
Makoto Yoshida
-Other contributors (profiles, ideas, mockups, testing, forum activity, translations, etc.), in last name alphabetical order:
+Other contributors (profiles, ideas, mockups, testing, forum activity, translations, tutorials etc.), in last name alphabetical order:
+ Andy Astbury
Marcin Bajor
Javier Bartol
Thorsten Bartolomäus
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e3ae3b7ff..b7cf35099 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -44,6 +44,13 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION
"Building RawTherapee requires using GCC version 4.9 or higher!")
endif()
+# Warning for GCC 10, which causes problems #5749:
+if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "10.0")
+ message(STATUS "WARNING: gcc ${CMAKE_CXX_COMPILER_VERSION} is known to miscompile RawTherapee when using -ftree-loop-vectorize, forcing the option to be off")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-tree-loop-vectorize")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-tree-loop-vectorize")
+endif()
+
# We might want to build using the old C++ ABI, even when using a new GCC
# version:
if(USE_OLD_CXX_ABI)
@@ -68,6 +75,11 @@ set(CACHE_NAME_SUFFIX
""
CACHE STRING "RawTherapee's cache folder suffix")
+# For macOS only, OSX_DEV_BUILD option allows using relative paths instead of absolute
+# paths. Consequently, for development builds, application can be launching without
+# being bundled. However, file access can be restricted for some folder.
+option(OSX_DEV_BUILD "Generate macOS development builds" OFF)
+
# By default we don't use a specific processor target, so PROC_TARGET_NUMBER is
# set to 0. Specify other values to optimize for specific processor architecture
# as listed in ProcessorTargets.cmake:
@@ -128,6 +140,10 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PROC_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=unused-label")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=delete-incomplete")
+# Do net set math errno, as we never check its value.
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-math-errno")
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-math-errno")
+
# Special treatment for x87 and x86-32 SSE (see GitHub issue #4324)
include(FindX87Math)
if(HAVE_X87_MATH)
@@ -665,7 +681,14 @@ if(WIN32)
elseif(APPLE)
set(
ABOUT_COMMAND_WITH_ARGS
- cmake -DPROJECT_SOURCE_DIR:STRING=${PROJECT_SOURCE_DIR} -P ${PROJECT_SOURCE_DIR}/UpdateInfo.cmake -DSYSTEM:STRING=Apple -DCXX_FLAGS:STRING=${CXX_FLAGS} -DLFLAGS:STRING=${LFLAGS} -DCOMPILER_INFO:STRING=${COMPILER_INFO} -DCACHE_NAME_SUFFIX:STRING=${CACHE_NAME_SUFFIX})
+ cmake
+ -DPROJECT_SOURCE_DIR:STRING=${PROJECT_SOURCE_DIR}
+ -DCACHE_NAME_SUFFIX:STRING=${CACHE_NAME_SUFFIX}
+ -P ${PROJECT_SOURCE_DIR}/UpdateInfo.cmake
+ -DSYSTEM:STRING=Apple
+ -DCXX_FLAGS:STRING=${CXX_FLAGS}
+ -DLFLAGS:STRING=${LFLAGS}
+ -DCOMPILER_INFO:STRING=${COMPILER_INFO})
else()
list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Linux
-DCXX_FLAGS:STRING=${CXX_FLAGS} -DLFLAGS:STRING=${LFLAGS}
diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech
index 19182a1e5..b6006cd36 100644
--- a/rtdata/languages/Czech
+++ b/rtdata/languages/Czech
@@ -40,10 +40,12 @@
#39 2017-07-21 updated by mkyral
#40 2017-12-13 updated by mkyral
#41 2018-03-03 updated by mkyral
-#42 2018-04-28 updated by mkyral
-#43 2018-12-13 updated by mkyral
-#44 2019-04-17 updated by mkyral
-
+#42 2018-10-24 updated by mkyral
+#43 2018-12-04 updated by mkyral
+#44 2018-12-13 updated by mkyral
+#45 2020-04-20 updated by mkyral
+#46 2020-04-21 updated by mkyral
+#47 2020-06-02 updated by mkyral
ABOUT_TAB_BUILD;Verze
ABOUT_TAB_CREDITS;Zásluhy
ABOUT_TAB_LICENSE;Licence
@@ -153,7 +155,7 @@ FILEBROWSER_APPLYPROFILE;Použít
FILEBROWSER_APPLYPROFILE_PARTIAL;Aplikovat - částečně
FILEBROWSER_AUTODARKFRAME;Automatický tmavý snímek
FILEBROWSER_AUTOFLATFIELD;Auto Flat Field
-FILEBROWSER_BROWSEPATHBUTTONHINT;Klikněte pro otevření zadané cesty, obnovte složku a aplikujte klíčové slovo "find".
+FILEBROWSER_BROWSEPATHBUTTONHINT;Klikněte pro otevření zadané cesty, obnovte složku a aplikujte klíčová slova z pole "Najít:".
FILEBROWSER_BROWSEPATHHINT;Vložte cestu pro procházení.\n\nKlávesové zkratky:\nCtrl-o pro přepnutí do adresního řádku.\nEnter/ Ctrl-Enter pro procházení ;\nEsc pro zrušení změn.\nShift-Esc pro zrušení přepnutí.\n\nZkratky pro cesty:\n~\t- domácí složka uživatele.\n!\t- složka s obrázky uživatele.
FILEBROWSER_CACHE;Mezipaměť
FILEBROWSER_CACHECLEARFROMFULL;Smazat vše včetně profilů zpracování v mezipaměti
@@ -163,8 +165,12 @@ FILEBROWSER_COLORLABEL_TOOLTIP;Barevný štítek.\n\nPoužijte výběr ze seznam
FILEBROWSER_COPYPROFILE;Kopírovat
FILEBROWSER_CURRENT_NAME;Současné jméno:
FILEBROWSER_DARKFRAME;Tmavý snímek
-FILEBROWSER_DELETEDIALOG_HEADER;Potvrzení smazání souboru
+FILEBROWSER_DELETEDIALOG_ALL;Jste si jisti, že chcete trvale vymazat %1 vybraných souborů?
+FILEBROWSER_DELETEDIALOG_HEADER;Potvrzení smazání souboru:
+FILEBROWSER_DELETEDIALOG_SELECTED;Jste si jisti, že chcete trvale vymazat %1 vybraných souborů?
+FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Jste si jisti, že chcete trvale vymazat %1 vybraných souborů včetně výstupů dávkového zpracování?
FILEBROWSER_EMPTYTRASH;Vysypat koš
+FILEBROWSER_EMPTYTRASHHINT;Trvale smaže všechny soubory z koše.
FILEBROWSER_EXTPROGMENU;Otevřít pomocí
FILEBROWSER_FLATFIELD;Flat Field
FILEBROWSER_MOVETODARKFDIR;Přesunout do složky tmavých snímků
@@ -198,6 +204,8 @@ FILEBROWSER_POPUPRANK2;Hodnocení 2 **
FILEBROWSER_POPUPRANK3;Hodnocení 3 ***
FILEBROWSER_POPUPRANK4;Hodnocení 4 ****
FILEBROWSER_POPUPRANK5;Hodnocení 5 *****
+FILEBROWSER_POPUPREMOVE;Trvale smazat
+FILEBROWSER_POPUPREMOVEINCLPROC;Trvale smazat, včetně dávkově zpracovaných verzí
FILEBROWSER_POPUPRENAME;Přejmenovat
FILEBROWSER_POPUPSELECTALL;Vybrat vše
FILEBROWSER_POPUPTRASH;Přesunout do koše
@@ -224,6 +232,7 @@ FILEBROWSER_SHOWDIRHINT;Smazat všechny filtry.\nZkratka: d
FILEBROWSER_SHOWEDITEDHINT;Ukázat upravené obrázky.\nZkratka: 7
FILEBROWSER_SHOWEDITEDNOTHINT;Ukázat neupravené obrázky.\nZkratka: 6
FILEBROWSER_SHOWEXIFINFO;Zobrazit Exif informace.\n\nZkratky:\ni - režim více karet editoru,\nAlt-i - režim jedné karty editoru.
+FILEBROWSER_SHOWNOTTRASHHINT;Zobrazit pouze snímky které nejsou v koši.
FILEBROWSER_SHOWORIGINALHINT;Zobrazí pouze originální obrázky.\n\nPokud existuje několik obrázků se stejným názvem, ale rozdílnými příponami, bude jako originál vybrán ten, jehož přípona je nejvýše v seznamu přípon veVolby > Prohlížeč souborů > Analyzované přípony.
FILEBROWSER_SHOWRANK1HINT;Ukázat obrázky hodnocené jednou hvězdičkou.\nZkratka: 1
FILEBROWSER_SHOWRANK2HINT;Ukázat obrázky hodnocené dvěma hvězdičkami.\nZkratka: 2
@@ -260,6 +269,7 @@ GENERAL_DISABLED;Vypnuto
GENERAL_ENABLE;Zapnout
GENERAL_ENABLED;Zapnuto
GENERAL_FILE;Soubor
+GENERAL_HELP;Nápověda
GENERAL_LANDSCAPE;Na šířku
GENERAL_NA;n/a
GENERAL_NO;Ne
@@ -402,11 +412,11 @@ HISTORY_MSG_113;L*a*b* - Ochrana červ. a pleť. tónů
HISTORY_MSG_114;Průchody DCB
HISTORY_MSG_115;Potlačení chybných barev
HISTORY_MSG_116;Vylepšení DCB
-HISTORY_MSG_117;Raw korekce CA - červená
-HISTORY_MSG_118;Raw korekce CA - modrá
+HISTORY_MSG_117;Raw korekce ChA - červená
+HISTORY_MSG_118;Raw korekce ChA - modrá
HISTORY_MSG_119;Filtrovat linkové rušení
HISTORY_MSG_120;Vyrovnání zelené
-HISTORY_MSG_121;Raw korekce CA - automatická
+HISTORY_MSG_121;Raw korekce ChA - automatická
HISTORY_MSG_122;Tmavé snímky - Automatický výběr
HISTORY_MSG_123;Tmavé snímky - Soubor
HISTORY_MSG_124;Korekce bílého bodu
@@ -601,10 +611,10 @@ HISTORY_MSG_314;Vlnka - Gamut - Omezení artefaktů
HISTORY_MSG_315;Vlnka - Zůstatek - Kontrast
HISTORY_MSG_316;Vlnka - Gamut - Ochrana a zaměření pleťových tónů
HISTORY_MSG_317;Vlnka - Gamut - Odstín pleti
-HISTORY_MSG_318;Vlnka - Kontrast - Úrovně světel
-HISTORY_MSG_319;Vlnka - Kontrast - - rozsah světel
-HISTORY_MSG_320;Vlnka - Kontrast - Rozsah stínů
-HISTORY_MSG_321;Vlnka - Kontrast - Úrovně stínů
+HISTORY_MSG_318;Vlnka - Kontrast - Jemnější úrovně
+HISTORY_MSG_319;Vlnka - Kontrast - Jemnější rozsah
+HISTORY_MSG_320;Vlnka - Kontrast - Hrubší rozsah
+HISTORY_MSG_321;Vlnka - Kontrast - Hrubší úrovně
HISTORY_MSG_322;Vlnka - Gamut - Zabránit posunu barev
HISTORY_MSG_323;Vlnka - DH - Místní kontrast
HISTORY_MSG_324;Vlnka - Barevnost - Pastelové
@@ -761,6 +771,12 @@ HISTORY_MSG_490;DRC - Míra
HISTORY_MSG_491;Vyvážení bílé
HISTORY_MSG_492;RGB křivky
HISTORY_MSG_493;L*a*b* úpravy
+HISTORY_MSG_494;Doostření vstupu
+HISTORY_MSG_BLSHAPE;Rozmazat dle úrovně
+HISTORY_MSG_BLURCWAV;Rozmazat barevnost
+HISTORY_MSG_BLURWAV;Rozmazat jas
+HISTORY_MSG_BLUWAV;Útlum
+HISTORY_MSG_CAT02PRESET;Automatické přednastavení Cat02
HISTORY_MSG_CLAMPOOG;Oříznout barvy mimo gamut
HISTORY_MSG_COLORTONING_LABGRID_VALUE;Barevné tónování - Korekce barev
HISTORY_MSG_COLORTONING_LABREGION_AB;Barevné tónování - Korekce barev
@@ -769,7 +785,7 @@ HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;BT -oblast C masky
HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;Barevné tónování - H maska
HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;BT - Světlost
HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;BT - L maska
-HISTORY_MSG_COLORTONING_LABREGION_LIST;BT -
+HISTORY_MSG_COLORTONING_LABREGION_LIST;BT -
HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;BT - oblast masky rozostření
HISTORY_MSG_COLORTONING_LABREGION_OFFSET;BT - oblast posunu
HISTORY_MSG_COLORTONING_LABREGION_POWER;BT - oblast síly
@@ -778,10 +794,15 @@ HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;BT - oblast zobrazené masky
HISTORY_MSG_COLORTONING_LABREGION_SLOPE;BT - oblast sklonu
HISTORY_MSG_DEHAZE_DEPTH;Závoj - Hloubka
HISTORY_MSG_DEHAZE_ENABLED;Odstranění závoje
+HISTORY_MSG_DEHAZE_LUMINANCE;Závoj - Pouze jas
HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Závoj - Ukázat hloubkovou mapu
HISTORY_MSG_DEHAZE_STRENGTH;Závoj - Síla
HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dvojité demozajkování - automatický práh
HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dvojité demozajkování - Práh kontrastu
+HISTORY_MSG_EDGEFFECT;Útlum hrany
+HISTORY_MSG_FILMNEGATIVE_ENABLED;Negativní film
+HISTORY_MSG_FILMNEGATIVE_FILMBASE;Barva podkladu filmu
+HISTORY_MSG_FILMNEGATIVE_VALUES;Film negativní hodnoty
HISTORY_MSG_HISTMATCHING;Automaticky nalezená tónová křivka
HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Výstup - Základní barvy
HISTORY_MSG_ICM_OUTPUT_TEMP;Výstup - ICC-v4 světelný zdroj D
@@ -789,6 +810,7 @@ HISTORY_MSG_ICM_OUTPUT_TYPE;Výstup - Typ
HISTORY_MSG_ICM_WORKING_GAMMA;Pracovní - Gama
HISTORY_MSG_ICM_WORKING_SLOPE;Pracovní - sklon
HISTORY_MSG_ICM_WORKING_TRC_METHOD;Pracovní - Metoda TRC
+HISTORY_MSG_ILLUM;Osvětlení
HISTORY_MSG_LOCALCONTRAST_AMOUNT;Místní kontrast - Míra
HISTORY_MSG_LOCALCONTRAST_DARKNESS;Místní kontrast - Tmavé
HISTORY_MSG_LOCALCONTRAST_ENABLED;Místní kontrast
@@ -796,20 +818,56 @@ HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Místní kontrast - Světlé
HISTORY_MSG_LOCALCONTRAST_RADIUS;Místní kontrast - Poloměr
HISTORY_MSG_METADATA_MODE;Režim kopírování metadat
HISTORY_MSG_MICROCONTRAST_CONTRAST;Mikrokontrast - Práh kontrastu
+HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;DV - Automatický práh
+HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;DV - Automatický poloměr
+HISTORY_MSG_PDSHARPEN_CHECKITER;DV- Automatický počet průchodů
+HISTORY_MSG_PDSHARPEN_CONTRAST;DV - Práh kontrastu
+HISTORY_MSG_PDSHARPEN_ITERATIONS;DV - Průchody
+HISTORY_MSG_PDSHARPEN_RADIUS;DV - Poloměr
+HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;DV - Zvýšení poloměru rohu
HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Metoda demozajkování pohybu
HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Směr filtru linkového rušení
HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;Filtr PDAF linek
+HISTORY_MSG_PREPROCWB_MODE;Režim předzpracování VB
+HISTORY_MSG_PROTAB;Ochrana
HISTORY_MSG_PRSHARPEN_CONTRAST;Doostření - Práh kontrastu
-HISTORY_MSG_RAWCACORR_AUTOIT;Raw korekce CA - Iterace
-HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw korekce CA - Zabránit posunu barev
+HISTORY_MSG_RANGEAB;Rozsah ab
+HISTORY_MSG_RAWCACORR_AUTOIT;Raw korekce ChA - Iterace
+HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw korekce ChA - Zabránit posunu barev
HISTORY_MSG_RAW_BORDER;Okraj Raw
HISTORY_MSG_RESIZE_ALLOWUPSCALING;Změna rozměrů - Povolit zvětšení
HISTORY_MSG_SHARPENING_BLUR;Doostření - Poloměr rozmazání
HISTORY_MSG_SHARPENING_CONTRAST;Doostření - Práh kontrastu
HISTORY_MSG_SH_COLORSPACE;S/S - Barevný prostor
+HISTORY_MSG_SIGMACOL;Útlum barevnosti
+HISTORY_MSG_SIGMADIR;Útlum směru
+HISTORY_MSG_SIGMAFIN;Finální útlum kontrastu
+HISTORY_MSG_SIGMATON;Útlum tónování
HISTORY_MSG_SOFTLIGHT_ENABLED;Měkké světlo
HISTORY_MSG_SOFTLIGHT_STRENGTH;Měkká světla - Síla
+HISTORY_MSG_TEMPOUT;CAM02 - Automatická teplota
+HISTORY_MSG_THRESWAV;Práh vyvážení
HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Kotva
+HISTORY_MSG_TRANS_Method;Geometrie - Metoda
+HISTORY_MSG_WAVBALCHROM;Vyvážení barevnosti
+HISTORY_MSG_WAVBALLUM;Vyvážení jasu
+HISTORY_MSG_WAVBL;Úrovně rozmazání
+HISTORY_MSG_WAVCHROMCO;Hrubá barevnost
+HISTORY_MSG_WAVCHROMFI;Jemné barevnost
+HISTORY_MSG_WAVCLARI;Čirost
+HISTORY_MSG_WAVEDGS;Zachování hran
+HISTORY_MSG_WAVLOWTHR;Práh nízkého kontrastu
+HISTORY_MSG_WAVMERGEC;Sloučení barevnosti
+HISTORY_MSG_WAVMERGEL;Sloučení jasu
+HISTORY_MSG_WAVOFFSET;Posun
+HISTORY_MSG_WAVOLDSH;Starý algoritmus
+HISTORY_MSG_WAVRADIUS;Poloměr Stíny-Světla
+HISTORY_MSG_WAVSCALE;Měřítko
+HISTORY_MSG_WAVSHOWMASK;Ukázat masku vlnky
+HISTORY_MSG_WAVSIGMA;Útlum
+HISTORY_MSG_WAVSOFTRAD;Čirost jemný poloměr
+HISTORY_MSG_WAVSOFTRADEND;Konečný jemný poloměr
+HISTORY_MSG_WAVUSHAMET;Metoda čirosti
HISTORY_NEWSNAPSHOT;Přidat
HISTORY_NEWSNAPSHOT_TOOLTIP;Zkratka: Alt-s
HISTORY_SNAPSHOT;Snímek
@@ -939,15 +997,15 @@ MAIN_TAB_COLOR;Barvy
MAIN_TAB_COLOR_TOOLTIP;Zkratka: Alt-c
MAIN_TAB_DETAIL;Detaily
MAIN_TAB_DETAIL_TOOLTIP;Zkratka: Alt-d
-MAIN_TAB_DEVELOP; Dávková editace
+MAIN_TAB_DEVELOP; Dávková editace
MAIN_TAB_EXIF;Exif
-MAIN_TAB_EXPORT; Rychlý export
+MAIN_TAB_EXPORT; Rychlý export
MAIN_TAB_EXPOSURE;Expozice
MAIN_TAB_EXPOSURE_TOOLTIP;Zkratka: Alt-e
MAIN_TAB_FAVORITES;Oblíbené
MAIN_TAB_FAVORITES_TOOLTIP;Zkratka: Alt-u
-MAIN_TAB_FILTER; Filtr
-MAIN_TAB_INSPECT; Prohlížení
+MAIN_TAB_FILTER; Filtr
+MAIN_TAB_INSPECT; Prohlížení
MAIN_TAB_IPTC;IPTC
MAIN_TAB_METADATA;Metadata
MAIN_TAB_METADATA_TOOLTIP;Zkratka: Alt-m
@@ -961,8 +1019,8 @@ MAIN_TOOLTIP_BACKCOLOR2;Barva pozadí náhledu: bílá\nZkratka: 9
MAIN_TOOLTIP_BACKCOLOR3;Barva pozadí náhledu: středně šedá\nZkratka: 9
MAIN_TOOLTIP_BEFOREAFTERLOCK;Zamknout / Odemknout pohled Před\n\nZamknout: ponechá pohled Před nezměněn.\nUžitečné pro posouzení výsledného efektu po použití více nástrojů.\nNavíc může být porovnání provedeno proti kterémukoli stavu v historii.\n\nOdemknout: pohled Před bude následovat pohled Poté, vždy jen o jeden krok zpět, představí vliv právě použitého nástroje.
MAIN_TOOLTIP_HIDEHP;Zobrazit či schovat levý panel (obsahující historii).\nZkratka: l
-MAIN_TOOLTIP_INDCLIPPEDH;Zvýraznit oříznutá světla.\nZkratka: >
-MAIN_TOOLTIP_INDCLIPPEDS;Zvýraznit oříznuté stíny.\nZkratka: <
+MAIN_TOOLTIP_INDCLIPPEDH;Zvýraznění oříznutých světel.\nZkratka: >
+MAIN_TOOLTIP_INDCLIPPEDS;Zvýraznění oříznutých stínů.\nZkratka: <
MAIN_TOOLTIP_PREVIEWB;Náhled modrého kanálu.\nZkratka: b
MAIN_TOOLTIP_PREVIEWFOCUSMASK;Náhled masky zaostření.\nZkratka: Shift-f\n\nVíce přesné u snímků s nízkou hloubkou ostrosti, nízkým šumem a na vyšších úrovních zvětšení.\n\nPoužijte přiblížení v rozsahu 10 až 30% pro zlepšení přesnosti detekce u zašuměných snímků.
MAIN_TOOLTIP_PREVIEWG;Náhled zeleného kanálu.\nZkratka: g
@@ -1017,6 +1075,7 @@ PARTIALPASTE_EQUALIZER;Úrovně vlnky
PARTIALPASTE_EVERYTHING;Vše
PARTIALPASTE_EXIFCHANGES;Exif
PARTIALPASTE_EXPOSURE;Expozice
+PARTIALPASTE_FILMNEGATIVE;Negativní film
PARTIALPASTE_FILMSIMULATION;Simulace filmu
PARTIALPASTE_FLATFIELDAUTOSELECT;Automatický výběr Flat Field
PARTIALPASTE_FLATFIELDBLURRADIUS;Poloměr rozostření Flat Field
@@ -1041,6 +1100,7 @@ PARTIALPASTE_PREPROCESS_GREENEQUIL;Vyrovnání zelené
PARTIALPASTE_PREPROCESS_HOTPIXFILT;Filtr vypálených pixelů
PARTIALPASTE_PREPROCESS_LINEDENOISE;Filtrovat linkové rušení
PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;Filtr PDAF linek
+PARTIALPASTE_PREPROCWB;Předzpracování Vyvážení bílé
PARTIALPASTE_PRSHARPENING;Doostření po změně velikosti
PARTIALPASTE_RAWCACORR_AUTO;Automatická korekce CA
PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA zabránit posunu barev
@@ -1075,6 +1135,7 @@ PREFERENCES_APPEARANCE_COLORPICKERFONT;Písmo Průzkumníka barev
PREFERENCES_APPEARANCE_CROPMASKCOLOR;Barva masky ořezu
PREFERENCES_APPEARANCE_MAINFONT;Hlavní písmo
PREFERENCES_APPEARANCE_NAVGUIDECOLOR;Barva vodítek navigátoru
+PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI režim
PREFERENCES_APPEARANCE_THEME;Motiv
PREFERENCES_APPLNEXTSTARTUP;vyžaduje restart aplikace
PREFERENCES_AUTOMONPROFILE;Použít barevný profil hlavního monitoru z operačního systému
@@ -1094,11 +1155,11 @@ PREFERENCES_CACHEMAXENTRIES;Maximální počet záznamů v mezipaměti
PREFERENCES_CACHEOPTS;Vlastnosti mezipaměti
PREFERENCES_CACHETHUMBHEIGHT;Maximální výška náhledu
PREFERENCES_CHUNKSIZES;Dlaždic na vlákno
-PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demozajkování
-PREFERENCES_CHUNKSIZE_RAW_CA;Raw korekce CA
+PREFERENCES_CHUNKSIZE_RAW_AMAZE;Demozajkování AMaZE
+PREFERENCES_CHUNKSIZE_RAW_CA;Raw korekce ChA
PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demozajkování
-PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demozajkování
-PREFERENCES_CHUNKSIZE_RGB;RGB zpracování
+PREFERENCES_CHUNKSIZE_RAW_XT;Demozajkování Xtrans
+PREFERENCES_CHUNKSIZE_RGB;Zpracování barev
PREFERENCES_CLIPPINGIND;Indikace oříznutí
PREFERENCES_CLUTSCACHE;Mezipaměť HaldCLUT
PREFERENCES_CLUTSCACHE_LABEL;Maximální počet přednačtených CLUTů
@@ -1186,8 +1247,8 @@ PREFERENCES_PARSEDEXTADDHINT;Vymazat označenou příponu ze seznamu.
PREFERENCES_PARSEDEXTDELHINT;Vymazat označenou příponu ze seznamu.
PREFERENCES_PARSEDEXTDOWNHINT;Vybranou příponu posunout na seznamu níže.
PREFERENCES_PARSEDEXTUPHINT;Vybranou příponu posunout na seznamu výše.
-PREFERENCES_PERFORMANCE_MEASURE;Měřit
-PREFERENCES_PERFORMANCE_MEASURE_HINT;Vypisovat časy zpracování v konzoli
+PREFERENCES_PERFORMANCE_MEASURE;Měření
+PREFERENCES_PERFORMANCE_MEASURE_HINT;Vypisuje doby zpracování do konzole
PREFERENCES_PERFORMANCE_THREADS;Vlákna
PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximální počet vláken pro Redukci šumu a Úrovně vlnky (0 = Automaticky)
PREFERENCES_PREVDEMO;Metoda demozajkování náhledu
@@ -1262,11 +1323,11 @@ PROFILEPANEL_TOOLTIPCOPY;Kopírovat současný profil do schránky.\nCtrl-kli
PROFILEPANEL_TOOLTIPLOAD;Nahrát profil ze souboru.\nCtrl-klik umožní vybrat parametry pro nahrání.
PROFILEPANEL_TOOLTIPPASTE;Vložit profil ze schránky.\nCtrl-klik umožní vybrat parametry pro vložení.
PROFILEPANEL_TOOLTIPSAVE;Uložit současný profil.\nCtrl-klik umožní vybrat parametry pro uložení.
-PROGRESSBAR_DECODING;Dekodování...
+PROGRESSBAR_DECODING;Dekódování…
PROGRESSBAR_GREENEQUIL;Vyrovnání zelené...
-PROGRESSBAR_HLREC;Rekonstrukce světel...
-PROGRESSBAR_HOTDEADPIXELFILTER;Filtr vypálených/mrtvých pixelů...
-PROGRESSBAR_LINEDENOISE;Filtr linkového rušení...
+PROGRESSBAR_HLREC;Rekonstrukce světel…
+PROGRESSBAR_HOTDEADPIXELFILTER;Filtrování vypálených/mrtvých pixelů…
+PROGRESSBAR_LINEDENOISE;Filtr linkového rušení…
PROGRESSBAR_LOADING;Načítání obrázku...
PROGRESSBAR_LOADINGTHUMBS;Načítání náhledů...
PROGRESSBAR_LOADJPEG;Načítání JPEG...
@@ -1275,7 +1336,7 @@ PROGRESSBAR_LOADTIFF;Načítání TIFF...
PROGRESSBAR_NOIMAGES;Složka neobsahuje obrázky
PROGRESSBAR_PROCESSING;Zpracovávaní obrázku...
PROGRESSBAR_PROCESSING_PROFILESAVED;Profil zpracování uložen
-PROGRESSBAR_RAWCACORR;RAW korekce chromatické aberace...
+PROGRESSBAR_RAWCACORR;Korekce ChA…
PROGRESSBAR_READY;Připraven
PROGRESSBAR_SAVEJPEG;Ukládání JPEG souboru...
PROGRESSBAR_SAVEPNG;Ukládání PNG souboru...
@@ -1293,8 +1354,8 @@ QUEUE_DESTFILENAME;Cesta a název souboru
QUEUE_FORMAT_TITLE;Formát souboru
QUEUE_LOCATION_FOLDER;Ulož do souboru
QUEUE_LOCATION_TEMPLATE;Použít šablonu
-QUEUE_LOCATION_TEMPLATE_TOOLTIP;Specifikujte kam se mají uložit výstupy. Lze použít umístění zdrojových souborů, pořadí, stav koše nebo pozice ve frontě.\n\nNapříklad pokud má zpracovávaná fotografie následující cestu:\n/home/tomas/fotky/2010-10-31/dsc0042.nef,\nmají jednotlivé formátovací řetězce tento význam:\n%d4 = home\n%d3 = tomas\n%d2 = fotky\n%d1 = 2010-10-31\n%f = dsc0042\n%p1 = /home/tomas/fotky/2010-10-31/\n%p2 = /home/tomas/fotky/\n%p3 = /home/tomas/\n%p4 = /home/\n\n%r bude nahrazeno hodnocením fotografie.Pokud není fotografie ohodnocena, bude %r nahrazeno '0'.Pokud je fotografie v koši, bude %r nahrazeno 'x'.\n\nPokud si přejete uložit výstupní obrázek vedle originálu, napište:\n%p1/%f\n\nPokud si jej ale přejete uložit do adresáře "converted" ve stejném adresáři jako otevřený obrázek, napište:\n%p1/converted/%f\n\nPro uložení výstupního obrázku do adresáře"/home/tom/photos/converted/2010-10-31", napište:\n%p2/converted/%d1/%f
-QUEUE_LOCATION_TITLE;Výstupní umístění
+QUEUE_LOCATION_TEMPLATE_TOOLTIP;Lze použít následující formátovací řetězce:\n%f, %d1, %d2, ..., %p1, %p2, ..., %r\n\nTyto formátovací řetězce reprezentují různé části cesty k uložené fotografii.\n\nNapříklad pokud má zpracovávaná fotografie následující cestu:\n/home/tomas/fotky/2010-10-31/fotka1.raw,\nmají jednotlivé formátovací řetězce tento význam:\n%d4 = home\n%d3 = tomas\n%d2 = fotky\n%d1 = 2010-10-31\n%f = fotka1\n%p1 = /home/tomas/fotky/2010-10-31/\n%p2 = /home/tomas/fotky/\n%p3 = /home/tomas/\n%p4 = /home/\n\n%r bude nahrazeno hodnocením fotografie.Pokud není fotografie ohodnocena, bude %r nahrazeno '0'.Pokud je fotografie v koši, bude %r nahrazeno 'x'.\n\nPokud si přejete uložit výstupní obrázek vedle originálu, napište:\n%p1/%f\n\nPokud si jej ale přejete uložit do adresáře "converted" ve stejném adresáři jako otevřený obrázek, napište:\n%p1/converted/%f\n\nPro uložení výstupního obrázku do adresáře"/home/tom/photos/converted/2010-10-31", napište:\n%p2/converted/%d1/%f
+QUEUE_LOCATION_TITLE;Umístění výstupu
QUEUE_STARTSTOP_TOOLTIP;Spustit nebo zastavit zpracování obrázků ve frontě.\n\nZkratka: Ctrl+s
SAMPLEFORMAT_0;Neznámý datový formát
SAMPLEFORMAT_1;8-bitový neznaménkový
@@ -1331,7 +1392,7 @@ THRESHOLDSELECTOR_HINT;Držte klávesu Shift pro přesun individuálních
THRESHOLDSELECTOR_T;Nahoře
THRESHOLDSELECTOR_TL;Nahoře vlevo
THRESHOLDSELECTOR_TR;Nahoře vpravo
-TOOLBAR_TOOLTIP_COLORPICKER;Uzamykatelný Průzkumník barev\n\nPokud je nástroj aktivní:\n- Přidání sondy: levý-klik.\n- Posunutí sondy: levý-klik a posunutí.\n- Smazání sondy: pravý-klik.\n- Smazání všech sond: Ctrl+Shift+pravý-klik.\n- Návrat k nástroji posunu: pravý-klik mimo průzkumníky.
+TOOLBAR_TOOLTIP_COLORPICKER;Uzamykatelný Průzkumník barev\n\nPokud je nástroj aktivní:\n- Přidání sondy: levý-klik.\n- Posunutí sondy: levý-klik a posunutí.\n- Smazání sondy: pravý-klik.\n- Smazání všech sond: Ctrl+Shift+pravý-klik.\n- Návrat k nástroji posunu: pravý-klik mimo jakoukoli sondu.
TOOLBAR_TOOLTIP_CROP;Oříznutí výběru.\nZkratka: c\nVýřez posunete pomocí Shift + tažení myši
TOOLBAR_TOOLTIP_HAND;Posun.\nZkratka: h
TOOLBAR_TOOLTIP_STRAIGHTEN;Vyznačení roviny / rotace.\nZkratka: s\n\nZobrazení míry rotace pomocí vodící linky na náhledu snímky. Úhel rotace je zobrazen vedle vodící linky. Střed rotace je geometrický střed snímku.
@@ -1417,7 +1478,7 @@ TP_COLORAPP_ALGO_JS;Světlost + Nasycení (JS)
TP_COLORAPP_ALGO_QM;Jas a pestrobarevnost (QM)
TP_COLORAPP_ALGO_TOOLTIP;Umožňuje vybrat mezi podmnožinou nebo všemi parametry.
TP_COLORAPP_BADPIXSL;Filtr vypálených/mrtvých pixelů
-TP_COLORAPP_BADPIXSL_TOOLTIP;Potlačení vypálených/mrtvých (jasně zabarvených) pixelů.\n0 = Bez efektu\n1 = Medián\n2 = Gaussův.\nPopřípadě obrázek upravte tak, aby jste se vyhnuli velmi tmavým stínům.\n\nTyto artefakty vznikají díky omezením CIECAM02.
+TP_COLORAPP_BADPIXSL_TOOLTIP;Potlačení vypálených/mrtvých (jasně zabarvených) pixelů.\n0 = Bez efektu\n1 = Medián\n2 = Gaussův.\nPopřípadě obrázek upravte tak, aby jste se vyhnuli velmi tmavým stínům.\n\nTyto artefakty vznikají díky omezením CIECAM02.
TP_COLORAPP_BRIGHT;Jas (O)
TP_COLORAPP_BRIGHT_TOOLTIP;Jas v CIECAM02 bere v potaz svítivost bílé a rozdíly jasů mezi L*a*b* a RGB.
TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;U ručního nastavení jsou doporučeny hodnoty nad 65.
@@ -1428,7 +1489,7 @@ TP_COLORAPP_CHROMA_S;Nasycení (S)
TP_COLORAPP_CHROMA_S_TOOLTIP;Nasycení se v CIECAM02 liší od nasycení L*a*b* a RGB.
TP_COLORAPP_CHROMA_TOOLTIP;Barevnost se v CIECAM02 liší od barevnosti L*a*b* a RGB.
TP_COLORAPP_CIECAT_DEGREE;CAT02 přizpůsobení
-TP_COLORAPP_CONTRAST;Kontrast (I)
+TP_COLORAPP_CONTRAST;Kontrast (J)
TP_COLORAPP_CONTRAST_Q;Kontrast (O)
TP_COLORAPP_CONTRAST_Q_TOOLTIP;Liší se od kontrastu L*a*b* a RGB.
TP_COLORAPP_CONTRAST_TOOLTIP;Liší se od kontrastu L*a*b* a RGB.
@@ -1445,17 +1506,29 @@ TP_COLORAPP_GAMUT;Kontrola gamutu (L*a*b*)
TP_COLORAPP_GAMUT_TOOLTIP;Povolí kontrolu gamutu v L*a*b* režimu.
TP_COLORAPP_HUE;Odstín (h)
TP_COLORAPP_HUE_TOOLTIP;Odstín (h) - úhel mezi 0° a 360°.
+TP_COLORAPP_IL41;D41
+TP_COLORAPP_IL50;D50
+TP_COLORAPP_IL55;D55
+TP_COLORAPP_IL60;D60
+TP_COLORAPP_IL65;D65
+TP_COLORAPP_IL75;D75
+TP_COLORAPP_ILA;Žárovka StdA 2856K
+TP_COLORAPP_ILFREE;Volná
+TP_COLORAPP_ILLUM;Osvětlení
+TP_COLORAPP_ILLUM_TOOLTIP;Vyberte osvětlení nejvíce se blížící podmínkám v době pořízení snímku.\nObecně D50, to se ale může lišit v závislosti na denní době a zeměpisné šířce.
TP_COLORAPP_LABEL;CIE model přizpůsobení barev 2002
TP_COLORAPP_LABEL_CAM02;Úpravy obrázku
TP_COLORAPP_LABEL_SCENE;Podmínky scény
TP_COLORAPP_LABEL_VIEWING;Podmínky zobrazení
-TP_COLORAPP_LIGHT;Světlost (I)
+TP_COLORAPP_LIGHT;Světlost (J)
TP_COLORAPP_LIGHT_TOOLTIP;Světlost v CIECAM02 se liší od světlosti v L*a*b* a RGB.
TP_COLORAPP_MEANLUMINANCE;Střední jas (Yb%)
TP_COLORAPP_MODEL;VB - Model
TP_COLORAPP_MODEL_TOOLTIP;Model bílého bodu.\n\nWB [RT] + [výstup]: Pro scénu je použito vyvážení bílé RawTherapee , CIECAM02 je nastaven na D50 a vyvážení bílé výstupního zařízení je nastaveno v Podmínkách prohlížení.\n\nWB [RT+CAT02] + [výstup]: CAT02 používá RawTherapee nastavení vyvážení bílé a vyvážení bílé výstupního zařízení je nastaveno v Podmínkách prohlížení.\n\nVolná teplota+zelená + CAT02 + [výstup]: teplota a zelená je vybrána uživatelem, vyvážení bílé výstupního zařízení je nastaveno v Podmínkách prohlížení.
TP_COLORAPP_NEUTRAL;Obnovit
TP_COLORAPP_NEUTRAL_TIP;Obnoví původní hodnoty u všech posuvníků a křivek.
+TP_COLORAPP_PRESETCAT02;Automatické přednastavení Cat02
+TP_COLORAPP_PRESETCAT02_TIP;Nastaví volby, posuvníky, teplotu a zelenou podle Cat02 automatického přednastavení.\nMusíte nastavit světelné podmínky při fotografování.\nPokud je potřeba, musíte změnit Cat02 podmínky přizpůsobení pro prohlížení.\nPokud je potřeba, můžete změnit teplotu a odstín podmínek při prohlížení a také další nastavení.
TP_COLORAPP_RSTPRO;Ochrana červených a pleťových tónů
TP_COLORAPP_RSTPRO_TOOLTIP;Ochrana červených a pleťových tónů ovlivňuje posuvníky i křivky.
TP_COLORAPP_SURROUND;Okolí
@@ -1472,7 +1545,9 @@ TP_COLORAPP_TCMODE_LABEL2;Mód křivky 2
TP_COLORAPP_TCMODE_LABEL3;Mód barevné křivky
TP_COLORAPP_TCMODE_LIGHTNESS;Světlost
TP_COLORAPP_TCMODE_SATUR;Nasycení
-TP_COLORAPP_TEMP_TOOLTIP;Pro výběr osvětlení vždy nastavte Tint=1.\n\nA barva=2856\nD50 barva=5003\nD55 barva=5503\nD65 barva=6504\nD75 barva=7504
+TP_COLORAPP_TEMP2_TOOLTIP;Buď symetrický režim teploty = Nastavení bílé,\nNebo vyberte osvětlení, vždy nastavte Odstín=1.\n\nA barva=2856\nD50 barva=5003\nD55 barva=5503\nD65 barva=6504\nD75 barva=7504
+TP_COLORAPP_TEMPOUT_TOOLTIP;Zakažte pro změnu teploty a nádechu
+TP_COLORAPP_TEMP_TOOLTIP;Pro výběr osvětlení vždy nastavte Odstín=1.\n\nA barva=2856\nD41 temp=4100\nD50 barva=5003\nD55 barva=5503\nD60 temp=6000\nD65 barva=6504\nD75 barva=7504
TP_COLORAPP_TONECIE;Mapování tónů pomocí CIECAM02
TP_COLORAPP_TONECIE_TOOLTIP;Pokud je volba zakázána, probíhá mapování tónů v prostoru L*a*b*.\nPokud je volba povolena. probíhá mapování tónů pomocí CIECAM02.\nAby měla tato volba efekt, musí být povolen nástroj Mapování tónů.
TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolutní jas prostředí prohlížení\n(obvykle 16 cd/m²).
@@ -1499,7 +1574,7 @@ TP_COLORTONING_LABREGION_CHANNEL_B;Modrá
TP_COLORTONING_LABREGION_CHANNEL_G;Zelená
TP_COLORTONING_LABREGION_CHANNEL_R;Červená
TP_COLORTONING_LABREGION_CHROMATICITYMASK;C
-TP_COLORTONING_LABREGION_HUEMASK;H
+TP_COLORTONING_LABREGION_HUEMASK;H
TP_COLORTONING_LABREGION_LIGHTNESS;Světlost
TP_COLORTONING_LABREGION_LIGHTNESSMASK;L
TP_COLORTONING_LABREGION_LIST_TITLE;Oprava
@@ -1561,6 +1636,7 @@ TP_DEFRINGE_RADIUS;Poloměr
TP_DEFRINGE_THRESHOLD;Práh
TP_DEHAZE_DEPTH;Hloubka
TP_DEHAZE_LABEL;Odstranění závoje
+TP_DEHAZE_LUMINANCE;Pouze jas
TP_DEHAZE_SHOW_DEPTH_MAP;Ukázat hloubkovou mapu
TP_DEHAZE_STRENGTH;Síla
TP_DIRPYRDENOISE_CHROMINANCE_AMZ;Více zónová automatika
@@ -1669,6 +1745,15 @@ TP_EXPOSURE_TCMODE_STANDARD;Běžný
TP_EXPOSURE_TCMODE_WEIGHTEDSTD;Běžný vážený
TP_EXPOS_BLACKPOINT_LABEL;Raw černé body
TP_EXPOS_WHITEPOINT_LABEL;Raw bílé body
+TP_FILMNEGATIVE_BLUE;Poměr modré
+TP_FILMNEGATIVE_FILMBASE_PICK;Výběr barvy podkladu filmu
+TP_FILMNEGATIVE_FILMBASE_TOOLTIP;Vyberte místo neexponovaného filmu (například okraj mezi snímky) pro získání aktuální barvy podkladu a uložte jej do profilu zpracování.\nTo umožňuje jednoduchou kontrolu konzistence vyvážení barev během dávkového zpracování více obrázků ze stejného filmu.\nTaké použijte pokud jsou převáděné snímky moc tmavé, přesvícené nebo barevně nevyvážené.
+TP_FILMNEGATIVE_FILMBASE_VALUES;Barva podkladu filmu:
+TP_FILMNEGATIVE_GREEN;Referenční exponent (kontrast)
+TP_FILMNEGATIVE_GUESS_TOOLTIP;Automaticky nastaví poměr červené a modré výběrem dvou vzorků s neutrálním odstínem (bez barvy) v původní scéně. Vzorky by se měly lišit jasem. Následně je nastaveno vyvážení bílé.
+TP_FILMNEGATIVE_LABEL;Negativní film
+TP_FILMNEGATIVE_PICK;Výběr neutrálních míst
+TP_FILMNEGATIVE_RED;Poměr červené
TP_FILMSIMULATION_LABEL;Simulace filmu
TP_FILMSIMULATION_SLOWPARSEDIR;RawTherapee je nakonfigurován aby hledal Hald CLUT obrázky pro nástroj Simulace filmu ve složce, jejíž načítání trvá velmi dlouho.\nZkontrolujte prosím nastavení v menu Volby > Zpracování obrázku > Simulace filmu.\nNastavená složka by měla buď obsahovat jen a pouze Hald CLUT obrázky nebo být prázdná, pokud nechcete nástroj Simulace filmu používat.\n\nVíce informací získáte v článku o nástroji Simulace filmu na RawPedii.\n\nChcete zrušit právě probíhající prohledávání složky?
TP_FILMSIMULATION_STRENGTH;Síla
@@ -1681,7 +1766,7 @@ TP_FLATFIELD_BT_HORIZONTAL;Vodorovně
TP_FLATFIELD_BT_VERTHORIZ;Vodorovně a svisle
TP_FLATFIELD_BT_VERTICAL;Svisle
TP_FLATFIELD_CLIPCONTROL;Kontrola oříznutí
-TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Kontrola oříznutí zabrání oříznutí světel po aplikaci Flat Field. Pokud byly světla oříznuta ještě před aplikací Flat field, může se objevit barevný nádech.
+TP_FLATFIELD_CLIPCONTROL_TOOLTIP;Kontrola oříznutí zabrání oříznutí světel po aplikaci Flat Field. Pokud byly světla oříznuta ještě před aplikací Flat field, použije se hodnota 0.
TP_FLATFIELD_LABEL;Flat Field
TP_GENERAL_11SCALE_TOOLTIP;Efekt tohoto nástroje je viditelný pouze při přiblížení 1:1.
TP_GRADIENT_CENTER;Střed
@@ -1789,6 +1874,8 @@ TP_LABCURVE_RSTPRO_TOOLTIP;Pracuje s posuvníkem barevnosti a CC křivkou.
TP_LENSGEOM_AUTOCROP;Automatický ořez
TP_LENSGEOM_FILL;Automatické vyplnění
TP_LENSGEOM_LABEL;Objektiv / Geometrie
+TP_LENSGEOM_LIN;Lineární
+TP_LENSGEOM_LOG;Logaritmická
TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automaticky vybráno
TP_LENSPROFILE_CORRECTION_LCPFILE;LCP soubor
TP_LENSPROFILE_CORRECTION_MANUAL;Ručně vybráno
@@ -1817,6 +1904,7 @@ TP_PCVIGNETTE_ROUNDNESS;Zaoblení
TP_PCVIGNETTE_ROUNDNESS_TOOLTIP;Zaoblení:\n0 = čtverec,\n50 = elipsa,\n100 = kruh.
TP_PCVIGNETTE_STRENGTH;Síla
TP_PCVIGNETTE_STRENGTH_TOOLTIP;Síla filtru v expozičních stupních (v rozích).
+TP_PDSHARPENING_LABEL;Doostření vstupu
TP_PERSPECTIVE_HORIZONTAL;Vodorovně
TP_PERSPECTIVE_LABEL;Perspektiva
TP_PERSPECTIVE_VERTICAL;Svisle
@@ -1836,6 +1924,10 @@ TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Vodorovně pouze u PDAF řádků
TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Svisle
TP_PREPROCESS_NO_FOUND;Nic nenalezeno
TP_PREPROCESS_PDAFLINESFILTER;Filtr PDAF linek
+TP_PREPROCWB_LABEL;Předzpracování Vyvážení bílé
+TP_PREPROCWB_MODE;Mód
+TP_PREPROCWB_MODE_AUTO;Automaticky
+TP_PREPROCWB_MODE_CAMERA;Fotoaparát
TP_PRSHARPENING_LABEL;Doostření po změně velikosti
TP_PRSHARPENING_TOOLTIP;Obrázek po zmenšení doostří. Funguje pouze pokud je použita "Lanczos" metoda zmenšení. Náhled výsledku není v tomto nástroji možný. Podívejte se do RawPedie pro návod k použití.
TP_RAWCACORR_AUTO;Automatická korekce
@@ -1868,7 +1960,7 @@ TP_RAW_DCBENHANCE;Vylepšení DCB
TP_RAW_DCBITERATIONS;Počet průchodů DCB
TP_RAW_DCBVNG4;DCB+VNG4
TP_RAW_DMETHOD;Metoda
-TP_RAW_DMETHOD_PROGRESSBAR;%1 demozajkování...
+TP_RAW_DMETHOD_PROGRESSBAR;%1 demozajkování…
TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Vylepšení demozajkování...
TP_RAW_DMETHOD_TOOLTIP;Poznámka: IGV a LMMSE jsou určeny pro obrázky s vysokým ISO, kterým pomáhají vyhnout se u redukce šumu vzniku vzorů, posterizaci a vyžehlenému vzhledu.\n\nPixel Shift je určen pro soubory Pentax/Sony Pixel Shift.\nPro soubory neobsahující Pixel Shift data je použita metoda AMaZE.
TP_RAW_DUALDEMOSAICAUTOCONTRAST;Automatický práh
@@ -1882,7 +1974,7 @@ TP_RAW_HD_TOOLTIP;Nižší hodnoty učiní detekci vypálených/mrtvých bodů a
TP_RAW_HPHD;HPHD
TP_RAW_IGV;IGV
TP_RAW_IMAGENUM;Dílčí snímek
-TP_RAW_IMAGENUM_SN;Režim SN
+TP_RAW_IMAGENUM_SN;Režim Signál/Šum
TP_RAW_IMAGENUM_TOOLTIP;Některé raw snímky obsahují několik podsnímků (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\n\nV případě, že je pro demozajkování použita jiná metoda než Pixel Shift, tato volba určí, který podsnímek se použije.\n\nPokud je použita Pixel Shift metoda demozajkování na Pixel Shift raw soubory, budou použity všechny podsnímky a tato volba určí, který snímek bude použit pro pohyblivé části.
TP_RAW_LABEL;Demozajkování
TP_RAW_LMMSE;LMMSE
@@ -1924,7 +2016,7 @@ TP_RAW_SENSOR_XTRANS_DMETHOD_TOOLTIP;Tří průchodová dává lepší výsledky
TP_RAW_SENSOR_XTRANS_LABEL;Senzory s X-Trans maticí
TP_RAW_VNG4;VNG4
TP_RAW_XTRANS;X-Trans
-TP_RAW_XTRANSFAST;Fast X-Trans
+TP_RAW_XTRANSFAST;Rychlý X-Trans
TP_RESIZE_ALLOW_UPSCALING;Povolit zvětšení
TP_RESIZE_APPLIESTO;Aplikovat na:
TP_RESIZE_CROPPEDAREA;Oblast ořezu
@@ -2047,10 +2139,12 @@ TP_SHARPENING_EDRADIUS;Poloměr
TP_SHARPENING_EDTOLERANCE;Tolerance k hranám
TP_SHARPENING_HALOCONTROL;Omezení halo efektu
TP_SHARPENING_HCAMOUNT;Míra
+TP_SHARPENING_ITERCHECK;Automatické omezení průchodů
TP_SHARPENING_LABEL;Doostření
TP_SHARPENING_METHOD;Metoda
TP_SHARPENING_ONLYEDGES;Doostřit pouze hrany
TP_SHARPENING_RADIUS;Poloměr
+TP_SHARPENING_RADIUS_BOOST;Zvýšení poloměru rohu
TP_SHARPENING_RLD;RL Dekonvoluce
TP_SHARPENING_RLD_AMOUNT;Míra
TP_SHARPENING_RLD_DAMPING;Útlum
@@ -2110,11 +2204,17 @@ TP_WAVELET_BACKGROUND;Pozadí
TP_WAVELET_BACUR;Křivka
TP_WAVELET_BALANCE;Vyvážení kontrastu d/v-h
TP_WAVELET_BALANCE_TOOLTIP;Změní vyvážení mezi směry vlnky: svisle-vodorovně a úhlopříčně.\nPokud je aktivován kontrast, barevnost nebo zbytkové tónové mapování je efekt díky vyvážení zesílen.
-TP_WAVELET_BALCHRO;Vyvážení barev
+TP_WAVELET_BALCHRO;Vyvážení barevnosti
+TP_WAVELET_BALCHROM;Korekce odšumění Modrá-Červená
TP_WAVELET_BALCHRO_TOOLTIP;Pokud je povoleno, křivka nebo posuvníky "Vyvážení kontrastu" ovlivňují i vyvážení barev.
+TP_WAVELET_BALLUM;Korekce odšumění Bílá-Černá
TP_WAVELET_BANONE;Nic
TP_WAVELET_BASLI;Posuvník
TP_WAVELET_BATYPE;Metoda vyvážení kontrastu
+TP_WAVELET_BL;Úrovně rozmazání
+TP_WAVELET_BLCURVE;Rozmazání dle úrovní
+TP_WAVELET_BLURFRAME;Rozmazání
+TP_WAVELET_BLUWAV;Útlum
TP_WAVELET_CBENAB;Tónování a vyvážení barev
TP_WAVELET_CB_TOOLTIP;Pro silnější hodnoty barevného tónování s kombinováním nebo bez rozkladu na vrstvy tónování\nPro menší hodnoty můžete změnit vyvážení bílé na barvu pozadí (obloha, ...) bez změny předního plánu, obecně více kontrastní.
TP_WAVELET_CCURVE;Místní kontrast
@@ -2124,22 +2224,32 @@ TP_WAVELET_CH3;Propojit kontrast úrovní
TP_WAVELET_CHCU;Křivka
TP_WAVELET_CHR;Barevnost - kontrast síla propojení
TP_WAVELET_CHRO;Práh nasycené/pastelové
+TP_WAVELET_CHROFRAME;Odšumění Barevnosti
+TP_WAVELET_CHROMAFRAME;Barevnost
+TP_WAVELET_CHROMCO;Hrubá barevnost
+TP_WAVELET_CHROMFI;Jemná barevnost
TP_WAVELET_CHRO_TOOLTIP;Nastaví úroveň vlnky, která bude prahová pro syté a pastelové barvy.\n1-x: syté\nx-9: pastelové\n\nHodnota bude ignorována pokud přesáhne množství úrovní vlnky.
+TP_WAVELET_CHRWAV;Rozmazat barevnost
TP_WAVELET_CHR_TOOLTIP;Upraví barevnost jako funkci "Kontrast úrovní" a "Barevnost - kontrast síla propojení"
TP_WAVELET_CHSL;Posuvníky
TP_WAVELET_CHTYPE;Metoda barevnost
+TP_WAVELET_CLA;Čirost
+TP_WAVELET_CLARI;Ostrá maska a čirost
TP_WAVELET_COLORT;Neprůhlednost červená-zelená
TP_WAVELET_COMPCONT;Kontrast
TP_WAVELET_COMPGAMMA;Komprese gamy
TP_WAVELET_COMPGAMMA_TOOLTIP;Úprava gamy zůstatku obrázku vám umožní vyvážit data a histogram.
TP_WAVELET_COMPTM;Mapování tónů
TP_WAVELET_CONTEDIT;Křivka kontrastu 'Po'
+TP_WAVELET_CONTFRAME;Kontrast - komprese
TP_WAVELET_CONTR;Gamut
TP_WAVELET_CONTRA;Kontrast
+TP_WAVELET_CONTRASTEDIT;Jemnější - Hrubší úrovně
TP_WAVELET_CONTRAST_MINUS;Kontrast -
TP_WAVELET_CONTRAST_PLUS;Kontrast +
TP_WAVELET_CONTRA_TOOLTIP;Změní kontrast zůstatku obrazu.
TP_WAVELET_CTYPE;Ovládání barevnosti
+TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Zakázáno pokud je přiblížení přes 300%
TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Mění lokální kontrast jako funkci originálního lokálního kontrastu(úsečka).\nNízké hodnoty na úsečce představují malý lokální kontrast (skutečné hodnoty okolo 10..20).\n50% z úsečky představuje průměrný lokální kontrast (skutečné hodnoty okolo 100..300).\n66% z úsečky představuje představuje standardní odchylku lokálního kontrastu (skutečné hodnoty okolo 300..800).\n100% z úsečky představuje maximální lokální kontrast (skutečné hodnoty okolo 3000..8000).
TP_WAVELET_CURVEEDITOR_CH;Kontrast úrovní=f(Barevnost)
TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Mění kontrast každé úrovně jako funkci odstínu.\nDejte pozor, abyste nepřepsali změny udělané v podnástroji Gamut nástroje Odstín.\nZměny křivky se projeví pouze v případě, že posuvníky kontrastu úrovní vlnky nejsou nastaveny na nulu.
@@ -2155,10 +2265,13 @@ TP_WAVELET_DAUB6;D6 - standard plus
TP_WAVELET_DAUB10;D10 - střední
TP_WAVELET_DAUB14;D14 - Vysoká
TP_WAVELET_DAUB_TOOLTIP;Změní Daubechiesové koeficienty:\nD4 = Standard,\nD14 = Nejčastěji nejlepší výkon, ale o 10% delší zpracování .\n\nOvlivňuje detekci hran a obecnou kvalitu obrázku na prvních úrovních.Ovšem kvalita není striktně vázána na koeficienty a může se lišit v závislosti na obrázku a použití.
+TP_WAVELET_DIRFRAME;Směrový kontrast
TP_WAVELET_DONE;Svisle
TP_WAVELET_DTHR;Napříč
TP_WAVELET_DTWO;Vodorovně
TP_WAVELET_EDCU;Křivka
+TP_WAVELET_EDEFFECT;Útlum
+TP_WAVELET_EDEFFECT_TOOLTIP;Posuvník ovlivňuje rozsah hodnot kontrastu, které získají maximální efekt nástroje.\nMaximální hodnota (2.5) nástroj zakáže.
TP_WAVELET_EDGCONT;Místní kontrast
TP_WAVELET_EDGCONT_TOOLTIP;Posunutí bodů doleva snižuje kontrast a posunutí bodů doprava jej zvyšuje.\nRohy levý spodní, levý horní, pravý horní, pravý spodní postupně představují místní kontrast pro nízké hodnoty, průměr, průměr + stdev a maximum.
TP_WAVELET_EDGE;Doostření hran
@@ -2178,10 +2291,12 @@ TP_WAVELET_EDSL;Práh posuvníků
TP_WAVELET_EDTYPE;Metoda místního kontrastu
TP_WAVELET_EDVAL;Síla
TP_WAVELET_FINAL;Finální doladění
+TP_WAVELET_FINCFRAME;Finální místní kontrast
+TP_WAVELET_FINCOAR_TOOLTIP;Levá (pozitivní) část křivky působí na jemnější úrovně (navýšení).\nDva body na úsečce představují příslušné akční limity jemnějšía hrubší úrovně 5 a 6 (výchozí). Pravá (negativní) část křivky působí na hrubší úrovně (navýšení).\nVyvarujte se posouvání levé části křivky se zápornými hodnotami. Vyvarujte se posouvání pravé části křivky s kladnými hodnotami.
TP_WAVELET_FINEST;Nejjemnější
-TP_WAVELET_HIGHLIGHT;Zvýrazněný rozsah jasů
+TP_WAVELET_HIGHLIGHT;Jemnější úrovně rozsahu jasu
TP_WAVELET_HS1;Celý rozsah jasů
-TP_WAVELET_HS2;Stíny/Světla
+TP_WAVELET_HS2;Výběrový rozsah jasu
TP_WAVELET_HUESKIN;Odstín pleti
TP_WAVELET_HUESKIN_TOOLTIP;Spodní body nastaví začátek zóny přenosu a horní body její konec. Tam bude efekt největší.\n\nPokud potřebujete oblast výrazně změnit nebo se objevily artefakty, je nastavení vyvážení bílé nesprávné.
TP_WAVELET_HUESKY;Odstín oblohy
@@ -2192,9 +2307,9 @@ TP_WAVELET_LABEL;Úrovně vlnky
TP_WAVELET_LARGEST;Nejhrubší
TP_WAVELET_LEVCH;Barevnost
TP_WAVELET_LEVDIR_ALL;Všechny úrovně ve všech směrech
-TP_WAVELET_LEVDIR_INF;Méně nebo shodně s úrovní
+TP_WAVELET_LEVDIR_INF;Jemnější úrovně detailů s vybranou úrovní
TP_WAVELET_LEVDIR_ONE;Jedna úroveň
-TP_WAVELET_LEVDIR_SUP;Nad úrovní
+TP_WAVELET_LEVDIR_SUP;Hrubší úrovně detailů s vybranou úrovní
TP_WAVELET_LEVELS;Úrovně vlnky
TP_WAVELET_LEVELS_TOOLTIP;Vyberte počet úrovní detailu mezi které bude obrázek rozložen. Více úrovní potřebuje více paměti a zpracování trvá déle.
TP_WAVELET_LEVF;Kontrast
@@ -2205,57 +2320,89 @@ TP_WAVELET_LEVTWO;Úroveň 3
TP_WAVELET_LEVZERO;Úroveň 1
TP_WAVELET_LINKEDG;Spojit se sílou doostření hran
TP_WAVELET_LIPST;Vylepšený algoritmus
-TP_WAVELET_LOWLIGHT;Rozsah jasu a stínů
+TP_WAVELET_LOWLIGHT;Hrubší úrovně rozsahu jasu
+TP_WAVELET_LOWTHR_TOOLTIP;Zabraňuje zesílení šumu v jemných texturách
TP_WAVELET_MEDGREINF;První úroveň
TP_WAVELET_MEDI;Omezení artefaktů na modré obloze
TP_WAVELET_MEDILEV;Detekce hran
TP_WAVELET_MEDILEV_TOOLTIP;Pro povolení Detekce hran Vám doporučujeme:\n- zakázat úrovně s nízkým kontrastem pro vyhnutí se vzniku artefaktů,\n- použít vysoké hodnoty gradientu citlivosti.\n\nSílu můžete ovlivnit pomocí 'vylepšení' z Odšumění a vylepšení.
+TP_WAVELET_MERGEC;Sloučení barevnosti
+TP_WAVELET_MERGEL;Sloučení jasu
TP_WAVELET_NEUTRAL;Neutrální
TP_WAVELET_NOIS;Odšumění
TP_WAVELET_NOISE;Odšumění a vylepšení
+TP_WAVELET_NOISE_TOOLTIP;Pokud je čtvrtá úroveň jasu odšumění lepší než 20, použije se Agresivní režim.\nPokud je hrubší barevnost lepší než 20, použije se Agresívní režim.
TP_WAVELET_NPHIGH;Vysoká
TP_WAVELET_NPLOW;Nízká
TP_WAVELET_NPNONE;Nic
TP_WAVELET_NPTYPE;Sousední pixely
TP_WAVELET_NPTYPE_TOOLTIP;Tento algoritmus zkoumá blízkost pixelu a jeho osmi sousedů. V případě menšího rozdílu je hrana zesílena.
+TP_WAVELET_OFFSET_TOOLTIP;Posun změní vyvážení mezi světly a stíny.\nVyšší hodnoty zdůrazní změnu kontrastu světel, kdežto nižší hodnoty zdůrazní změnu kontrastu stínů.\nZároveň s nízkou hodnotou útlumu máte možnost si vybrat, které kontrasty budou zvýrazněny.
+TP_WAVELET_OLDSH;Algoritmus používá záporné hodnoty
TP_WAVELET_OPACITY;Neprůhlednost modrá-žlutá
TP_WAVELET_OPACITYW;Vyrovnání kontrastu d/v-h křivka
-TP_WAVELET_OPACITYWL;Finální místní kontrast
+TP_WAVELET_OPACITYWL;Místní kontrast
TP_WAVELET_OPACITYWL_TOOLTIP;Změní finální lokální kontrast na konci zpracování vlnky.\n\nLevá strana představuje nejmenší lokální kontrast a pravá strana zase největší lokální kontrast.
TP_WAVELET_PASTEL;Barevnost pastelů
TP_WAVELET_PROC;Zpracování
+TP_WAVELET_PROTAB;Ochrana
+TP_WAVELET_RADIUS;Poloměr Stíny - Světla
+TP_WAVELET_RANGEAB;Rozsah a a b %
TP_WAVELET_RE1;Zesílená
TP_WAVELET_RE2;Nezměněno
TP_WAVELET_RE3;Omezená
-TP_WAVELET_RESCHRO;Barevnost
+TP_WAVELET_RESBLUR;Jas rozmazání
+TP_WAVELET_RESBLURC;Barevnost rozmazání
+TP_WAVELET_RESBLUR_TOOLTIP;Zakázáno pokud je přiblížení přes 500%
+TP_WAVELET_RESCHRO;Intenzita
TP_WAVELET_RESCON;Stíny
TP_WAVELET_RESCONH;Světla
TP_WAVELET_RESID;Zůstatek obrazu
TP_WAVELET_SAT;Nasycená barevnost
TP_WAVELET_SETTINGS;Nastavení vlnky
+TP_WAVELET_SHA;Ostrá maska
+TP_WAVELET_SHFRAME;Stíny/Světla
+TP_WAVELET_SHOWMASK;Ukázat vlnkovou 'masku'
+TP_WAVELET_SIGMA;Útlum
+TP_WAVELET_SIGMAFIN;Útlum
+TP_WAVELET_SIGMA_TOOLTIP;Efekt posuvníků kontrastu je silnější u detailů se středními hodnotami kontrastu, a slabší u detailů s vysokými nebo nízkými hodnotami kontrastu.\n Tímto posuvníkem můžete kontrolovat jak rychle je potlačen efekt u extrémních hodnot kontrastu.\n Čím výše je posuvník nastaven, tím širší je rozsah hodnot kontrastů u kterých nastane silnější změna s větší šancí na vytvoření artefaktů.\n Čím je níže, tím přesněji bude účinek aplikován na úzkýrozsah hodnot kontrastu.
TP_WAVELET_SKIN;Ochrana: zaměření na pleťové tóny
TP_WAVELET_SKIN_TOOLTIP;Hodnota -100: zaměřeno na pleťové tóny.\nHodnota 0: se všemi tóny je zacházeno stejně.\nHodnota +100: pleťové tóny jsou chráněny zatímco všechny ostatní tóny jsou ovlivněny.
TP_WAVELET_SKY;Ochrana a zaměření na tóny oblohy
TP_WAVELET_SKY_TOOLTIP;Hodnota -100: zaměřeno na pleťové tóny.\nHodnota 0: se všemi tóny je zacházeno stejně.\nHodnota +100: pleťové tóny jsou chráněny zatímco všechny ostatní tóny jsou ovlivněny.
+TP_WAVELET_SOFTRAD;Jemný poloměr
TP_WAVELET_STREN;Síla
TP_WAVELET_STRENGTH;Síla
TP_WAVELET_SUPE;Extra
TP_WAVELET_THR;Práh stínů
-TP_WAVELET_THRESHOLD;Úrovně světel
-TP_WAVELET_THRESHOLD2;Úrovně stínů
-TP_WAVELET_THRESHOLD2_TOOLTIP;Pouze úrovně 9 a 9 mínus hodnota budou ovlivněny rozsahem stínů a jasů.Ostatní úrovně budou plně zpracovány. Maximální možná úroveň je omezena na nejvyšší hodnotu úrovně (9 - nejvyšší úroveň).
-TP_WAVELET_THRESHOLD_TOOLTIP;Pouze úrovně pod vybranou hodnotou budou ovlivněny rozsahem zvýraznění jasů.Ostatní úrovně budou plně zpracovány. Zde vybraná hodnota omezí nejvyšší možnou hodnotu úrovně stínů.
+TP_WAVELET_THRESHOLD;Jemnější úrovně
+TP_WAVELET_THRESHOLD2;Hrubší úrovně
+TP_WAVELET_THRESHOLD2_TOOLTIP;Pouze úrovně mezi 9 a 9 mínus hodnota budou ovlivněny rozsahem jasu stínů. Ostatní úrovně budou upraveny celé. Nejvyšší možná úroveň je omezena hodnotou zvýrazněné úrovně (9 mínus hodnota zvýrazněné úrovně). Pouze úrovně mezi vybranou hodnotou a úrovní 9/Extra budou ovlivněny Hrubým rozsahem úrovní.\nVšechny ostatní úrovně budou ovlivněny v celém rozsahu jasu, pokud nebudou omezeny nastavením Jemnými úrovněmi.\nNejnižší možná úroveň, kterou bude algoritmus zvažovat, je omezená hodnotou Jemných úrovní.
+TP_WAVELET_THRESHOLD_TOOLTIP;Pouze úrovně mimo vybranou hodnotu budou ovlivněny rozsahem jasu stínů. Ostatní úrovně budou upraveny celé. Zde vybraná hodnota omezuje nejvyšší možnou hodnotu úrovní stínů. Všechny úrovně od úrovně jedna až po vybranou úroveň ovlivněny Jemným rozsahem úrovní.\nVšechny ostatní úrovně budou ovlivněny v celém rozsahu jasu, pokud nebudou omezeny nastavením Hrubými úrovněmi.\nZde vybraná hodnota, se stane nejnižší možnou úrovní Hrubých úrovní.
+TP_WAVELET_THRESWAV;Práh vyvážení
TP_WAVELET_THRH;Práh světel
-TP_WAVELET_TILESBIG;Velké dlaždice
+TP_WAVELET_TILESBIG;Dlaždice
TP_WAVELET_TILESFULL;Celý obrázek
TP_WAVELET_TILESIZE;Metoda dlaždicování
TP_WAVELET_TILESLIT;Malé dlaždice
TP_WAVELET_TILES_TOOLTIP;Zpracování celého obrázku vede k lepší kvalitě a je doporučováno. Naproti tomu dlaždice jsou náhradní řešení pro uživatele s nedostatkem paměti. Paměťové nároky najdete na RawPedii.
+TP_WAVELET_TMEDGS;Zachování hran
+TP_WAVELET_TMSCALE;Měřítko
TP_WAVELET_TMSTRENGTH;Síla komprese
-TP_WAVELET_TMSTRENGTH_TOOLTIP;Ovládá sílu mapování tónů nebo kontrast komprese zůstatku obrázku. Pokud je hodnota rozdílná od nuly, budou posuvníky Síla a Gama v nástroji Mapování tónů v kartě Expozice neaktivní.
+TP_WAVELET_TMSTRENGTH_TOOLTIP;Kontroluje sílu tónového mapování nebo komprese kontrastu zůstatku obrazu.
TP_WAVELET_TMTYPE;Metoda komprese
TP_WAVELET_TON;Tónování
+TP_WAVELET_TONFRAME;Vyloučené barvy
+TP_WAVELET_USH;Nic
+TP_WAVELET_USHARP;Metoda čirosti
+TP_WAVELET_USHARP_TOOLTIP;Původní : zdrojovým souborem je soubor před Vlnkou.\nVlnka : zdrojovým souborem je soubor s aplikovanou Vlnkou.
+TP_WAVELET_USH_TOOLTIP;Pokud vyberete Ostrou masku, bude nastavení vlnky automaticky změněno na:\nPozadí=černá, zpracování=pod, úroveň=3 — ta může být změněna v rozmezí 1 až 4.\n\nPokud vyberete Čirost, bude nastavení vlnky automaticky změněno na:\nPozadí=zůstatek, zpracování=nad, úroveň=7 — ta může být změněna v rozmezí 5 až 10 úrovní vlnky.
+TP_WAVELET_WAVLOWTHR;Práh nízkého kontrastu
+TP_WAVELET_WAVOFFSET;Posun
TP_WBALANCE_AUTO;Automaticky
+TP_WBALANCE_AUTOITCGREEN;Teplotní korelace
+TP_WBALANCE_AUTOOLD;RGB šedé
+TP_WBALANCE_AUTO_HEADER;Automaticky
TP_WBALANCE_CAMERA;Fotoaparát
TP_WBALANCE_CLOUDY;Zataženo
TP_WBALANCE_CUSTOM;Vlastní
@@ -2297,6 +2444,8 @@ TP_WBALANCE_SOLUX41;Solux 4100K
TP_WBALANCE_SOLUX47;Solux 4700K (vendor)
TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery)
TP_WBALANCE_SPOTWB;Použijte pipetu pro nabrání vyvážení bílé z neutrální oblasti v náhledu.
+TP_WBALANCE_STUDLABEL;Faktor korelace: %1
+TP_WBALANCE_STUDLABEL_TOOLTIP;Zobrazí vypočítanou korelaci metody Student\nNižší hodnoty jsou lepší, přičemž pro <0.005 jsou výborné\n<0.01 jsou dobré a >0.5 jsou špatné.\nNízké hodnoty neznamenají, že je vyvážení bílé dobré: pro nestandardní světelné podmínky jsou výsledky nepředvídatelné.\nHodnota 1000 znamená, že byl použit předchozí výpočet a výsledky jsou pravděpodobně dobré.
TP_WBALANCE_TEMPBIAS;AVB - Zdůraznění teploty
TP_WBALANCE_TEMPBIAS_TOOLTIP;Dovolí ovlivnit výpočet "automatického vyvážení bílé"\nzdůrazněním teplejší nebo chladnější teploty. Toto zdůraznění\nje vyjádřeno v procentech vypočtené teploty a výsledek\nlze vyjádřit vzorcem "vypočtenáTeplota + vypočtenáTeplota * zdůraznění".
TP_WBALANCE_TEMPERATURE;Teplota
@@ -2311,42 +2460,3 @@ ZOOMPANEL_ZOOMFITCROPSCREEN;Přizpůsobit ořez obrazovce\nZkratka: f
ZOOMPANEL_ZOOMFITSCREEN;Přizpůsobit celý obrázek obrazovce\nZkratka: Alt-f
ZOOMPANEL_ZOOMIN;Přiblížit\nZkratka: +
ZOOMPANEL_ZOOMOUT;Oddálit\nZkratka: -
-
-!!!!!!!!!!!!!!!!!!!!!!!!!
-! Untranslated keys follow; remove the ! prefix after an entry is translated.
-!!!!!!!!!!!!!!!!!!!!!!!!!
-
-!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash?
-!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files?
-!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version?
-!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash.
-!FILEBROWSER_POPUPREMOVE;Delete permanently
-!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version
-!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash.
-!GENERAL_HELP;Help
-!HISTORY_MSG_494;Capture Sharpening
-!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
-!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
-!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
-!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
-!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
-!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
-!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
-!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
-!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
-!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
-!HISTORY_MSG_TRANS_Method;Geometry - Method
-!PARTIALPASTE_FILMNEGATIVE;Film Negative
-!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode
-!TP_DEHAZE_LUMINANCE;Luminance only
-!TP_FILMNEGATIVE_BLUE;Blue ratio
-!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
-!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
-!TP_FILMNEGATIVE_LABEL;Film Negative
-!TP_FILMNEGATIVE_PICK;Pick neutral spots
-!TP_FILMNEGATIVE_RED;Red ratio
-!TP_LENSGEOM_LIN;Linear
-!TP_LENSGEOM_LOG;Logarithmic
-!TP_PDSHARPENING_LABEL;Capture Sharpening
-!TP_SHARPENING_ITERCHECK;Auto limit iterations
-!TP_SHARPENING_RADIUS_BOOST;Corner radius boost
diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US)
index d8c497f16..1bd319e6f 100644
--- a/rtdata/languages/English (US)
+++ b/rtdata/languages/English (US)
@@ -937,7 +937,7 @@
!MAIN_TOOLTIP_BACKCOLOR0;Background color of the preview: theme-based\nShortcut: 9
!MAIN_TOOLTIP_BACKCOLOR1;Background color of the preview: black\nShortcut: 9
!MAIN_TOOLTIP_BACKCOLOR2;Background color of the preview: white\nShortcut: 9
-!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9
+!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle gray\nShortcut: 9
!MAIN_TOOLTIP_BEFOREAFTERLOCK;Lock / Unlock the Before view\n\nLock: keep the Before view unchanged.\nUseful to evaluate the cumulative effect of multiple tools.\nAdditionally, comparisons can be made to any state in the History.\n\nUnlock: the Before view will follow the After view one step behind, showing the image before the effect of the currently used tool.
!MAIN_TOOLTIP_HIDEHP;Show/Hide the left panel (including the history).\nShortcut: l
!MAIN_TOOLTIP_INDCLIPPEDH;Clipped highlight indication.\nShortcut: >
@@ -2097,7 +2097,7 @@
!TP_WAVELET_APPLYTO;Apply To
!TP_WAVELET_AVOID;Avoid color shift
!TP_WAVELET_B0;Black
-!TP_WAVELET_B1;Grey
+!TP_WAVELET_B1;Gray
!TP_WAVELET_B2;Residual
!TP_WAVELET_BACKGROUND;Background
!TP_WAVELET_BACUR;Curve
diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands
index c43f6314e..ba5880bfb 100644
--- a/rtdata/languages/Nederlands
+++ b/rtdata/languages/Nederlands
@@ -14,6 +14,7 @@
#14 2015-11-23 update by wim ter meer
#15 2016-07-21 update by wim ter meer
#16 2017-04-21 update by wim ter meer
+#17 2020-06-05 update by dheijl
ABOUT_TAB_BUILD;Versie
ABOUT_TAB_CREDITS;Credits
@@ -1962,367 +1963,367 @@ ZOOMPANEL_ZOOMOUT;Zoom uit\nSneltoets: -
! Untranslated keys follow; remove the ! prefix after an entry is translated.
!!!!!!!!!!!!!!!!!!!!!!!!!
-!ADJUSTER_RESET_TO_DEFAULT;Click - reset to default value.\nCtrl+click - reset to initial value.
-!CURVEEDITOR_CATMULLROM;Flexible
-!DONT_SHOW_AGAIN;Don't show this message again.
-!DYNPROFILEEDITOR_IMGTYPE_ANY;Any
-!DYNPROFILEEDITOR_IMGTYPE_HDR;HDR
-!DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift
-!DYNPROFILEEDITOR_IMGTYPE_STD;Standard
-!EXIFFILTER_IMAGETYPE;Image type
-!EXIFPANEL_SHOWALL;Show all
-!FILEBROWSER_BROWSEPATHBUTTONHINT;Click to open specified path, reload folder and apply "find" keywords.
-!FILEBROWSER_CACHECLEARFROMFULL;Clear all including cached profiles
-!FILEBROWSER_CACHECLEARFROMPARTIAL;Clear all except cached profiles
-!FILEBROWSER_DELETEDIALOG_ALL;Are you sure you want to permanently delete all %1 files in trash?
-!FILEBROWSER_DELETEDIALOG_SELECTED;Are you sure you want to permanently delete the selected %1 files?
-!FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Are you sure you want to permanently delete the selected %1 files, including a queue-processed version?
-!FILEBROWSER_EMPTYTRASHHINT;Permanently delete all files in trash.
-!FILEBROWSER_POPUPREMOVE;Delete permanently
-!FILEBROWSER_POPUPREMOVEINCLPROC;Delete permanently, including queue-processed version
-!FILEBROWSER_SHOWNOTTRASHHINT;Show only images not in trash.
-!GENERAL_CURRENT;Current
-!GENERAL_HELP;Help
-!GENERAL_RESET;Reset
-!GENERAL_SAVE_AS;Save as...
-!GENERAL_SLIDER;Slider
-!GIMP_PLUGIN_INFO;Welcome to the RawTherapee GIMP plugin!\nOnce you are done editing, simply close the main RawTherapee window and the image will be automatically imported in GIMP.
-!HISTOGRAM_TOOLTIP_MODE;Toggle between linear, log-linear and log-log scaling of the histogram.
-!HISTORY_MSG_173;NR - Detail recovery
-!HISTORY_MSG_203;NR - Color space
-!HISTORY_MSG_235;B&W - CM - Auto
-!HISTORY_MSG_237;B&W - CM
-!HISTORY_MSG_256;NR - Median - Type
-!HISTORY_MSG_273;CT - Color Balance SMH
-!HISTORY_MSG_297;NR - Mode
-!HISTORY_MSG_392;W - Residual - Color Balance
-!HISTORY_MSG_441;Retinex - Gain transmission
-!HISTORY_MSG_475;PS - Equalize channel
-!HISTORY_MSG_476;CAM02 - Temp out
-!HISTORY_MSG_477;CAM02 - Green out
-!HISTORY_MSG_478;CAM02 - Yb out
-!HISTORY_MSG_479;CAM02 - CAT02 adaptation out
-!HISTORY_MSG_480;CAM02 - Automatic CAT02 out
-!HISTORY_MSG_481;CAM02 - Temp scene
-!HISTORY_MSG_482;CAM02 - Green scene
-!HISTORY_MSG_483;CAM02 - Yb scene
-!HISTORY_MSG_484;CAM02 - Auto Yb scene
-!HISTORY_MSG_485;Lens Correction
-!HISTORY_MSG_486;Lens Correction - Camera
-!HISTORY_MSG_487;Lens Correction - Lens
-!HISTORY_MSG_488;Dynamic Range Compression
-!HISTORY_MSG_489;DRC - Detail
-!HISTORY_MSG_490;DRC - Amount
-!HISTORY_MSG_491;White Balance
-!HISTORY_MSG_492;RGB Curves
-!HISTORY_MSG_493;L*a*b* Adjustments
-!HISTORY_MSG_494;Capture Sharpening
-!HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
-!HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
-!HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Color correction
-!HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Channel
-!HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - region C mask
-!HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H mask
-!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Lightness
-!HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L mask
-!HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - List
-!HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - region mask blur
-!HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - region offset
-!HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - region power
-!HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Saturation
-!HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - region show mask
-!HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - region slope
-!HISTORY_MSG_DEHAZE_DEPTH;Dehaze - Depth
-!HISTORY_MSG_DEHAZE_ENABLED;Haze Removal
-!HISTORY_MSG_DEHAZE_LUMINANCE;Dehaze - Luminance only
-!HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Dehaze - Show depth map
-!HISTORY_MSG_DEHAZE_STRENGTH;Dehaze - Strength
-!HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual demosaic - Auto threshold
-!HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual demosaic - Contrast threshold
-!HISTORY_MSG_FILMNEGATIVE_ENABLED;Film Negative
-!HISTORY_MSG_FILMNEGATIVE_VALUES;Film negative values
-!HISTORY_MSG_HISTMATCHING;Auto-matched tone curve
-!HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Output - Primaries
-!HISTORY_MSG_ICM_OUTPUT_TEMP;Output - ICC-v4 illuminant D
-!HISTORY_MSG_ICM_OUTPUT_TYPE;Output - Type
-!HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma
-!HISTORY_MSG_ICM_WORKING_SLOPE;Working - Slope
-!HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC method
-!HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Amount
-!HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Darkness
-!HISTORY_MSG_LOCALCONTRAST_ENABLED;Local Contrast
-!HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Local Contrast - Lightness
-!HISTORY_MSG_LOCALCONTRAST_RADIUS;Local Contrast - Radius
-!HISTORY_MSG_METADATA_MODE;Metadata copy mode
-!HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrast threshold
-!HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto threshold
-!HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
-!HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limit iterations
-!HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrast threshold
-!HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Iterations
-!HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
-!HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Corner radius boost
-!HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
-!HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
-!HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
-!HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold
-!HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations
-!HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift
-!HISTORY_MSG_RAW_BORDER;Raw border
-!HISTORY_MSG_RESIZE_ALLOWUPSCALING;Resize - Allow upscaling
-!HISTORY_MSG_SHARPENING_BLUR;Sharpening - Blur radius
-!HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold
-!HISTORY_MSG_SH_COLORSPACE;S/H - Colorspace
-!HISTORY_MSG_SOFTLIGHT_ENABLED;Soft light
-!HISTORY_MSG_SOFTLIGHT_STRENGTH;Soft light - Strength
-!HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor
-!HISTORY_MSG_TRANS_Method;Geometry - Method
-!ICCPROFCREATOR_COPYRIGHT;Copyright:
-!ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Reset to the default copyright, granted to "RawTherapee, CC0"
-!ICCPROFCREATOR_CUSTOM;Custom
-!ICCPROFCREATOR_DESCRIPTION;Description:
-!ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Append gamma and slope values to the description
-!ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Leave empty to set the default description.
-!ICCPROFCREATOR_GAMMA;Gamma
-!ICCPROFCREATOR_ICCVERSION;ICC version:
-!ICCPROFCREATOR_ILL;Illuminant:
-!ICCPROFCREATOR_ILL_41;D41
-!ICCPROFCREATOR_ILL_50;D50
-!ICCPROFCREATOR_ILL_55;D55
-!ICCPROFCREATOR_ILL_60;D60
-!ICCPROFCREATOR_ILL_65;D65
-!ICCPROFCREATOR_ILL_80;D80
-!ICCPROFCREATOR_ILL_DEF;Default
-!ICCPROFCREATOR_ILL_INC;StdA 2856K
-!ICCPROFCREATOR_ILL_TOOLTIP;You can only set the illuminant for ICC v4 profiles.
-!ICCPROFCREATOR_PRIMARIES;Primaries:
-!ICCPROFCREATOR_PRIM_ACESP0;ACES AP0
-!ICCPROFCREATOR_PRIM_ACESP1;ACES AP1
-!ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998)
-!ICCPROFCREATOR_PRIM_BEST;BestRGB
-!ICCPROFCREATOR_PRIM_BETA;BetaRGB
-!ICCPROFCREATOR_PRIM_BLUX;Blue X
-!ICCPROFCREATOR_PRIM_BLUY;Blue Y
-!ICCPROFCREATOR_PRIM_BRUCE;BruceRGB
-!ICCPROFCREATOR_PRIM_GREX;Green X
-!ICCPROFCREATOR_PRIM_GREY;Green Y
-!ICCPROFCREATOR_PRIM_PROPH;Prophoto
-!ICCPROFCREATOR_PRIM_REC2020;Rec2020
-!ICCPROFCREATOR_PRIM_REDX;Red X
-!ICCPROFCREATOR_PRIM_REDY;Red Y
-!ICCPROFCREATOR_PRIM_SRGB;sRGB
-!ICCPROFCREATOR_PRIM_TOOLTIP;You can only set custom primaries for ICC v4 profiles.
-!ICCPROFCREATOR_PRIM_WIDEG;Widegamut
-!ICCPROFCREATOR_PROF_V2;ICC v2
-!ICCPROFCREATOR_PROF_V4;ICC v4
-!ICCPROFCREATOR_SAVEDIALOG_TITLE;Save ICC profile as...
-!ICCPROFCREATOR_SLOPE;Slope
-!ICCPROFCREATOR_TRC_PRESET;Tone response curve:
-!MAIN_BUTTON_ICCPROFCREATOR;ICC Profile Creator
-!MAIN_FRAME_PLACES_DEL;Remove
-!MAIN_MSG_TOOMANYOPENEDITORS;Too many open editors.\nPlease close an editor to continue.
-!MAIN_TAB_ADVANCED;Advanced
-!MAIN_TAB_ADVANCED_TOOLTIP;Shortcut: Alt-a
-!MAIN_TAB_FAVORITES;Favorites
-!MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u
-!MAIN_TOOLTIP_BACKCOLOR3;Background color of the preview: middle grey\nShortcut: 9
-!MAIN_TOOLTIP_PREVIEWSHARPMASK;Preview the sharpening contrast mask.\nShortcut: p\n\nOnly works when sharpening is enabled and zoom >= 100%.
-!OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead.
-!OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead.
-!OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead.
-!PARTIALPASTE_ADVANCEDGROUP;Advanced Settings
-!PARTIALPASTE_DEHAZE;Haze removal
-!PARTIALPASTE_FILMNEGATIVE;Film Negative
-!PARTIALPASTE_LOCALCONTRAST;Local contrast
-!PARTIALPASTE_METADATA;Metadata mode
-!PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
-!PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift
-!PARTIALPASTE_RAW_BORDER;Raw border
-!PARTIALPASTE_SOFTLIGHT;Soft light
-!PARTIALPASTE_TM_FATTAL;Dynamic range compression
-!PREFERENCES_APPEARANCE;Appearance
-!PREFERENCES_APPEARANCE_COLORPICKERFONT;Color picker font
-!PREFERENCES_APPEARANCE_CROPMASKCOLOR;Crop mask color
-!PREFERENCES_APPEARANCE_MAINFONT;Main font
-!PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI mode
-!PREFERENCES_APPEARANCE_THEME;Theme
-!PREFERENCES_AUTOSAVE_TP_OPEN;Save tool collapsed/expanded state on exit
-!PREFERENCES_CACHECLEAR;Clear
-!PREFERENCES_CACHECLEAR_ALL;Clear all cached files:
-!PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Clear all cached files except for cached processing profiles:
-!PREFERENCES_CACHECLEAR_ONLYPROFILES;Clear only cached processing profiles:
-!PREFERENCES_CACHECLEAR_SAFETY;Only files in the cache are cleared. Processing profiles stored alongside the source images are not touched.
-!PREFERENCES_CHUNKSIZES;Tiles per thread
-!PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demosaic
-!PREFERENCES_CHUNKSIZE_RAW_CA;Raw CA correction
-!PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaic
-!PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaic
-!PREFERENCES_CHUNKSIZE_RGB;RGB processing
-!PREFERENCES_CROP;Crop Editing
-!PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop
-!PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop
-!PREFERENCES_CROP_GUIDES_FRAME;Frame
-!PREFERENCES_CROP_GUIDES_FULL;Original
-!PREFERENCES_CROP_GUIDES_NONE;None
-!PREFERENCES_DIRECTORIES;Directories
-!PREFERENCES_EDITORCMDLINE;Custom command line
-!PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compact toolbars in File Browser
-!PREFERENCES_LANG;Language
-!PREFERENCES_PERFORMANCE_MEASURE;Measure
-!PREFERENCES_PERFORMANCE_MEASURE_HINT;Logs processing times in console
-!PREFERENCES_PERFORMANCE_THREADS;Threads
-!PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximum number of threads for Noise Reduction and Wavelet Levels (0 = Automatic)
-!PREFERENCES_PROFILESAVEBOTH;Save processing profile both to the cache and next to the input file
-!PREFERENCES_PROFILESAVELOCATION;Processing profile saving location
-!PREFERENCES_SAVE_TP_OPEN_NOW;Save tool collapsed/expanded state now
-!PREFERENCES_TAB_PERFORMANCE;Performance
-!PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Embedded JPEG preview
-!PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Image to show
-!PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutral raw rendering
-!PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Embedded JPEG if fullsize, neutral raw otherwise
-!PROGRESSBAR_DECODING;Decoding...
-!PROGRESSBAR_GREENEQUIL;Green equilibration...
-!PROGRESSBAR_HLREC;Highlight reconstruction...
-!PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter...
-!PROGRESSBAR_LINEDENOISE;Line noise filter...
-!PROGRESSBAR_RAWCACORR;Raw CA correction...
-!QINFO_FRAMECOUNT;%2 frames
-!QINFO_HDR;HDR / %2 frame(s)
-!QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s)
-!QUEUE_LOCATION_TITLE;Output Location
-!QUEUE_STARTSTOP_TOOLTIP;Start or stop processing the images in the queue.\n\nShortcut: Ctrl+s
-!SAMPLEFORMAT_0;Unknown data format
-!SAMPLEFORMAT_1;8-bit unsigned
-!SAMPLEFORMAT_2;16-bit unsigned
-!SAMPLEFORMAT_4;24-bit LogLuv
-!SAMPLEFORMAT_8;32-bit LogLuv
-!SAMPLEFORMAT_16;16-bit floating-point
-!SAMPLEFORMAT_32;24-bit floating-point
-!SAMPLEFORMAT_64;32-bit floating-point
-!SAVEDLG_FILEFORMAT_FLOAT; floating-point
-!SOFTPROOF_GAMUTCHECK_TOOLTIP;Highlight pixels with out-of-gamut colors with respect to:\n- the printer profile, if one is set and soft-proofing is enabled,\n- the output profile, if a printer profile is not set and soft-proofing is enabled,\n- the monitor profile, if soft-proofing is disabled.
-!SOFTPROOF_TOOLTIP;Soft-proofing simulates the appearance of the image:\n- when printed, if a printer profile is set in Preferences > Color Management,\n- when viewed on a display that uses the current output profile, if a printer profile is not set.
-!TP_BWMIX_MIXC;Channel Mixer
-!TP_BWMIX_NEUTRAL;Reset
-!TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminance
-!TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;When setting manually, values above 65 are recommended.
-!TP_COLORAPP_FREE;Free temp+green + CAT02 + [output]
-!TP_COLORAPP_MEANLUMINANCE;Mean luminance (Yb%)
-!TP_COLORAPP_NEUTRAL;Reset
-!TP_COLORAPP_NEUTRAL_TIP;Reset all sliders checkbox and curves to their default values
-!TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504
-!TP_COLORTONING_LABGRID;L*a*b* color correction grid
-!TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4
-!TP_COLORTONING_LABREGIONS;Color correction regions
-!TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2
-!TP_COLORTONING_LABREGION_CHANNEL;Channel
-!TP_COLORTONING_LABREGION_CHANNEL_ALL;All
-!TP_COLORTONING_LABREGION_CHANNEL_B;Blue
-!TP_COLORTONING_LABREGION_CHANNEL_G;Green
-!TP_COLORTONING_LABREGION_CHANNEL_R;Red
-!TP_COLORTONING_LABREGION_CHROMATICITYMASK;C
-!TP_COLORTONING_LABREGION_HUEMASK;H
-!TP_COLORTONING_LABREGION_LIGHTNESS;Lightness
-!TP_COLORTONING_LABREGION_LIGHTNESSMASK;L
-!TP_COLORTONING_LABREGION_LIST_TITLE;Correction
-!TP_COLORTONING_LABREGION_MASK;Mask
-!TP_COLORTONING_LABREGION_MASKBLUR;Mask Blur
-!TP_COLORTONING_LABREGION_OFFSET;Offset
-!TP_COLORTONING_LABREGION_POWER;Power
-!TP_COLORTONING_LABREGION_SATURATION;Saturation
-!TP_COLORTONING_LABREGION_SHOWMASK;Show mask
-!TP_COLORTONING_LABREGION_SLOPE;Slope
-!TP_CROP_PPI;PPI
-!TP_CROP_RESETCROP;Reset
-!TP_CROP_SELECTCROP;Select
-!TP_DEHAZE_DEPTH;Depth
-!TP_DEHAZE_LABEL;Haze Removal
-!TP_DEHAZE_LUMINANCE;Luminance only
-!TP_DEHAZE_SHOW_DEPTH_MAP;Show depth map
-!TP_DEHAZE_STRENGTH;Strength
-!TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Increase (multiply) the value of all chrominance sliders.\nThis curve lets you adjust the strength of chromatic noise reduction as a function of chromaticity, for instance to increase the action in areas of low saturation and to decrease it in those of high saturation.
-!TP_DIRPYRDENOISE_LABEL;Noise Reduction
-!TP_EXPOSURE_CLAMPOOG;Clip out-of-gamut colors
-!TP_EXPOSURE_HISTMATCHING;Auto-Matched Tone Curve
-!TP_EXPOSURE_HISTMATCHING_TOOLTIP;Automatically adjust sliders and curves (except exposure compensation) to match the look of the embedded JPEG thumbnail.
-!TP_FILMNEGATIVE_BLUE;Blue ratio
-!TP_FILMNEGATIVE_GREEN;Reference exponent (contrast)
-!TP_FILMNEGATIVE_GUESS_TOOLTIP;Automatically set the red and blue ratios by picking two patches which had a neutral hue (no color) in the original scene. The patches should differ in brightness. Set the white balance afterwards.
-!TP_FILMNEGATIVE_LABEL;Film Negative
-!TP_FILMNEGATIVE_PICK;Pick neutral spots
-!TP_FILMNEGATIVE_RED;Red ratio
-!TP_ICM_WORKING_TRC;Tone response curve:
-!TP_ICM_WORKING_TRC_CUSTOM;Custom
-!TP_ICM_WORKING_TRC_GAMMA;Gamma
-!TP_ICM_WORKING_TRC_NONE;None
-!TP_ICM_WORKING_TRC_SLOPE;Slope
-!TP_ICM_WORKING_TRC_TOOLTIP;Only for built-in profiles.
-!TP_LENSGEOM_LIN;Linear
-!TP_LENSGEOM_LOG;Logarithmic
-!TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatically selected
-!TP_LENSPROFILE_CORRECTION_LCPFILE;LCP file
-!TP_LENSPROFILE_CORRECTION_MANUAL;Manually selected
-!TP_LENSPROFILE_LENS_WARNING;Warning: the crop factor used for lens profiling is larger than the crop factor of the camera, the results might be wrong.
-!TP_LENSPROFILE_MODE_HEADER;Lens Profile
-!TP_LENSPROFILE_USE_CA;Chromatic aberration
-!TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion
-!TP_LENSPROFILE_USE_HEADER;Correct
-!TP_LENSPROFILE_USE_VIGNETTING;Vignetting
-!TP_LOCALCONTRAST_AMOUNT;Amount
-!TP_LOCALCONTRAST_DARKNESS;Darkness level
-!TP_LOCALCONTRAST_LABEL;Local Contrast
-!TP_LOCALCONTRAST_LIGHTNESS;Lightness level
-!TP_LOCALCONTRAST_RADIUS;Radius
-!TP_METADATA_EDIT;Apply modifications
-!TP_METADATA_MODE;Metadata copy mode
-!TP_METADATA_STRIP;Strip all metadata
-!TP_METADATA_TUNNEL;Copy unchanged
-!TP_PDSHARPENING_LABEL;Capture Sharpening
-!TP_PREPROCESS_LINEDENOISE_DIRECTION;Direction
-!TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Both
-!TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontal
-!TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows
-!TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical
-!TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
-!TP_RAWCACORR_AUTOIT;Iterations
-!TP_RAWCACORR_AUTOIT_TOOLTIP;This setting is available if "Auto-correction" is checked.\nAuto-correction is conservative, meaning that it often does not correct all chromatic aberration.\nTo correct the remaining chromatic aberration, you can use up to five iterations of automatic chromatic aberration correction.\nEach iteration will reduce the remaining chromatic aberration from the last iteration at the cost of additional processing time.
-!TP_RAWCACORR_AVOIDCOLORSHIFT;Avoid color shift
-!TP_RAW_2PASS;1-pass+fast
-!TP_RAW_4PASS;3-pass+fast
-!TP_RAW_AMAZEVNG4;AMaZE+VNG4
-!TP_RAW_BORDER;Border
-!TP_RAW_DCBVNG4;DCB+VNG4
-!TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto threshold
-!TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;If the checkbox is checked (recommended), RawTherapee calculates an optimum value based on flat regions in the image.\nIf there is no flat region in the image or the image is too noisy, the value will be set to 0.\nTo set the value manually, uncheck the checkbox first (reasonable values depend on the image).
-!TP_RAW_DUALDEMOSAICCONTRAST;Contrast threshold
-!TP_RAW_IMAGENUM_SN;SN mode
-!TP_RAW_IMAGENUM_TOOLTIP;Some raw files consist of several sub-images (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\n\nWhen using any demosaicing method other than Pixel Shift, this selects which sub-image is used.\n\nWhen using the Pixel Shift demosaicing method on a Pixel Shift raw, all sub-images are used, and this selects which sub-image should be used for moving parts.
-!TP_RAW_PIXELSHIFTDMETHOD;Demosaic method for motion
-!TP_RAW_PIXELSHIFTEPERISO;Sensitivity
-!TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;The default value of 0 should work fine for base ISO.\nHigher values increase sensitivity of motion detection.\nChange in small steps and watch the motion mask while changing.\nIncrease sensitivity for underexposed or high ISO images.
-!TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Equalize per channel
-!TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Enabled: Equalize the RGB channels individually.\nDisabled: Use same equalization factor for all channels.
-!TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Overlays the image with a green mask showing the regions with motion.
-!TP_RAW_RCD;RCD
-!TP_RAW_RCDVNG4;RCD+VNG4
-!TP_RAW_XTRANS;X-Trans
-!TP_RAW_XTRANSFAST;Fast X-Trans
-!TP_RESIZE_ALLOW_UPSCALING;Allow Upscaling
-!TP_RETINEX_CONTEDIT_MAP;Equalizer
-!TP_RETINEX_GAINOFFS;Gain and Offset (brightness)
-!TP_RETINEX_GAINTRANSMISSION;Gain transmission
-!TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Amplify or reduce the transmission map to achieve the desired luminance.\nThe x-axis is the transmission.\nThe y-axis is the gain.
-!TP_RETINEX_MAP;Method
-!TP_SHARPENING_BLUR;Blur radius
-!TP_SHARPENING_CONTRAST;Contrast threshold
-!TP_SHARPENING_ITERCHECK;Auto limit iterations
-!TP_SHARPENING_RADIUS_BOOST;Corner radius boost
-!TP_SHARPENMICRO_CONTRAST;Contrast threshold
-!TP_SOFTLIGHT_LABEL;Soft Light
-!TP_SOFTLIGHT_STRENGTH;Strength
-!TP_TM_FATTAL_AMOUNT;Amount
-!TP_TM_FATTAL_ANCHOR;Anchor
-!TP_TM_FATTAL_LABEL;Dynamic Range Compression
-!TP_TM_FATTAL_THRESHOLD;Detail
-!TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
-!TP_WBALANCE_PICKER;Pick
+ADJUSTER_RESET_TO_DEFAULT;Klik - terug naar standaardwaarde.\nCtrl+klik - terug naar laatst opgeslagen waarde.
+CURVEEDITOR_CATMULLROM;Flexibel
+DONT_SHOW_AGAIN;Dit bericht niet meer tonen
+DYNPROFILEEDITOR_IMGTYPE_ANY;Alles
+DYNPROFILEEDITOR_IMGTYPE_HDR;HDR
+DYNPROFILEEDITOR_IMGTYPE_PS;Pixel Shift
+DYNPROFILEEDITOR_IMGTYPE_STD;Standaard
+EXIFFILTER_IMAGETYPE;Type afbeelding
+EXIFPANEL_SHOWALL;Toon alles
+FILEBROWSER_BROWSEPATHBUTTONHINT;Klik om de opgegeven map te laden, en het zoekfilter opnieuw toe te passen.
+FILEBROWSER_CACHECLEARFROMFULL;Wis alles inclusief opgeslagen profielen
+FILEBROWSER_CACHECLEARFROMPARTIAL;Wis alles behalve opgeslagen profielen
+FILEBROWSER_DELETEDIALOG_ALL;Alle %1 bestanden in de prullenbak definitief verwijderen?
+FILEBROWSER_DELETEDIALOG_SELECTED;Geselecteerde %1 bestanden definitief verwijderen?
+FILEBROWSER_DELETEDIALOG_SELECTEDINCLPROC;Geselecteerde %1 bestanden inclusief een versie die door de verwerkingsrij is gemaakt verwijderen?
+FILEBROWSER_EMPTYTRASHHINT;Alle bestanden in de prullenbak permanent verwijderen
+FILEBROWSER_POPUPREMOVE;Permanent verwijderen
+FILEBROWSER_POPUPREMOVEINCLPROC;Verwijder definitief, inclusief met uitvoer in de verwerkingsrij
+FILEBROWSER_SHOWNOTTRASHHINT;Toon alleen niet-verwijderde afbeeldingen.
+GENERAL_CURRENT;Huidig
+GENERAL_HELP;Help
+GENERAL_RESET;Terugzetten
+GENERAL_SAVE_AS;Bewaren als...
+GENERAL_SLIDER;Schuifregelaar
+GIMP_PLUGIN_INFO;Welkom bij de RawTherapee GIMP plug-in!\nAls uw bewerking gereed is, sluit dan het hoofdvenster van RawTherapee en uw afbeelding wordt automatisch in GIMP geladen.
+HISTOGRAM_TOOLTIP_MODE;Wissel tussen lineair, log-lineair and log-log schalen van het histogram.
+HISTORY_MSG_173;NR - Detailbehoud
+HISTORY_MSG_203;NR - Kleurruimte
+HISTORY_MSG_235;B&W - CM - Auto
+HISTORY_MSG_237;B&W - CM
+HISTORY_MSG_256;NR - Mediaan - Type
+HISTORY_MSG_273;CT - Kleurbalans SMH
+HISTORY_MSG_297;NR - Modus
+HISTORY_MSG_392;W - Overblijvend - Kleurbalans
+HISTORY_MSG_441;Retinex - Toename transmissie
+HISTORY_MSG_475;PS - Kanaalbalans
+HISTORY_MSG_476;CAM02 - Temp uit
+HISTORY_MSG_477;CAM02 - Groen uit
+HISTORY_MSG_478;CAM02 - Yb uit
+HISTORY_MSG_479;CAM02 - CAT02 aanpassing uit
+HISTORY_MSG_480;CAM02 - Automatische CAT02 uit
+HISTORY_MSG_481;CAM02 - Temp scène
+HISTORY_MSG_482;CAM02 - Groen scène
+HISTORY_MSG_483;CAM02 - Yb scène
+HISTORY_MSG_484;CAM02 - Auto Yb scène
+HISTORY_MSG_485;Lenscorrectie
+HISTORY_MSG_486;Lenscorrectie - Camera
+HISTORY_MSG_487;Lenscorrectie - Lens
+HISTORY_MSG_488;Compressie Dynamisch Bereik
+HISTORY_MSG_489;DRC - Detail
+HISTORY_MSG_490;DRC - Hoeveelheid
+HISTORY_MSG_491;Witbalans
+HISTORY_MSG_492;RGB Curven
+HISTORY_MSG_493;L*a*b* Adjustments
+HISTORY_MSG_494;verscherpen
+HISTORY_MSG_CLAMPOOG;Kleuren afkappen die buiten het gamma vallen
+HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Kleurcorrectie
+HISTORY_MSG_COLORTONING_LABREGION_AB;CT - Kleurcorrectie
+HISTORY_MSG_COLORTONING_LABREGION_CHANNEL;CT - Kanaal
+HISTORY_MSG_COLORTONING_LABREGION_CHROMATICITYMASK;CT - gebied C masker
+HISTORY_MSG_COLORTONING_LABREGION_HUEMASK;CT - H masker
+HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESS;CT - Licht
+HISTORY_MSG_COLORTONING_LABREGION_LIGHTNESSMASK;CT - L masker
+HISTORY_MSG_COLORTONING_LABREGION_LIST;CT - Lijst
+HISTORY_MSG_COLORTONING_LABREGION_MASKBLUR;CT - verzachtingsmasker gebied
+HISTORY_MSG_COLORTONING_LABREGION_OFFSET;CT - offset gebied
+HISTORY_MSG_COLORTONING_LABREGION_POWER;CT - sterkte gebied
+HISTORY_MSG_COLORTONING_LABREGION_SATURATION;CT - Verzadiging
+HISTORY_MSG_COLORTONING_LABREGION_SHOWMASK;CT - toon gebiedsmasker
+HISTORY_MSG_COLORTONING_LABREGION_SLOPE;CT - hellingsgebied
+HISTORY_MSG_DEHAZE_DEPTH;Nevelvermindering - Diepte
+HISTORY_MSG_DEHAZE_ENABLED;Nevelvermindering
+HISTORY_MSG_DEHAZE_LUMINANCE;Nevelvermindering - Alleen Luminantie
+HISTORY_MSG_DEHAZE_SHOW_DEPTH_MAP;Nevelvermindering - Toon dieptemap
+HISTORY_MSG_DEHAZE_STRENGTH;Nevelvermindering - Sterkte
+HISTORY_MSG_DUALDEMOSAIC_AUTO_CONTRAST;Dual-demozaïek - auto-drempel
+HISTORY_MSG_DUALDEMOSAIC_CONTRAST;Dual-demozaïek - Contrastdrempel
+HISTORY_MSG_FILMNEGATIVE_ENABLED;Filmnegatief
+HISTORY_MSG_FILMNEGATIVE_VALUES;Filmnegatief waarden
+HISTORY_MSG_HISTMATCHING;Auto-matched tooncurve
+HISTORY_MSG_ICM_OUTPUT_PRIMARIES;Uitvoer - Primaries
+HISTORY_MSG_ICM_OUTPUT_TEMP;Uitvoer - ICC-v4 illuminant D
+HISTORY_MSG_ICM_OUTPUT_TYPE;Uitvoer - Type
+HISTORY_MSG_ICM_WORKING_GAMMA;Working - Gamma
+HISTORY_MSG_ICM_WORKING_SLOPE;Working - Helling
+HISTORY_MSG_ICM_WORKING_TRC_METHOD;Working - TRC methode
+HISTORY_MSG_LOCALCONTRAST_AMOUNT;Local Contrast - Hoeveelheid
+HISTORY_MSG_LOCALCONTRAST_DARKNESS;Local Contrast - Donker
+HISTORY_MSG_LOCALCONTRAST_ENABLED;Lokaal Contrast
+HISTORY_MSG_LOCALCONTRAST_LIGHTNESS;Lokaal Contrast - Licht
+HISTORY_MSG_LOCALCONTRAST_RADIUS;Lokaal Contrast - Radius
+HISTORY_MSG_METADATA_MODE;Metadata kopieermodus
+HISTORY_MSG_MICROCONTRAST_CONTRAST;Microcontrast - Contrastdrempel
+HISTORY_MSG_PDSHARPEN_AUTO_CONTRAST;CS - Auto drempel
+HISTORY_MSG_PDSHARPEN_AUTO_RADIUS;CS - Auto radius
+HISTORY_MSG_PDSHARPEN_CHECKITER;CS - Auto limiet herhalingen
+HISTORY_MSG_PDSHARPEN_CONTRAST;CS - Contrastdrempel
+HISTORY_MSG_PDSHARPEN_ITERATIONS;CS - Herhalingen
+HISTORY_MSG_PDSHARPEN_RADIUS;CS - Radius
+HISTORY_MSG_PDSHARPEN_RADIUS_BOOST;CS - Toename hoekradius
+HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demozaïekmethode voor beweging
+HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;lijnruisfilter richting
+HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lijnfilter
+HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrastdrempel
+HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correctie - Herhalingen
+HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correctie - Vermijd kleurverschuiving
+HISTORY_MSG_RAW_BORDER;Raw rand
+HISTORY_MSG_RESIZE_ALLOWUPSCALING;Schalen - sta vergroting toe
+HISTORY_MSG_SHARPENING_BLUR;Verscherpen - Vervagingsradius
+HISTORY_MSG_SHARPENING_CONTRAST;Verscherpen - Contrastdrempel
+HISTORY_MSG_SH_COLORSPACE;S/H - Kleurruimte
+HISTORY_MSG_SOFTLIGHT_ENABLED;Zacht licht
+HISTORY_MSG_SOFTLIGHT_STRENGTH;Zacht licht - Sterkte
+HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anker
+HISTORY_MSG_TRANS_Method;Geometrie - Methode
+ICCPROFCREATOR_COPYRIGHT;Copyright:
+ICCPROFCREATOR_COPYRIGHT_RESET_TOOLTIP;Zet terug naar standaard copyright, verleend aan "RawTherapee, CC0"
+ICCPROFCREATOR_CUSTOM;Handmatig
+ICCPROFCREATOR_DESCRIPTION;Beschriiving:
+ICCPROFCREATOR_DESCRIPTION_ADDPARAM;Voeg gamma- en hellingwaarden toe aan de beschrijving
+ICCPROFCREATOR_DESCRIPTION_TOOLTIP;Laat leeg voor de standaard beschrijving.
+ICCPROFCREATOR_GAMMA;Gamma
+ICCPROFCREATOR_ICCVERSION;ICC versie:
+ICCPROFCREATOR_ILL;Illuminant:
+ICCPROFCREATOR_ILL_41;D41
+ICCPROFCREATOR_ILL_50;D50
+ICCPROFCREATOR_ILL_55;D55
+ICCPROFCREATOR_ILL_60;D60
+ICCPROFCREATOR_ILL_65;D65
+ICCPROFCREATOR_ILL_80;D80
+ICCPROFCREATOR_ILL_DEF;Standaard
+ICCPROFCREATOR_ILL_INC;StdA 2856K
+ICCPROFCREATOR_ILL_TOOLTIP;U kunt alleen de illuminant instellen voor ICC v4-profielen.
+ICCPROFCREATOR_PRIMARIES;Primaire kleuren:
+ICCPROFCREATOR_PRIM_ACESP0;ACES AP0
+ICCPROFCREATOR_PRIM_ACESP1;ACES AP1
+ICCPROFCREATOR_PRIM_ADOBE;Adobe RGB (1998)
+ICCPROFCREATOR_PRIM_BEST;BestRGB
+ICCPROFCREATOR_PRIM_BETA;BetaRGB
+ICCPROFCREATOR_PRIM_BLUX;Blauw X
+ICCPROFCREATOR_PRIM_BLUY;Blauw Y
+ICCPROFCREATOR_PRIM_BRUCE;BruceRGB
+ICCPROFCREATOR_PRIM_GREX;Groen X
+ICCPROFCREATOR_PRIM_GREY;Groen Y
+ICCPROFCREATOR_PRIM_PROPH;Prophoto
+ICCPROFCREATOR_PRIM_REC2020;Rec2020
+ICCPROFCREATOR_PRIM_REDX;Rood X
+ICCPROFCREATOR_PRIM_REDY;Rood Y
+ICCPROFCREATOR_PRIM_SRGB;sRGB
+ICCPROFCREATOR_PRIM_TOOLTIP;U kunt alleen aangepaste primaries voor ICC v4-profielen instellen.
+ICCPROFCREATOR_PRIM_WIDEG;Widegamut
+ICCPROFCREATOR_PROF_V2;ICC v2
+ICCPROFCREATOR_PROF_V4;ICC v4
+ICCPROFCREATOR_SAVEDIALOG_TITLE;Bewaar ICC profiel als...
+ICCPROFCREATOR_SLOPE;Helling
+ICCPROFCREATOR_TRC_PRESET;Toonresponscurve:
+MAIN_BUTTON_ICCPROFCREATOR;ICC Profielmaker
+MAIN_FRAME_PLACES_DEL;Verwijderen
+MAIN_MSG_TOOMANYOPENEDITORS;Teveel open fotobewerkers.\nSluit er een om verder te kunnen.
+MAIN_TAB_ADVANCED;Geavanceerd
+MAIN_TAB_ADVANCED_TOOLTIP;Sneltoets: Alt-a
+MAIN_TAB_FAVORITES;Favorieten
+MAIN_TAB_FAVORITES_TOOLTIP;Sneltoets: Alt-u
+MAIN_TOOLTIP_BACKCOLOR3;Achtergrondkleur van het voorbeeld: middelgrijs\nSneltoets: 9
+MAIN_TOOLTIP_PREVIEWSHARPMASK;Bekijk het scherptecontrastmasker.\nSneltoets: p\nWerkt alleen als verscherping is geactiveerd en het zoomniveau >= 100%.
+OPTIONS_BUNDLED_MISSING;Het gebundelde profiel "%1" werd niet gevonden!\n\nUw installatie kan beschadigd zijn.\n\nDaarom worden interne standaardwaarden gebruikt.
+OPTIONS_DEFIMG_MISSING;Het standaardprofiel voor niet-raw- foto's werd niet gevonden of is niet ingesteld.\n\nControleer de profielenmap, het kan ontbreken of beschadigd zijn.\n\n"%1" wordt daarom gebruikt.
+OPTIONS_DEFRAW_MISSING;Het standaardprofiel voor raw-foto's werd niet gevonden of is niet ingesteld.\n\nControleer de profielenmap, het kan ontbreken of beschadigd zijn.\n\n"%1" wordt daarom gebruikt.
+PARTIALPASTE_ADVANCEDGROUP;Geavanceerd
+PARTIALPASTE_DEHAZE;Nevel verminderen
+PARTIALPASTE_FILMNEGATIVE;Film Negatief
+PARTIALPASTE_LOCALCONTRAST;Lokaal contrast
+PARTIALPASTE_METADATA;Metadata modus
+PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lijnfilter
+PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA vermijd kleurverschuiving
+PARTIALPASTE_RAW_BORDER;Raw rand
+PARTIALPASTE_SOFTLIGHT;Zacht licht
+PARTIALPASTE_TM_FATTAL;Compressie dynamisch bereik
+PREFERENCES_APPEARANCE;Uiterlijk
+PREFERENCES_APPEARANCE_COLORPICKERFONT;Lettertype kleurenkiezer
+PREFERENCES_APPEARANCE_CROPMASKCOLOR;Kleur bijsnijdmasker
+PREFERENCES_APPEARANCE_MAINFONT;Standaard lettertype
+PREFERENCES_APPEARANCE_PSEUDOHIDPI;Pseudo-HiDPI modus
+PREFERENCES_APPEARANCE_THEME;Thema
+PREFERENCES_AUTOSAVE_TP_OPEN;Bewaar positie gereedschappen (open/dicht) bij afsluiten
+PREFERENCES_CACHECLEAR;Wissen
+PREFERENCES_CACHECLEAR_ALL;Wis alle bestanden in de cache:
+PREFERENCES_CACHECLEAR_ALLBUTPROFILES;Wis alle bestanden in de cache behalve verwerkingsprofielen:
+PREFERENCES_CACHECLEAR_ONLYPROFILES;Wis alleen verwerkingsprofielen in de cache:
+PREFERENCES_CACHECLEAR_SAFETY;Alleen bestanden in de cache worden gewist. Verwerkingsprofielen van de oorspronkelijke afbeeldingen blijven ongemoeid.
+PREFERENCES_CHUNKSIZES;Tegels per thread
+PREFERENCES_CHUNKSIZE_RAW_AMAZE;AMaZE demosaïek
+PREFERENCES_CHUNKSIZE_RAW_CA;Raw CA correctie
+PREFERENCES_CHUNKSIZE_RAW_RCD;RCD demosaïek
+PREFERENCES_CHUNKSIZE_RAW_XT;Xtrans demosaïek
+PREFERENCES_CHUNKSIZE_RGB;RGB verwerking
+PREFERENCES_CROP;Uitsnijden
+PREFERENCES_CROP_AUTO_FIT;Automatisch zoomen tot de uitsnede
+PREFERENCES_CROP_GUIDES;Getoonde hulplijnen als uitsnede niet bewerkt wordt
+PREFERENCES_CROP_GUIDES_FRAME;Frame
+PREFERENCES_CROP_GUIDES_FULL;Origineel
+PREFERENCES_CROP_GUIDES_NONE;Geen
+PREFERENCES_DIRECTORIES;Mappen
+PREFERENCES_EDITORCMDLINE;Aangepaste opdrachtregel
+PREFERENCES_FILEBROWSERTOOLBARSINGLEROW;Compacte gereedschapsbalken in bestandsnavigator
+PREFERENCES_LANG;Taal
+PREFERENCES_PERFORMANCE_MEASURE;Meting
+PREFERENCES_PERFORMANCE_MEASURE_HINT;Log verwerkingstijden in de console
+PREFERENCES_PERFORMANCE_THREADS;Threads
+PREFERENCES_PERFORMANCE_THREADS_LABEL;Maximaal aantal threads voor ruisvermindering and Wavelet Niveaus (0 = Automatisch)
+PREFERENCES_PROFILESAVEBOTH;Bewaar verwerkingsprofielen zowel in de cache als naast het invoerbestand
+PREFERENCES_PROFILESAVELOCATION;Opslaglocatie profielen
+PREFERENCES_SAVE_TP_OPEN_NOW;Bewaar open/dicht-status van de gereedschappen nu
+PREFERENCES_TAB_PERFORMANCE;Performantie
+PREFERENCES_THUMBNAIL_INSPECTOR_JPEG;Ingesloten JPEG voorbeeld
+PREFERENCES_THUMBNAIL_INSPECTOR_MODE;Te tonen foto
+PREFERENCES_THUMBNAIL_INSPECTOR_RAW;Neutrale raw rendering
+PREFERENCES_THUMBNAIL_INSPECTOR_RAW_IF_NO_JPEG_FULLSIZE;Ingesloten JPEG indien vol formaat, anders neutrale raw
+PROGRESSBAR_DECODING;Decoderen...
+PROGRESSBAR_GREENEQUIL;Groen blancering...
+PROGRESSBAR_HLREC;Reconstructie hoge lichten...
+PROGRESSBAR_HOTDEADPIXELFILTER;Hot/dead pixel filter...
+PROGRESSBAR_LINEDENOISE;Lijnruis filter...
+PROGRESSBAR_RAWCACORR;Raw CA correctie...
+QINFO_FRAMECOUNT;%2 frames
+QINFO_HDR;HDR / %2 frame(s)
+QINFO_PIXELSHIFT;Pixel Shift / %2 frame(s)
+QUEUE_LOCATION_TITLE;Uitvoerlocatie
+QUEUE_STARTSTOP_TOOLTIP;;Start of stop de verwerking van foto's in de rij.\n\nSneltoets: Ctrl+s
+SAMPLEFORMAT_0;onbekend data formaat
+SAMPLEFORMAT_1;8-bit unsigned
+SAMPLEFORMAT_2;16-bit unsigned
+SAMPLEFORMAT_4;24-bit LogLuv
+SAMPLEFORMAT_8;32-bit LogLuv
+SAMPLEFORMAT_16;16-bit drijvendekomma
+SAMPLEFORMAT_32;24-bit drijvendekomma
+SAMPLEFORMAT_64;32-bit drijvendekomma
+SAVEDLG_FILEFORMAT_FLOAT; drijvendekomma
+SOFTPROOF_GAMUTCHECK_TOOLTIP;Markeer pixels waarvan de kleuren buiten het kleurgamma vallen, relatief aan:\n- het printerprofiel, indien opgegeven en soft-proofing is ingeschakeld,\n- het uitvoerprofiel, indien geen printerprofiel is gekozen en soft-proofing is ingeschakeld,\n- het beeldschermprofiel, indien soft-proofing is uitgeschakeld.
+SOFTPROOF_TOOLTIP;Soft-proofing simuleert hoe een foto wordt getoond:\n- als deze wordt afgedrukt, indien een printerprofiel is opgegeven in Voorkeuren > Kleurbeheer,\n- als de foto getoond wordt op een beeldscherm dat het huidige uitvoerprofiel gebruikt en een printerprofiel niet is opgegeven.
+TP_BWMIX_MIXC;Kanaal Mixer
+TP_BWMIX_NEUTRAL;Terugzetten
+TP_COLORAPP_ABSOLUTELUMINANCE;Absolute luminantie
+TP_COLORAPP_CAT02ADAPTATION_TOOLTIP;Bij manuele aanpassing worden waardon boven 65 aanbevolen.
+TP_COLORAPP_FREE;Vrije temp+groen + CAT02 + [uitvoer]
+TP_COLORAPP_MEANLUMINANCE;Gemiddelde luminantie (Yb%)
+TP_COLORAPP_NEUTRAL;Terugzetten
+TP_COLORAPP_NEUTRAL_TIP;Zet alle regelaars, vinkjes en curves terug naar hun standaardwaarde
+TP_COLORAPP_TEMP_TOOLTIP;Zet altijd Tint=1 om een lichtbron te selecteren.\n\nA temp=2856\nD50 temp=5003\nD55 temp=5503\nD65 temp=6504\nD75 temp=7504
+TP_COLORTONING_LABGRID;L*a*b* kleurcorrectie raster
+TP_COLORTONING_LABGRID_VALUES;HL: a=%1 b=%2\nS: a=%3 b=%4
+TP_COLORTONING_LABREGIONS;Kleurcorrectie gebieden
+TP_COLORTONING_LABREGION_ABVALUES;a=%1 b=%2
+TP_COLORTONING_LABREGION_CHANNEL;Kanaal
+TP_COLORTONING_LABREGION_CHANNEL_ALL;Alle
+TP_COLORTONING_LABREGION_CHANNEL_B;Blauw
+TP_COLORTONING_LABREGION_CHANNEL_G;Groen
+TP_COLORTONING_LABREGION_CHANNEL_R;Rood
+TP_COLORTONING_LABREGION_CHROMATICITYMASK;C
+TP_COLORTONING_LABREGION_HUEMASK;H
+TP_COLORTONING_LABREGION_LIGHTNESS;Helderheid(L)
+TP_COLORTONING_LABREGION_LIGHTNESSMASK;L
+TP_COLORTONING_LABREGION_LIST_TITLE;Correctie
+TP_COLORTONING_LABREGION_MASK;Masker
+TP_COLORTONING_LABREGION_MASKBLUR;Verzachtingsmasker
+TP_COLORTONING_LABREGION_OFFSET;Offset
+TP_COLORTONING_LABREGION_POWER;Kracht
+TP_COLORTONING_LABREGION_SATURATION;Verzadiging
+TP_COLORTONING_LABREGION_SHOWMASK;Toon masker
+TP_COLORTONING_LABREGION_SLOPE;Helling
+TP_CROP_PPI;PPI
+TP_CROP_RESETCROP;Terugzetten
+TP_CROP_SELECTCROP;Selecteer
+TP_DEHAZE_DEPTH;Diepte
+TP_DEHAZE_LABEL;Nevel vermindering
+TP_DEHAZE_LUMINANCE;Luminantie alleen
+TP_DEHAZE_SHOW_DEPTH_MAP;Toon de dieptemap
+TP_DEHAZE_STRENGTH;Sterkte
+TP_DIRPYRDENOISE_CHROMINANCE_CURVE_TOOLTIP;Verhoog (vermenigvuldig) de waarde van alle chrominantie regelaars.\nDeze curve regelt de sterkte van de chromatische ruisvermindering als een functie van de chromaticiteit, om bijvoorbeeld het effect te vergroten in gebieden met lage verzadiging en te verminderen in deze met lage verzadiging.
+TP_DIRPYRDENOISE_LABEL;Ruisvermindering
+TP_EXPOSURE_CLAMPOOG;Knip kleuren die buiten het gamma vallen
+TP_EXPOSURE_HISTMATCHING;Automatische Tooncurve
+TP_EXPOSURE_HISTMATCHING_TOOLTIP;Pas automatisch de curves en schuifregelaars aan (behalve belichtingscompensatie) om overeen te komen met de ingesloten JPEG miniatuur.
+TP_FILMNEGATIVE_BLUE;Blauw verhouding
+TP_FILMNEGATIVE_GREEN;Referentie exponent (contrast)
+TP_FILMNEGATIVE_GUESS_TOOLTIP;Zet automatisch de rood/groen verhouding door 2 gebieden te kiezen met een neutrale tint (geen kleur) in het origineel. De gebieden moeten verschillen in helderheid. Zet de witbalans nadien.
+TP_FILMNEGATIVE_LABEL;Film Negatief
+TP_FILMNEGATIVE_PICK;Kies neutrale punten
+TP_FILMNEGATIVE_RED;Rood verhouding
+TP_ICM_WORKING_TRC;Tooncurve:
+TP_ICM_WORKING_TRC_CUSTOM;Gebruiker gedefinieerd
+TP_ICM_WORKING_TRC_GAMMA;Gamma
+TP_ICM_WORKING_TRC_NONE;Geen
+TP_ICM_WORKING_TRC_SLOPE;Helling
+TP_ICM_WORKING_TRC_TOOLTIP;Enkel voor ingebouwde profielen.
+TP_LENSGEOM_LIN;Lineair
+TP_LENSGEOM_LOG;Logarithmisch
+TP_LENSPROFILE_CORRECTION_AUTOMATCH;Automatische selectie
+TP_LENSPROFILE_CORRECTION_LCPFILE;LCP bestand
+TP_LENSPROFILE_CORRECTION_MANUAL;Manuele selectie
+TP_LENSPROFILE_LENS_WARNING;Waarschuwing: de gebruikte lens profiel crop factor komt niet overeen met de camera crop factor, de resultaten kunnen verkeerd zijn.
+TP_LENSPROFILE_MODE_HEADER;Lens Profiel
+TP_LENSPROFILE_USE_CA;Chromatische afwijking
+TP_LENSPROFILE_USE_GEOMETRIC;Geometrische vervorming
+TP_LENSPROFILE_USE_HEADER;Lenscorrecties
+TP_LENSPROFILE_USE_VIGNETTING;Vignettering
+TP_LOCALCONTRAST_AMOUNT;Hoeveelheid
+TP_LOCALCONTRAST_DARKNESS;Donker niveau
+TP_LOCALCONTRAST_LABEL;Lokaal Contrast
+TP_LOCALCONTRAST_LIGHTNESS;helderheidsniveau
+TP_LOCALCONTRAST_RADIUS;Straal
+TP_METADATA_EDIT;Pas wijzigingen toe
+TP_METADATA_MODE;Metadata kopieermodus
+TP_METADATA_STRIP;Strip alle metadata
+TP_METADATA_TUNNEL;Kopieer ongewijzigd
+TP_PDSHARPENING_LABEL;Verscherpen
+TP_PREPROCESS_LINEDENOISE_DIRECTION;Richting
+TP_PREPROCESS_LINEDENOISE_DIRECTION_BOTH;Beide
+TP_PREPROCESS_LINEDENOISE_DIRECTION_HORIZONTAL;Horizontaal
+TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontaal enkel op PDAF-rijen
+TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Verticaal
+TP_PREPROCESS_PDAFLINESFILTER;PDAF lijnfilter
+TP_RAWCACORR_AUTOIT;Herhalingen
+TP_RAWCACORR_AUTOIT_TOOLTIP;Deze schuif is alleen actief als Automatische CA-correctie is aangevinkt.\nAuto-correctie werkt conservatief en corrigeert meestal niet alle chromatische aberratie.\nOm de resterende CA te corrigeren, kunt u dit proces tot vijf keer herhalen.\nElke herhaling vermindert de CA van de vorige herhaling, maar gaat wel ten koste van extra rekentijd.
+TP_RAWCACORR_AVOIDCOLORSHIFT;Vermijd kleurverschuiving
+TP_RAW_2PASS;1-pass+snel
+TP_RAW_4PASS;3-pass+snel
+TP_RAW_AMAZEVNG4;AMaZE+VNG4
+TP_RAW_BORDER;Rand
+TP_RAW_DCBVNG4;DCB+VNG4
+TP_RAW_DUALDEMOSAICAUTOCONTRAST;Auto drempel
+TP_RAW_DUALDEMOSAICAUTOCONTRAST_TOOLTIP;Als checkbox is aangevinkt (aanbevolen), berekent RT een optimale waarde gebaseerd op vlakke gebieden in de foto.\nIndien die niet gevonden worden of de foto bevat veel ruis, wordt de waarde op 0 gezet.\nOm de waarde handmatig in te voeren moet u eerst de checkbox uitvinken (redelijke waarden zijn afhankelijk van het soort foto).
+TP_RAW_DUALDEMOSAICCONTRAST;Contrast drempel
+TP_RAW_IMAGENUM_SN;SN modus
+TP_RAW_IMAGENUM_TOOLTIP;Sommige raw bestanden bestaan uit verschillende sub-afbeeldingen (Pentax/Sony Pixel Shift, Pentax 3-in-1 HDR, Canon Dual Pixel, Fuji EXR).\n\Als een andere demozaïek methode dan Pixel Shift gebruikt wordt, selecteert dit de gebruikte sub-afbeelding.\n\nBij gebruik van de Pixel Shift demozaïek methode op een Pixel Shift raw, worden alle sub-afbeeldingen gebruikt, and dit selecteert de subafbeeldijg die gebruikt wordt voor bewegende moving gebieden.
+TP_RAW_PIXELSHIFTDMETHOD;Demozaïek voor beweging
+TP_RAW_PIXELSHIFTEPERISO;Gevoeligheid
+TP_RAW_PIXELSHIFTEPERISO_TOOLTIP;De standaardwaarde 0 werkt goed voor lage ISO-waarden.\nHogere waarden vergroten de gevoeligheid van bewegingsdetectie.\nWijzig in kleine stappen en controleer het bewegingsmasker.\nVerhoog gevoeligheid voor onderbelichte foto's of foto's met hoge ISO-waarden.
+TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL;Balanceer per kanaal
+TP_RAW_PIXELSHIFTEQUALBRIGHTCHANNEL_TOOLTIP;Ingeschakeld: Balanceer elk RGB kanaal afzonderlijk.\nUitgeschakeld: Balanceer alle kanalen evenveel.
+TP_RAW_PIXELSHIFTSHOWMOTION_TOOLTIP;Toont de foto met een groen masker dat de bewegingsgebieden toont.
+TP_RAW_RCD;RCD
+TP_RAW_RCDVNG4;RCD+VNG4
+TP_RAW_XTRANS;X-Trans
+TP_RAW_XTRANSFAST;Snelle X-Trans
+TP_RESIZE_ALLOW_UPSCALING;Sta opschalen toe
+TP_RETINEX_CONTEDIT_MAP;Equalizer
+TP_RETINEX_GAINOFFS;Versterking en Offset (helderheid)
+TP_RETINEX_GAINTRANSMISSION;Transmissie versterking
+TP_RETINEX_GAINTRANSMISSION_TOOLTIP;Versterk of verzwak de transmssiemap om de gewenste luminantie te bekomen.\nThe x-as is the transmissie.\nThe y-as is the versterking.
+TP_RETINEX_MAP;Methode
+TP_SHARPENING_BLUR;Vervagen straal
+TP_SHARPENING_CONTRAST;Contrast drempel
+TP_SHARPENING_ITERCHECK;Automatische limiet herhalingen
+TP_SHARPENING_RADIUS_BOOST;Straalvergroting
+TP_SHARPENMICRO_CONTRAST;Contrast drempel
+TP_SOFTLIGHT_LABEL;Zacht licht
+TP_SOFTLIGHT_STRENGTH;Sterkte
+TP_TM_FATTAL_AMOUNT;Hoeveelheid
+TP_TM_FATTAL_ANCHOR;Anker
+TP_TM_FATTAL_LABEL;Dynamisch bereik compressie
+TP_TM_FATTAL_THRESHOLD;Detail
+TP_WAVELET_CB_TOOLTIP;Voor hoge waarden: kleurcorrectie door al of niet te combineren met niveau decompositie 'toning'\nVoor lage waarden de witbalans van de achtergrond (hemel, ...) wijzigen zonder die van de voorgrond, meestal meer contrastrijk
+TP_WBALANCE_PICKER;Kies
diff --git a/rtdata/languages/default b/rtdata/languages/default
index 6589c3a43..f89c13cb5 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -22,7 +22,7 @@ CURVEEDITOR_EDITPOINT_HINT;Enable edition of node in/out values.\n\nRight-click
CURVEEDITOR_HIGHLIGHTS;Highlights
CURVEEDITOR_LIGHTS;Lights
CURVEEDITOR_LINEAR;Linear
-CURVEEDITOR_LOADDLGLABEL;Load curve...
+CURVEEDITOR_LOADDLGLABEL;Load curve
CURVEEDITOR_MINMAXCPOINTS;Equalizer
CURVEEDITOR_NURBS;Control cage
CURVEEDITOR_PARAMETRIC;Parametric
@@ -567,10 +567,10 @@ HISTORY_MSG_314;W - Gamut - Reduce artifacts
HISTORY_MSG_315;W - Residual - Contrast
HISTORY_MSG_316;W - Gamut - Skin tar/prot
HISTORY_MSG_317;W - Gamut - Skin hue
-HISTORY_MSG_318;W - Contrast - Highlight levels
-HISTORY_MSG_319;W - Contrast - Highlight range
-HISTORY_MSG_320;W - Contrast - Shadow range
-HISTORY_MSG_321;W - Contrast - Shadow levels
+HISTORY_MSG_318;W - Contrast - Fine levels
+HISTORY_MSG_319;W - Contrast - Fine range
+HISTORY_MSG_320;W - Contrast - Coarse range
+HISTORY_MSG_321;W - Contrast - Coarse levels
HISTORY_MSG_322;W - Gamut - Avoid color shift
HISTORY_MSG_323;W - ES - Local contrast
HISTORY_MSG_324;W - Chroma - Pastel
@@ -694,21 +694,37 @@ HISTORY_MSG_441;Retinex - Gain transmission
HISTORY_MSG_442;Retinex - Scale
HISTORY_MSG_443;Output black point compensation
HISTORY_MSG_444;WB - Temp bias
-HISTORY_MSG_445;Raw sub-image
-HISTORY_MSG_449;PS - ISO adaption
-HISTORY_MSG_452;PS - Show motion
-HISTORY_MSG_453;PS - Show mask only
-HISTORY_MSG_457;PS - Check red/blue
-HISTORY_MSG_462;PS - Check green
-HISTORY_MSG_464;PS - Blur motion mask
-HISTORY_MSG_465;PS - Blur radius
-HISTORY_MSG_468;PS - Fill holes
-HISTORY_MSG_469;PS - Median
-HISTORY_MSG_471;PS - Motion correction
-HISTORY_MSG_472;PS - Smooth transitions
-HISTORY_MSG_473;PS - Use LMMSE
-HISTORY_MSG_474;PS - Equalize
-HISTORY_MSG_475;PS - Equalize channel
+HISTORY_MSG_445;Raw Sub-Image
+HISTORY_MSG_446;EvPixelShiftMotion
+HISTORY_MSG_447;EvPixelShiftMotionCorrection
+HISTORY_MSG_448;EvPixelShiftStddevFactorGreen
+HISTORY_MSG_449;PS ISO adaption
+HISTORY_MSG_450;EvPixelShiftNreadIso
+HISTORY_MSG_451;EvPixelShiftPrnu
+HISTORY_MSG_452;PS Show motion
+HISTORY_MSG_453;PS Show mask only
+HISTORY_MSG_454;EvPixelShiftAutomatic
+HISTORY_MSG_455;EvPixelShiftNonGreenHorizontal
+HISTORY_MSG_456;EvPixelShiftNonGreenVertical
+HISTORY_MSG_457;PS Check red/blue
+HISTORY_MSG_458;EvPixelShiftStddevFactorRed
+HISTORY_MSG_459;EvPixelShiftStddevFactorBlue
+HISTORY_MSG_460;EvPixelShiftGreenAmaze
+HISTORY_MSG_461;EvPixelShiftNonGreenAmaze
+HISTORY_MSG_462;PS Check green
+HISTORY_MSG_463;EvPixelShiftRedBlueWeight
+HISTORY_MSG_464;PS Blur motion mask
+HISTORY_MSG_465;PS Blur radius
+HISTORY_MSG_466;EvPixelShiftSum
+HISTORY_MSG_467;EvPixelShiftExp0
+HISTORY_MSG_468;PS Fill holes
+HISTORY_MSG_469;PS Median
+HISTORY_MSG_470;EvPixelShiftMedian3
+HISTORY_MSG_471;PS Motion correction
+HISTORY_MSG_472;PS Smooth transitions
+HISTORY_MSG_473;PS Use lmmse
+HISTORY_MSG_474;PS Equalize
+HISTORY_MSG_475;PS Equalize channel
HISTORY_MSG_476;CAM02 - Temp out
HISTORY_MSG_477;CAM02 - Green out
HISTORY_MSG_478;CAM02 - Yb out
@@ -726,8 +742,429 @@ HISTORY_MSG_489;DRC - Detail
HISTORY_MSG_490;DRC - Amount
HISTORY_MSG_491;White Balance
HISTORY_MSG_492;RGB Curves
-HISTORY_MSG_493;L*a*b* Adjustments
+HISTORY_MSG_493;Local Adjustments
HISTORY_MSG_494;Capture Sharpening
+HISTORY_MSG_496;Local Spot deleted
+HISTORY_MSG_497;Local Spot selected
+HISTORY_MSG_498;Local Spot name
+HISTORY_MSG_499;Local Spot visibility
+HISTORY_MSG_500;Local Spot shape
+HISTORY_MSG_501;Local Spot method
+HISTORY_MSG_502;Local Spot shape method
+HISTORY_MSG_503;Local Spot locX
+HISTORY_MSG_504;Local Spot locXL
+HISTORY_MSG_505;Local Spot locY
+HISTORY_MSG_506;Local Spot locYT
+HISTORY_MSG_507;Local Spot center
+HISTORY_MSG_508;Local Spot circrad
+HISTORY_MSG_509;Local Spot quality method
+HISTORY_MSG_510;Local Spot transition
+HISTORY_MSG_511;Local Spot thresh
+HISTORY_MSG_512;Local Spot ΔE -weakening
+HISTORY_MSG_513;Local Spot scope
+HISTORY_MSG_514;Local Spot structure
+HISTORY_MSG_515;Local Adjustments
+HISTORY_MSG_516;Local - Color and light
+HISTORY_MSG_517;Local - Enable super
+HISTORY_MSG_518;Local - Lightness
+HISTORY_MSG_519;Local - Contrast
+HISTORY_MSG_520;Local - Chrominance
+HISTORY_MSG_521;Local - Scope
+HISTORY_MSG_522;Local - curve method
+HISTORY_MSG_523;Local - LL Curve
+HISTORY_MSG_524;Local - CC curve
+HISTORY_MSG_525;Local - LH Curve
+HISTORY_MSG_526;Local - H curve
+HISTORY_MSG_527;Local - Color Inverse
+HISTORY_MSG_528;Local - Exposure
+HISTORY_MSG_529;Local - Exp Compensation
+HISTORY_MSG_530;Local - Exp Hlcompr
+HISTORY_MSG_531;Local - Exp hlcomprthresh
+HISTORY_MSG_532;Local - Exp black
+HISTORY_MSG_533;Local - Exp Shcompr
+HISTORY_MSG_534;Local - Warm Cool
+HISTORY_MSG_535;Local - Exp Scope
+HISTORY_MSG_536;Local - Exp Contrast curve
+HISTORY_MSG_537;Local - Vibrance
+HISTORY_MSG_538;Local - Vib Saturated
+HISTORY_MSG_539;Local - Vib Pastel
+HISTORY_MSG_540;Local - Vib Threshold
+HISTORY_MSG_541;Local - Vib Protect skin tones
+HISTORY_MSG_542;Local - Vib avoid colorshift
+HISTORY_MSG_543;Local - Vib link
+HISTORY_MSG_544;Local - Vib Scope
+HISTORY_MSG_545;Local - Vib H curve
+HISTORY_MSG_546;Local - Blur and noise
+HISTORY_MSG_547;Local - Radius
+HISTORY_MSG_548;Local - Noise
+HISTORY_MSG_549;Local - Blur scope
+HISTORY_MSG_550;Local - Blur method
+HISTORY_MSG_551;Local - Blur Luminance only
+HISTORY_MSG_552;Local - Tone mapping
+HISTORY_MSG_553;Local - TM compression strength
+HISTORY_MSG_554;Local - TM gamma
+HISTORY_MSG_555;Local - TM edge stopping
+HISTORY_MSG_556;Local - TM scale
+HISTORY_MSG_557;Local - TM Reweighting
+HISTORY_MSG_558;Local - TM scope
+HISTORY_MSG_559;Local - Retinex
+HISTORY_MSG_560;Local - Retinex method
+HISTORY_MSG_561;Local - Retinex strength
+HISTORY_MSG_562;Local - Retinex chroma
+HISTORY_MSG_563;Local - Retinex radius
+HISTORY_MSG_564;Local - Retinex contrast
+HISTORY_MSG_565;Local - scope
+HISTORY_MSG_566;Local - Retinex Gain curve
+HISTORY_MSG_567;Local - Retinex Inverse
+HISTORY_MSG_568;Local - Sharpening
+HISTORY_MSG_569;Local - Sh Radius
+HISTORY_MSG_570;Local - Sh Amount
+HISTORY_MSG_571;Local - Sh Damping
+HISTORY_MSG_572;Local - Sh Iterations
+HISTORY_MSG_573;Local - Sh Scope
+HISTORY_MSG_574;Local - Sh Inverse
+HISTORY_MSG_575;Local - CBDL
+HISTORY_MSG_576;Local - cbdl mult
+HISTORY_MSG_577;Local - cbdl chroma
+HISTORY_MSG_578;Local - cbdl threshold
+HISTORY_MSG_579;Local - cbdl scope
+HISTORY_MSG_580;Local - Denoise
+HISTORY_MSG_581;Local - deNoise lum f 1
+HISTORY_MSG_582;Local - deNoise lum c
+HISTORY_MSG_583;Local - deNoise lum detail
+HISTORY_MSG_584;Local - deNoise Equalizer white-black
+HISTORY_MSG_585;Local - deNoise chro f
+HISTORY_MSG_586;Local - deNoise chro c
+HISTORY_MSG_587;Local - deNoise chro detail
+HISTORY_MSG_588;Local - deNoise Equalizer blue-red
+HISTORY_MSG_589;Local - deNoise bilateral
+HISTORY_MSG_590;Local - deNoise Scope
+HISTORY_MSG_591;Local - Avoid color shift
+HISTORY_MSG_592;Local - Sh Contrast
+HISTORY_MSG_593;Local - Local contrast
+HISTORY_MSG_594;Local - Local contrast radius
+HISTORY_MSG_595;Local - Local contrast amount
+HISTORY_MSG_596;Local - Local contrast darkness
+HISTORY_MSG_597;Local - Local contrast lightness
+HISTORY_MSG_598;Local - Local contrast scope
+HISTORY_MSG_599;Local - Retinex dehaze
+HISTORY_MSG_600;Local - Soft Light enable
+HISTORY_MSG_601;Local - Soft Light strength
+HISTORY_MSG_602;Local - Soft Light scope
+HISTORY_MSG_603;Local - Sh Blur radius
+HISTORY_MSG_605;Local - Mask preview choice
+HISTORY_MSG_606;Local Spot selected
+HISTORY_MSG_607;Local - Color Mask C
+HISTORY_MSG_608;Local - Color Mask L
+HISTORY_MSG_609;Local - Exp Mask C
+HISTORY_MSG_610;Local - Exp Mask L
+HISTORY_MSG_611;Local - Color Mask H
+HISTORY_MSG_612;Local - Color Structure
+HISTORY_MSG_613;Local - Exp Structure
+HISTORY_MSG_614;Local - Exp Mask H
+HISTORY_MSG_615;Local - Blend color
+HISTORY_MSG_616;Local - Blend Exp
+HISTORY_MSG_617;Local - Blur Exp
+HISTORY_MSG_618;Local - Use Color Mask
+HISTORY_MSG_619;Local - Use Exp Mask
+HISTORY_MSG_620;Local - Blur col
+HISTORY_MSG_621;Local - Exp inverse
+HISTORY_MSG_622;Local - Exclude structure
+HISTORY_MSG_623;Local - Exp Chroma compensation
+HISTORY_MSG_624;Local - Color correction grid
+HISTORY_MSG_625;Local - Color correction strength
+HISTORY_MSG_626;Local - Color correction Method
+HISTORY_MSG_627;Local - Shadow Highlight
+HISTORY_MSG_628;Local - SH Highlight
+HISTORY_MSG_629;Local - SH H tonalwidth
+HISTORY_MSG_630;Local - SH Shadows
+HISTORY_MSG_631;Local - SH S tonalwidth
+HISTORY_MSG_632;Local - SH radius
+HISTORY_MSG_633;Local - SH Scope
+HISTORY_MSG_634;Local - radius color
+HISTORY_MSG_635;Local - radius Exp
+HISTORY_MSG_636;Local - Tool added
+HISTORY_MSG_637;Local - SH Mask C
+HISTORY_MSG_638;Local - SH Mask L
+HISTORY_MSG_639;Local - SH Mask H
+HISTORY_MSG_640;Local - SH blend
+HISTORY_MSG_641;Local - Use SH mask
+HISTORY_MSG_642;Local - radius SH
+HISTORY_MSG_643;Local - Blur SH
+HISTORY_MSG_644;Local - inverse SH
+HISTORY_MSG_645;Local - balance ΔE ab-L
+HISTORY_MSG_646;Local - Exp mask chroma
+HISTORY_MSG_647;Local - Exp mask gamma
+HISTORY_MSG_648;Local - Exp mask slope
+HISTORY_MSG_649;Local - Exp soft radius
+HISTORY_MSG_650;Local - Color mask chroma
+HISTORY_MSG_651;Local - Color mask gamma
+HISTORY_MSG_652;Local - Color mask slope
+HISTORY_MSG_653;Local - SH mask chroma
+HISTORY_MSG_654;Local - SH mask gamma
+HISTORY_MSG_655;Local - SH mask slope
+HISTORY_MSG_656;Local - Color soft radius
+HISTORY_MSG_657;Local - Retinex Reduce artifacts
+HISTORY_MSG_658;Local - CBDL soft radius
+HISTORY_MSG_659;Local Spot transition-weakening
+HISTORY_MSG_660;Local - cbdl clarity
+HISTORY_MSG_661;Local - cbdl contrast residual
+HISTORY_MSG_662;Local - deNoise lum f 0
+HISTORY_MSG_663;Local - deNoise lum f 2
+HISTORY_MSG_664;Local - cbdl Blur
+HISTORY_MSG_665;Local - cbdl mask Blend
+HISTORY_MSG_666;Local - cbdl mask radius
+HISTORY_MSG_667;Local - cbdl mask chroma
+HISTORY_MSG_668;Local - cbdl mask gamma
+HISTORY_MSG_669;Local - cbdl mask slope
+HISTORY_MSG_670;Local - cbdl mask C
+HISTORY_MSG_671;Local - cbdl mask L
+HISTORY_MSG_672;Local - cbdl mask CL
+HISTORY_MSG_673;Local - Use cbdl mask
+HISTORY_MSG_674;Local - Tool removed
+HISTORY_MSG_675;Local - TM soft radius
+HISTORY_MSG_676;Local Spot transition-differentiation
+HISTORY_MSG_677;Local - TM amount
+HISTORY_MSG_678;Local - TM saturation
+HISTORY_MSG_679;Local - Retinex mask C
+HISTORY_MSG_680;Local - Retinex mask L
+HISTORY_MSG_681;Local - Retinex mask CL
+HISTORY_MSG_682;Local - Retinex mask
+HISTORY_MSG_683;Local - Retinex mask Blend
+HISTORY_MSG_684;Local - Retinex mask radius
+HISTORY_MSG_685;Local - Retinex mask chroma
+HISTORY_MSG_686;Local - Retinex mask gamma
+HISTORY_MSG_687;Local - Retinex mask slope
+HISTORY_MSG_688;Local - Tool removed
+HISTORY_MSG_689;Local - Retinex mask transmission map
+HISTORY_MSG_690;Local - Retinex scale
+HISTORY_MSG_691;Local - Retinex darkness
+HISTORY_MSG_692;Local - Retinex lightness
+HISTORY_MSG_693;Local - Retinex threshold
+HISTORY_MSG_694;Local - Retinex Laplacian threshold
+HISTORY_MSG_695;Local - Soft method
+HISTORY_MSG_696;Local - Retinex Normalize
+HISTORY_MSG_697;Local - TM Normalize
+HISTORY_MSG_698;Local - Local contrast Fast Fourier
+HISTORY_MSG_699;Local - Retinex Fast Fourier
+HISTORY_MSG_701;Local - Exp Shadows
+HISTORY_MSG_702;Local - Exp Method
+HISTORY_MSG_703;Local - Exp Laplacian threshold
+HISTORY_MSG_704;Local - Exp PDE balance
+HISTORY_MSG_705;Local - Exp linearity
+HISTORY_MSG_706;Local - TM mask C
+HISTORY_MSG_707;Local - TM mask L
+HISTORY_MSG_708;Local - TM mask CL
+HISTORY_MSG_709;Local - use TM mask
+HISTORY_MSG_710;Local - TM mask Blend
+HISTORY_MSG_711;Local - TM mask radius
+HISTORY_MSG_712;Local - TM mask chroma
+HISTORY_MSG_713;Local - TM mask gamma
+HISTORY_MSG_714;Local - TM mask slope
+HISTORY_MSG_716;Local - Local method
+HISTORY_MSG_717;Local - Local contrast
+HISTORY_MSG_718;Local - Local contrast levels
+HISTORY_MSG_719;Local - Local contrast residual L
+HISTORY_MSG_720;Local - Blur mask C
+HISTORY_MSG_721;Local - Blur mask L
+HISTORY_MSG_722;Local - Blur mask CL
+HISTORY_MSG_723;Local - use Blur mask
+HISTORY_MSG_725;Local - Blur mask Blend
+HISTORY_MSG_726;Local - Blur mask radius
+HISTORY_MSG_727;Local - Blur mask chroma
+HISTORY_MSG_728;Local - Blur mask gamma
+HISTORY_MSG_729;Local - Blur mask slope
+HISTORY_MSG_730;Local - Blur method
+HISTORY_MSG_731;Local - median method
+HISTORY_MSG_732;Local - median iterations
+HISTORY_MSG_733;Local - soft radius
+HISTORY_MSG_734;Local - detail
+HISTORY_MSG_738;Local - Local contrast Merge L
+HISTORY_MSG_739;Local - Local contrast Soft radius
+HISTORY_MSG_740;Local - Local contrast Merge C
+HISTORY_MSG_741;Local - Local contrast Residual C
+HISTORY_MSG_742;Local - Exp Laplacian gamma
+HISTORY_MSG_743;Local - Exp Fattal Amount
+HISTORY_MSG_744;Local - Exp Fattal Detail
+HISTORY_MSG_745;Local - Exp Fattal Offset
+HISTORY_MSG_746;Local - Exp Fattal Sigma
+HISTORY_MSG_747;Local Spot created
+HISTORY_MSG_748;Local - Exp Denoise
+HISTORY_MSG_749;Local - Reti Depth
+HISTORY_MSG_750;Local - Reti Mode log - lin
+HISTORY_MSG_751;Local - Reti Dehaze luminance
+HISTORY_MSG_752;Local - Reti Offset
+HISTORY_MSG_753;Local - Reti Transmission map
+HISTORY_MSG_754;Local - Reti Clip
+HISTORY_MSG_755;Local - TM use tm mask
+HISTORY_MSG_756;Local - Exp use algo exposure mask
+HISTORY_MSG_757;Local - Exp Laplacian mask
+HISTORY_MSG_758;Local - Reti Laplacian mask
+HISTORY_MSG_759;Local - Exp Laplacian mask
+HISTORY_MSG_760;Local - Color Laplacian mask
+HISTORY_MSG_761;Local - SH Laplacian mask
+HISTORY_MSG_762;Local - cbdl Laplacian mask
+HISTORY_MSG_763;Local - Blur Laplacian mask
+HISTORY_MSG_764;Local - Solve PDE Laplacian mask
+HISTORY_MSG_765;Local - deNoise Detail threshold
+HISTORY_MSG_766;Local - Blur Fast Fourier
+HISTORY_MSG_767;Local - Grain Iso
+HISTORY_MSG_768;Local - Grain Strength
+HISTORY_MSG_769;Local - Grain Scale
+HISTORY_MSG_770;Local - Color Mask contrast curve
+HISTORY_MSG_771;Local - Exp Mask contrast curve
+HISTORY_MSG_772;Local - SH Mask contrast curve
+HISTORY_MSG_773;Local - TM Mask contrast curve
+HISTORY_MSG_774;Local - Reti Mask contrast curve
+HISTORY_MSG_775;Local - CBDL Mask contrast curve
+HISTORY_MSG_776;Local - Blur Denoise Mask contrast curve
+HISTORY_MSG_777;Local - Blur Mask local contrast curve
+HISTORY_MSG_778;Local - Mask highlights
+HISTORY_MSG_779;Local - Color Mask local contrast curve
+HISTORY_MSG_780;Local - Color Mask shadows
+HISTORY_MSG_781;Local - Contrast Mask Wavelet level
+HISTORY_MSG_782;Local - Blur Denoise Mask Wavelet levels
+HISTORY_MSG_783;Local - Color Wavelet levels
+HISTORY_MSG_784;Local - Mask ΔE
+HISTORY_MSG_785;Local - Mask Scope ΔE
+HISTORY_MSG_786;Local - SH method
+HISTORY_MSG_787;Local - Equalizer multiplier
+HISTORY_MSG_788;Local - Equalizer detail
+HISTORY_MSG_789;Local - SH mask amount
+HISTORY_MSG_790;Local - SH mask anchor
+HISTORY_MSG_791;Local - Mask Short L curves
+HISTORY_MSG_792;Local - Mask Luminance Background
+HISTORY_MSG_793;Local - SH TRC gamma
+HISTORY_MSG_794;Local - SH TRC slope
+HISTORY_MSG_795;Local - Mask save restore image
+HISTORY_MSG_796;Local - Recursive references
+HISTORY_MSG_797;Local - Merge Original method
+HISTORY_MSG_798;Local - Opacity
+HISTORY_MSG_799;Local - Color RGB ToneCurve
+HISTORY_MSG_800;Local - Color ToneCurve Method
+HISTORY_MSG_801;Local - Color ToneCurve Special
+HISTORY_MSG_802;Local - Contrast threshold
+HISTORY_MSG_803;Local - Color Merge
+HISTORY_MSG_804;Local - Color mask Structure
+HISTORY_MSG_805;Local - Blur Noise mask Structure
+HISTORY_MSG_806;Local - Color mask Structure as tool
+HISTORY_MSG_807;Local - Blur Noise mask Structure as tool
+HISTORY_MSG_808;Local - Color mask curve H(H)
+HISTORY_MSG_809;Local - Vib mask curve C(C)
+HISTORY_MSG_810;Local - Vib mask curve L(L)
+HISTORY_MSG_811;Local - Vib mask curve LC(H)
+HISTORY_MSG_813;Local - Use Vib mask
+HISTORY_MSG_814;Local - Vib mask Blend
+HISTORY_MSG_815;Local - Vib mask radius
+HISTORY_MSG_816;Local - Vib mask chroma
+HISTORY_MSG_817;Local - Vib mask gamma
+HISTORY_MSG_818;Local - Vib mask slope
+HISTORY_MSG_819;Local - Vib mask laplacian
+HISTORY_MSG_820;Local - Vib mask contrast curve
+HISTORY_MSG_821;Local - color grid background
+HISTORY_MSG_822;Local - color background merge
+HISTORY_MSG_823;Local - color background luminance
+HISTORY_MSG_824;Local - Exp gradient mask strength
+HISTORY_MSG_825;Local - Exp gradient mask angle
+HISTORY_MSG_826;Local - Exp gradient strength
+HISTORY_MSG_827;Local - Exp gradient angle
+HISTORY_MSG_828;Local - SH gradient strength
+HISTORY_MSG_829;Local - SH gradient angle
+HISTORY_MSG_830;Local - Color gradient strength L
+HISTORY_MSG_831;Local - Color gradient angle
+HISTORY_MSG_832;Local - Color gradient strength C
+HISTORY_MSG_833;Local - Gradient feather
+HISTORY_MSG_834;Local - Color gradient strength H
+HISTORY_MSG_835;Local - Vib gradient strength L
+HISTORY_MSG_836;Local - Vib gradient angle
+HISTORY_MSG_837;Local - Vib gradient strength C
+HISTORY_MSG_838;Local - Vib gradient strength H
+HISTORY_MSG_839;Local - Software complexity
+HISTORY_MSG_840;Local - CL Curve
+HISTORY_MSG_841;Local - LC curve
+HISTORY_MSG_842;Local - Contrast Threshold Mask blur
+HISTORY_MSG_843;Local - Radius Mask blur
+HISTORY_MSG_844;Local - Color Mask fftw
+HISTORY_MSG_845;Local - Encoding log
+HISTORY_MSG_846;Local - Encoding auto
+HISTORY_MSG_847;Local - Source Gray
+HISTORY_MSG_848;Local - Source Gray auto
+HISTORY_MSG_849;Local - Auto Grayon
+HISTORY_MSG_850;Local - Black Ev
+HISTORY_MSG_851;Local - White Ev
+HISTORY_MSG_852;Local - Target Gray
+HISTORY_MSG_853;Local - Local contrast
+HISTORY_MSG_854;Local - Scope encoding log
+HISTORY_MSG_855;Local - Entire image
+HISTORY_MSG_856;Local - Base log
+HISTORY_MSG_857;Local - Contrast Blur Residual
+HISTORY_MSG_858;Local - Contrast Luminance only
+HISTORY_MSG_859;Local - Contrast Maximum Blur levels
+HISTORY_MSG_860;Local - Contrast Curve Blur levels
+HISTORY_MSG_861;Local - Contrast Curve Contrast levels
+HISTORY_MSG_862;Local - Contrast Sigma luminance
+HISTORY_MSG_863;Local - Contrast Merge Original
+HISTORY_MSG_864;Local - Directional sigma
+HISTORY_MSG_865;Local - Directional delta
+HISTORY_MSG_866;Local - Contrast Curve Compression
+HISTORY_MSG_867;Local - Contrast Amount residual
+HISTORY_MSG_868;Local - balance ΔE C-H
+HISTORY_MSG_869;Local - denoise curve luminance
+HISTORY_MSG_870;Local - LC mask curve LC(H)
+HISTORY_MSG_871;Local - LC mask curve C(C)
+HISTORY_MSG_872;Local - LC mask curve L(L)
+HISTORY_MSG_873;Local - LC mask enable
+HISTORY_MSG_875;Local - LC mask blend
+HISTORY_MSG_876;Local - LC mask radius
+HISTORY_MSG_877;Local - LC mask chroma
+HISTORY_MSG_878;Local - LC mask curve contrast
+HISTORY_MSG_879;Local - LC Chroma levels
+HISTORY_MSG_880;Local - LC Chroma blur levels
+HISTORY_MSG_881;Local - Contrast Offset Luminance
+HISTORY_MSG_882;Local - Contrast Blur
+HISTORY_MSG_883;Local - Contrast By Levels
+HISTORY_MSG_884;Local - Contrast Dynamic Range Laplacian
+HISTORY_MSG_885;Local - Contrast Dynamic Range Wavelet
+HISTORY_MSG_886;Local - Contrast Wavelet Curve Compression
+HISTORY_MSG_887;Local - Contrast Wavelet Compression Residual
+HISTORY_MSG_888;Local - Contrast Wavelet Balance Threshold
+HISTORY_MSG_889;Local - Contrast Wavelet Graduated Strength
+HISTORY_MSG_890;Local - Contrast Wavelet Graduated angle
+HISTORY_MSG_891;Local - Contrast Wavelet Graduated
+HISTORY_MSG_892;Local - Encoding log Graduated Strength
+HISTORY_MSG_893;Local - Encoding log Graduated angle
+HISTORY_MSG_894;Local - Color Preview dE
+HISTORY_MSG_897;Local - Contrast Wavelet ES strength
+HISTORY_MSG_898;Local - Contrast Wavelet ES radius
+HISTORY_MSG_899;Local - Contrast Wavelet ES detail
+HISTORY_MSG_900;Local - Contrast Wavelet ES gradient
+HISTORY_MSG_901;Local - Contrast Wavelet ES threshold low
+HISTORY_MSG_902;Local - Contrast Wavelet ES threshold high
+HISTORY_MSG_903;Local - Contrast Wavelet ES local contrast
+HISTORY_MSG_904;Local - Contrast Wavelet ES first level
+HISTORY_MSG_905;Local - Contrast Wavelet Edge Sharpness
+HISTORY_MSG_906;Local - Contrast Wavelet ES sensitivity
+HISTORY_MSG_907;Local - Contrast Wavelet ES amplification
+HISTORY_MSG_908;Local - Contrast Wavelet ES neighboring
+HISTORY_MSG_909;Local - Contrast Wavelet ES show
+HISTORY_MSG_910;Local - Wavelet Edge performance
+HISTORY_MSG_911;Local - Blur Chroma Luma
+HISTORY_MSG_912;Local - Blur Guide filter strength
+HISTORY_MSG_913;Local - Contrast Wavelet Sigma DR
+HISTORY_MSG_914;Local - Blur Wavelet Sigma BL
+HISTORY_MSG_915;Local - Edge Wavelet Sigma ED
+HISTORY_MSG_916;Local - Residual wavelet shadows
+HISTORY_MSG_917;Local - Residual wavelet shadows threshold
+HISTORY_MSG_918;Local - Residual wavelet highlights
+HISTORY_MSG_919;Local - Residual wavelet highlights threshold
+HISTORY_MSG_920;Local - Wavelet sigma LC
+HISTORY_MSG_921;Local - Wavelet Graduated sigma LC2
+HISTORY_MSG_922;Local - changes In Black and White
+HISTORY_MSG_923;Local - Tool complexity mode
+HISTORY_MSG_924;Local - Tool complexity mode
+HISTORY_MSG_925;Local - Scope color tools
+HISTORY_MSG_926;Local - Show mask type
+HISTORY_MSG_927;Local - Shadow mask
HISTORY_MSG_CAT02PRESET;Cat02 automatic preset
HISTORY_MSG_CLAMPOOG;Clip out-of-gamut colors
HISTORY_MSG_COLORTONING_LABGRID_VALUE;CT - Color correction
@@ -786,6 +1223,7 @@ HISTORY_MSG_PERSP_PROJ_SHIFT;Perspective - PCA
HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion
HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction
HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
+HISTORY_MSG_PREPROCWB_MODE;Preprocess WB Mode
HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold
HISTORY_MSG_RAWCACORR_AUTOIT;Raw CA Correction - Iterations
HISTORY_MSG_RAWCACORR_COLORSHIFT;Raw CA Correction - Avoid color shift
@@ -810,12 +1248,12 @@ HISTORY_MSG_WAVMERGEL;Merge L
HISTORY_MSG_WAVRADIUS;Radius Shadows-Highlight
HISTORY_MSG_WAVSCALE;Scale
HISTORY_MSG_WAVSHOWMASK;Show wavelet mask
-HISTORY_MSG_WAVSIGMA;Damper
+HISTORY_MSG_WAVSIGMA;Attenuation Response
HISTORY_MSG_WAVSOFTRAD;Soft radius clarity
HISTORY_MSG_WAVSOFTRADEND;Soft radius final
HISTORY_MSG_WAVUSHAMET;Clarity method
HISTORY_MSG_THRESWAV;Balance threshold
-HISTORY_MSG_BLUWAV;Damper
+HISTORY_MSG_BLUWAV;Attenuation Response
HISTORY_MSG_WAVOLDSH;Old algorithm
HISTORY_MSG_WAVOFFSET;Offset
HISTORY_MSG_WAVLOWTHR;Threshold low contrast
@@ -823,7 +1261,13 @@ HISTORY_MSG_BLSHAPE;Blur by level
HISTORY_MSG_WAVBL;Blur levels
HISTORY_MSG_BLURWAV;Blur luminance
HISTORY_MSG_BLURCWAV;Blur chroma
-HISTORY_MSG_EDGEFFECT;Edge Damper
+HISTORY_MSG_EDGEFFECT;Edge Attenuation Response
+HISTORY_MSG_SIGMAFIN;Final contrast Attenuation Response
+HISTORY_MSG_SIGMATON;Toning Attenuation Response
+HISTORY_MSG_SIGMACOL;Chroma Attenuation Response
+HISTORY_MSG_SIGMADIR;Dir Attenuation Response
+HISTORY_MSG_RANGEAB;Range ab
+HISTORY_MSG_PROTAB;Protection
HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
HISTORY_SNAPSHOT;Snapshot
@@ -963,6 +1407,8 @@ MAIN_TAB_FAVORITES_TOOLTIP;Shortcut: Alt-u
MAIN_TAB_FILTER; Filter
MAIN_TAB_INSPECT; Inspect
MAIN_TAB_IPTC;IPTC
+MAIN_TAB_LOCALLAB;Local
+MAIN_TAB_LOCALLAB_TOOLTIP;Shortcut: Alt-o
MAIN_TAB_METADATA;Metadata
MAIN_TAB_METADATA_TOOLTIP;Shortcut: Alt-m
MAIN_TAB_RAW;Raw
@@ -1005,6 +1451,7 @@ NAVIGATOR_XY_NA;x: --, y: --
OPTIONS_BUNDLED_MISSING;The bundled profile "%1" could not be found!\n\nYour installation could be damaged.\n\nDefault internal values will be used instead.
OPTIONS_DEFIMG_MISSING;The default profile for non-raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead.
OPTIONS_DEFRAW_MISSING;The default profile for raw photos could not be found or is not set.\n\nPlease check your profiles' directory, it may be missing or damaged.\n\n"%1" will be used instead.
+PARTIALPASTE_LOCALLABGROUP;Local Adjustments Settings
PARTIALPASTE_ADVANCEDGROUP;Advanced Settings
PARTIALPASTE_BASICGROUP;Basic Settings
PARTIALPASTE_CACORRECTION;Chromatic aberration correction
@@ -1045,6 +1492,8 @@ PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction
PARTIALPASTE_IPTCINFO;IPTC
PARTIALPASTE_LABCURVE;L*a*b* adjustments
PARTIALPASTE_LENSGROUP;Lens Related Settings
+PARTIALPASTE_LOCALLAB;Local Adjustments
+PARTIALPASTE_LOCGROUP;Local
PARTIALPASTE_LENSPROFILE;Profiled lens correction
PARTIALPASTE_LOCALCONTRAST;Local contrast
PARTIALPASTE_METADATA;Metadata mode
@@ -1056,6 +1505,7 @@ PARTIALPASTE_PREPROCESS_GREENEQUIL;Green equilibration
PARTIALPASTE_PREPROCESS_HOTPIXFILT;Hot pixel filter
PARTIALPASTE_PREPROCESS_LINEDENOISE;Line noise filter
PARTIALPASTE_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
+PARTIALPASTE_PREPROCWB;Preprocess White Balance
PARTIALPASTE_PRSHARPENING;Post-resize sharpening
PARTIALPASTE_RAWCACORR_AUTO;CA auto-correction
PARTIALPASTE_RAWCACORR_AVOIDCOLORSHIFT;CA avoid color shift
@@ -1120,6 +1570,9 @@ PREFERENCES_CLUTSCACHE;HaldCLUT Cache
PREFERENCES_CLUTSCACHE_LABEL;Maximum number of cached CLUTs
PREFERENCES_CLUTSDIR;HaldCLUT directory
PREFERENCES_CMMBPC;Black point compensation
+PREFERENCES_COMPLEXITYLOC;Default complexity for Local Adjustments
+PREFERENCES_COMPLEXITY_EXP;Expert
+PREFERENCES_COMPLEXITY_NORM;Normal
PREFERENCES_CROP;Crop Editing
PREFERENCES_CROP_AUTO_FIT;Automatically zoom to fit the crop
PREFERENCES_CROP_GUIDES;Guides shown when not editing the crop
@@ -1234,8 +1687,9 @@ PREFERENCES_SERIALIZE_TIFF_READ_TOOLTIP;Enabling this option when working with f
PREFERENCES_SET;Set
PREFERENCES_SHOWBASICEXIF;Show basic Exif info
PREFERENCES_SHOWDATETIME;Show date and time
-PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation
PREFERENCES_SHOWFILMSTRIPTOOLBAR;Show Filmstrip toolbar
+PREFERENCES_SHOWEXPOSURECOMPENSATION;Append exposure compensation
+PREFERENCES_SHOWTOOLTIP;Show Local Adjustments advice tooltips
PREFERENCES_SHTHRESHOLD;Threshold for clipped shadows
PREFERENCES_SINGLETAB;Single Editor Tab Mode
PREFERENCES_SINGLETABVERTAB;Single Editor Tab Mode, Vertical Tabs
@@ -1502,7 +1956,7 @@ TP_COLORAPP_TCMODE_LIGHTNESS;Lightness
TP_COLORAPP_TCMODE_SATUR;Saturation
TP_COLORAPP_TEMP_TOOLTIP;To select an illuminant, always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504
TP_COLORAPP_TEMP2_TOOLTIP;Either symmetrical mode temp = White balance.\nEither select illuminant always set Tint=1.\n\nA temp=2856\nD41 temp=4100\nD50 temp=5003\nD55 temp=5503\nD60 temp=6000\nD65 temp=6504\nD75 temp=7504
-TP_COLORAPP_TEMPOUT_TOOLTIP;Disable to chnage temperature and tint
+TP_COLORAPP_TEMPOUT_TOOLTIP;Disable to change temperature and tint
TP_COLORAPP_TONECIE;Tone mapping using CIECAM02
TP_COLORAPP_TONECIE_TOOLTIP;If this option is disabled, tone mapping is done in L*a*b* space.\nIf this option is enabled, tone mapping is done using CIECAM02.\nThe Tone Mapping tool must be enabled for this setting to take effect.
TP_COLORAPP_VIEWING_ABSOLUTELUMINANCE_TOOLTIP;Absolute luminance of the viewing environment\n(usually 16 cd/m²).
@@ -1841,6 +2295,562 @@ TP_LENSPROFILE_USE_CA;Chromatic aberration
TP_LENSPROFILE_USE_GEOMETRIC;Geometric distortion
TP_LENSPROFILE_USE_HEADER;Correct
TP_LENSPROFILE_USE_VIGNETTING;Vignetting
+TP_LOCALLAB_ACTIV;Luminance only
+TP_LOCALLAB_ADJ;Equalizer Blue-yellow Red-green
+TP_LOCALLAB_ALL;All rubrics
+TP_LOCALLAB_AMOUNT;Amount
+TP_LOCALLAB_ARTIF;Shape detection
+TP_LOCALLAB_ARTIF_TOOLTIP;Threshold deltaE-scope increase the range of scope-deltaE - high values are for very wide gamut images.\nIncrease deltaE Weakening improve shape detection, but can reduce the scope of detection.
+TP_LOCALLAB_AUTOGRAY;Automatic
+TP_LOCALLAB_AVOID;Avoid color shift
+TP_LOCALLAB_BALAN;Balance ΔE ab-L
+TP_LOCALLAB_BALANH;Balance ΔE C-H
+TP_LOCALLAB_BALAN_TOOLTIP;Change algorithm ΔE parameter.\nMore or less ab-L, more or less C - H.\nNot for Denoise
+TP_LOCALLAB_BALANEXP;ΔØ PDE balance
+TP_LOCALLAB_BASELOG;Logarithm base
+TP_LOCALLAB_BILATERAL;Bilateral filter
+TP_LOCALLAB_BLACK_EV;Black Ev
+TP_LOCALLAB_BLENDMASKCOL;Blend
+TP_LOCALLAB_BLENDMASK_TOOLTIP;If blend = 0 only shape detection is improved.\nIf blend > 0 the mask is added to the image. If blend < 0 the mask is subtracted from the image
+TP_LOCALLAB_BLGUID;Guided Filter
+TP_LOCALLAB_BLINV;Inverse
+TP_LOCALLAB_BLCO;Chrominance only
+TP_LOCALLAB_BLLO;Luminance only
+TP_LOCALLAB_BLLC;Luminance & Chrominance
+TP_LOCALLAB_BLMED;Median
+TP_LOCALLAB_BLMETHOD_TOOLTIP;Normal - direct blur and noise with all settings.\nInverse blur and noise with all settings. Be careful some results may be curious
+TP_LOCALLAB_BLNORM;Normal
+TP_LOCALLAB_BLSYM;Symmetric
+TP_LOCALLAB_BLWH;All changes forced in Black and White
+TP_LOCALLAB_BLWH_TOOLTIP;Force color change composante "a" and "b" to zero.\nUsefull when the user chooses black and white processes, or film.
+TP_LOCALLAB_SPOTNAME;New Spot
+TP_LOCALLAB_BLUFR;Smooth - Blur - Grain - Denoise
+TP_LOCALLAB_BLUMETHOD_TOOLTIP;To blur the background and isolate the foreground:\n*Blur the background by a RT-spot fully covering the image (high values for scope and transition) - normal or inverse.\n*Isolate the foreground by one or more excluding RT-spot with the tools you want (increse scope).\n\nThis module can be used in additional noise reduction,including "median" and "Guided filter"
+TP_LOCALLAB_BLURMASK_TOOLTIP;Generate a blur mask, take into account the structure with the contrast threshold Mask Blur slider.
+TP_LOCALLAB_BLUR;Gaussian Blur - Noise - Grain
+TP_LOCALLAB_BLURCBDL;Blur levels 0-1-2-3-4
+TP_LOCALLAB_BLURCOL;Radius Mask Blur
+TP_LOCALLAB_BLURDE;Blur Shape detection
+TP_LOCALLAB_BLURLC;Luminance Only
+TP_LOCALLAB_BLURLEVELFRA;Blur Levels
+TP_LOCALLAB_BLURRESIDFRA;Blur Residual
+TP_LOCALLAB_BUTTON_ADD;Add
+TP_LOCALLAB_BUTTON_DEL;Delete
+TP_LOCALLAB_BUTTON_DUPL;Duplicate
+TP_LOCALLAB_BUTTON_REN;Rename
+TP_LOCALLAB_BUTTON_VIS;Show/Hide
+TP_LOCALLAB_CBDL;Contrast by detail levels - Defects
+TP_LOCALLAB_CBDL_ADJ_TOOLTIP;Acts as a wavelet tools.\nThe first level (0) acts on 2x2 details.\nThe last level (5) acts on 64x64 details.
+TP_LOCALLAB_CBDLCLARI_TOOLTIP;Takes the midtones and enhance them.
+TP_LOCALLAB_CBDL_THRES_TOOLTIP;Prevent the sharpening of noise
+TP_LOCALLAB_CENTER_X;Center X
+TP_LOCALLAB_CENTER_Y;Center Y
+TP_LOCALLAB_CH;Curves CL - LC
+TP_LOCALLAB_CHROMA;Chrominance
+TP_LOCALLAB_CHROMACBDL;Chroma
+TP_LOCALLAB_CHROMACB_TOOLTIP;Acts as an amplifier-reducer action compare to sliders of luminance.\nUnder 100 reduce, above 100 amplifie
+TP_LOCALLAB_CHROMALEV;Chroma levels
+TP_LOCALLAB_CHROMABLU;Chroma levels
+TP_LOCALLAB_CHROMABLU_TOOLTIP;Acts as an amplifier-reducer action compare to settings of luma.\nUnder 1 reduce, above 1 amplifie
+TP_LOCALLAB_CHROMASKCOL;Chroma mask
+TP_LOCALLAB_CHROMASK_TOOLTIP;You can use this slider to desaturated background (inverse mask - curve near 0).\nAlso to attenuate or enhance the action of a mask on the chroma
+TP_LOCALLAB_CHRRT;Chroma
+TP_LOCALLAB_CIRCRADIUS;Spot size
+TP_LOCALLAB_CIRCRAD_TOOLTIP;Contains the references of RT-spot, useful for shape detection (hue, luma, chroma, Sobel).\nLow values may be useful for treating foliage.\nHigh values may be useful for treating skin
+TP_LOCALLAB_CLARICRES;Merge Chroma
+TP_LOCALLAB_CLARIFRA;Clarity & Sharp mask - Blend & Soft images
+TP_LOCALLAB_CLARILRES;Merge Luma
+TP_LOCALLAB_CLARISOFT;Soft radius
+TP_LOCALLAB_CLARISOFT_TOOLTIP;Enabled for Clarity and Sharp mask if Merge Luma different from zero.\n\nEnabled for all wavelets pyramid modules.\nDisabled if Soft radius = 0
+TP_LOCALLAB_CLARITYML;Clarity
+TP_LOCALLAB_CLARI_TOOLTIP;Under or equal level wavelet 4, 'Sharp mask' is enabled.\nAbove level wavelet 5 'Clarity' is enabled.\nUsefull if you use 'Level dynamic Range Compression'
+TP_LOCALLAB_CLIPTM;Clip Restored datas (gain)
+TP_LOCALLAB_COFR;Color & Light - Small defects
+TP_LOCALLAB_COL_NAME;Name
+TP_LOCALLAB_COL_VIS;Status
+TP_LOCALLAB_COLORDE;Color preview selection ΔE - Intensity
+TP_LOCALLAB_COLORDE_TOOLTIP;Show preview selection ΔE in blue if negative and in green if positive.\n\nMask and modifications (show modifications without mask): show real modifications if positive, show enhanced modifications (only luminance) with blue and yellow if negative.
+TP_LOCALLAB_COLORDEPREV_TOOLTIP;Button Preview ΔE needs that only one tool is enabled (expander).\nTo be able to have an Preview ΔE with several enable tools use Mask and modifications - Preview ΔE
+TP_LOCALLAB_COLORSCOPE;Scope Color Tools
+TP_LOCALLAB_COLORSCOPE_TOOLTIP;Use a common Scope for Color and light, Exposure (Standard), Shadows highlight, Vibrance.\nOthers tools have their specific scope.
+TP_LOCALLAB_COMPFRA;Levels Directional Contrast
+TP_LOCALLAB_COMPREFRA;Levels Dynamic Wavelet Range (un)Compression
+TP_LOCALLAB_COMPRESS_TOOLTIP;Use if necessary the module 'Clarity & Sharp mask and Blend & Soft Images' by adjusting 'Soft radius' to reduce artifacts.
+TP_LOCALLAB_COMPFRAME_TOOLTIP;Allows special effects. You can reduce artifacts with 'Clarity & Sharp mask - Blend & Soft Images".\nUses a lot of resources
+TP_LOCALLAB_COMPLEX_METHOD;Software Complexity
+TP_LOCALLAB_COMPLEX_TOOLTIP; Allow user to select Local adjustments rubrics.
+TP_LOCALLAB_CONTCOL;Contrast threshold Mask Blur
+TP_LOCALLAB_CONTFRA;Contrast by Level
+TP_LOCALLAB_CONTRAST;Contrast
+TP_LOCALLAB_CONTRASTCURVMASK_TOOLTIP;Main mask contrast control.
+TP_LOCALLAB_CONTRESID;Contrast
+TP_LOCALLAB_CONTTHR;Contrast Threshold
+TP_LOCALLAB_CSTHRESHOLD;Ψ Wavelets Levels
+TP_LOCALLAB_CSTHRESHOLDBLUR;Ψ Mask Wavelet level
+TP_LOCALLAB_CURV;Lightness - Contrast - Chrominance "Super"
+TP_LOCALLAB_CURVCURR;Normal
+TP_LOCALLAB_CURVEEDITOR_CC_TOOLTIP;If curves at the top, mask is completely black no transformation is made by the mask on the image.\nAs you go down the curve, the mask gradually more colorful and brilliant, the image is changing more and more.\n\nIt is recommended (not required) to position the top of the curves on the gray transition line which represents the references (chroma, luma, hue).
+TP_LOCALLAB_CURVEEDITOR_LL_TOOLTIP;To be active, you must enable combobox 'Curves type'
+TP_LOCALLAB_CURVEEDITOR_TONES_LABEL;Tone curve
+TP_LOCALLAB_CURVEEDITOR_TONES_TOOLTIP;L=f(L), can be used with L(H) in Color and Light
+TP_LOCALLAB_CURVEMETHOD_TOOLTIP;'Normal', the curve L=f(L) has the same algorithm than slider lightness.\n'Super' the curve L=f(L) has an new improved algorithm, which can leeds in some cases to artifacts.
+TP_LOCALLAB_CURVENCONTRAST;Super+Contrast threshold (experimental)
+TP_LOCALLAB_CURVENH;Super
+TP_LOCALLAB_CURVENHSU;Combined HueChroma (experimental)
+TP_LOCALLAB_CURVENSOB2;Combined HueChroma + Contrast threshold (experimental)
+TP_LOCALLAB_CURVNONE;Disable curves
+TP_LOCALLAB_DARKRETI;Darkness
+TP_LOCALLAB_DEHAFRA;Dehaze
+TP_LOCALLAB_DEHAZ;Strength
+TP_LOCALLAB_DEHAZ_TOOLTIP;Negative values adds haze
+TP_LOCALLAB_DELTAD;Delta balance
+TP_LOCALLAB_DELTAEC;Mask ΔE Image
+TP_LOCALLAB_DENOIS;Ψ Denoise
+TP_LOCALLAB_DENOI_TOOLTIP;This module can be used alone (at the end of process), or in complement of main denoise (at the beginning).\nScope allows to differentiate the action according to the color (deltaE).\nYou can complete the action with "median" or "Guided Filter" (Smooth Blur...).\nYou can complete the action with "Blur levels" "Wavelet pyramid"
+TP_LOCALLAB_DEPTH;Depth
+TP_LOCALLAB_DETAIL;Local contrast
+TP_LOCALLAB_DETAILSH;Details
+TP_LOCALLAB_DETAILTHR;Detail threshold Luminance Chroma (DCT ƒ)
+TP_LOCALLAB_DUPLSPOTNAME;Copy
+TP_LOCALLAB_EDGFRA;Edge Sharpness
+TP_LOCALLAB_EDGSHOW;Show all tools
+TP_LOCALLAB_ELI;Elipse
+TP_LOCALLAB_ENABLE_AFTER_MASK;Use Tone Mapping
+TP_LOCALLAB_ENABLE_MASK;Enable mask
+TP_LOCALLAB_ENABLE_MASKAFT;Use all algorithms Exposure
+TP_LOCALLAB_ENARETIMASKTMAP_TOOLTIP;If enabled Mask uses Restored Datas after Transmission Map instead of Original datas
+TP_LOCALLAB_ENH;Enhanced
+TP_LOCALLAB_ENHDEN;Enhanced + chroma denoise
+TP_LOCALLAB_EPSBL;Detail
+TP_LOCALLAB_EQUIL;Normalize Luminance
+TP_LOCALLAB_EQUILTM_TOOLTIP;Reconstruct luminance in such a way that the mean and the variance of the output image is identical to that of the original.
+TP_LOCALLAB_ESTOP;Edge stopping
+TP_LOCALLAB_EV_DUPL;Copy of
+TP_LOCALLAB_EV_NVIS;Hide
+TP_LOCALLAB_EV_NVIS_ALL;Hide all
+TP_LOCALLAB_EV_VIS;Show
+TP_LOCALLAB_EV_VIS_ALL;Show all
+TP_LOCALLAB_EXCLUF;Excluding
+TP_LOCALLAB_EXCLUF_TOOLTIP;Can be used to exclude this part of datas - move Scope to extend color.\n You can apply all settings to this RT-spot.
+TP_LOCALLAB_EXCLUTYPE;Spot method
+TP_LOCALLAB_EXCLUTYPE_TOOLTIP;Normal spot use recursive data.\n\nExcluding spot reinitialize data to origin.\nCan be used to totally or partially cancel a previous action or to perform a inverse mode
+TP_LOCALLAB_EXECLU;Excluding spot
+TP_LOCALLAB_EXNORM;Normal spot
+TP_LOCALLAB_EXPCBDL_TOOLTIP;In the case of contaminated sensor (type "grease"), and when the area is important or for a series of small defects.\n\na) Put the selection spot on a pronounced default (adapting its size if necessary), use a large spot enough to allow wavelet; b) choose a wide selection area to cover most of the area affected by the defects; c) Select a transition value (low) and transition weakening (high value); d) act on levels 2, 3, 4 or 5 or lower by reducing the contrast (values below 100) and by acting on the chroma slider if necessary. e)possibly act on "scope" to reduce the extent of the action.\n\nYou can also complete with Blur levels and Gaussian blur (Smooth Blur and noise)
+TP_LOCALLAB_EXPCHROMA;Chroma compensation
+TP_LOCALLAB_EXPCHROMA_TOOLTIP;Only in association with exposure compensation and PDE Ipol.\nAvoids desaturation of colors
+TP_LOCALLAB_EXPCOLOR_TOOLTIP;In the case of small defects.\n\nRed-eyes : red-centered circular selector, spot delimiters close to the eye, weak scope, "lightness" -100, "chrominance" -100.\n\nSpotIR :Circular selector centered on the defect, spot delimiters close to the default - reduce "chrominance", possibly act on "scope" to reduce the extent of the action.\n\nDust - grease (small) :Circular selector centered on the defect (adapt the size of the spot), spot delimiters not too close to the defect to allow an inconspicuous transition. a) "Transition" (low values) and "Transition weak" (high values); b) act on "lightness" and possibly on "chrominance" or "Color correction grid - direct" to approach the rendering of the polluted zone to that of the healthy zone; c) act moderately on "scope" to modulate the desired action.\n\nYou can also complete with Gaussian blur (Smooth Blur and noise)
+TP_LOCALLAB_EXPCONTRAST_TOOLTIP;Avoid spots that are too small(< 32x32 pixels).\nUse low transition values and high weakening transition values and scope to simulate small RT-spot and deal wth defects.\nUse if necessary the module 'Clarity & Sharp mask and Blend images' by adjusting 'Soft radius' to reduce artifacts.
+TP_LOCALLAB_EXPCONTRASTPYR_TOOLTIP;See the documentation of wavelet levels.\nHowever there are some differences: more tools and closer to the details.\nEx: Tone mapping for wavelet levels.
+TP_LOCALLAB_EXPCURV;Curves
+TP_LOCALLAB_EXPGRAD;Graduated Filter
+TP_LOCALLAB_EXPLAP_TOOLTIP;The more you act on this threshold slider, the greater the action of reducing contrast.
+TP_LOCALLAB_EXPLAPBAL_TOOLTIP;Balances the action between the original image and the Laplace transform.
+TP_LOCALLAB_EXPLAPLIN_TOOLTIP;Add linear exposure component before application Laplace transform
+TP_LOCALLAB_EXPLAPGAMM_TOOLTIP;Apply a gamma before and after Laplace transform
+TP_LOCALLAB_EXPMERGEFILE_TOOLTIP;Allows various possibilities to blend image (as layers in Photosshop) : difference, multiply, soft light, overlay...with opacity...\nOriginal Image : merge current RT-spot with Original.\nPrevious spot : merge current Rt-spot with previous - if there is only one spot previous = original.\nBackground : merge current RT-spot with a color and luminance background (less possibilties)
+TP_LOCALLAB_EXPNOISEMETHOD_TOOLTIP;Apply a median before Laplace transform to prevent artifacts (noise).\nYou can also use "Denoise" tool.
+TP_LOCALLAB_EXPMETHOD_TOOLTIP;Standard : use an algorithm similar as main Exposure but in L*a*b* and taking account of deltaE.\n\nLaplacian & PDE : use another algorithm also with deltaE and with Poisson equation to solve Laplacian in Fourier space.\nPDE IPOL, PDE Fattal and Standard can be combined.\nFFTW Fourier Transform is optimized in size to reduce processing time.\nPDE reduce artifacts and noise.
+TP_LOCALLAB_EXPOSE;Exposure - PDE algorithms
+TP_LOCALLAB_EXPOSURE_TOOLTIP;In some cases (strong shadows ..) you can use others modules "Shadows Highlights", "Tone equalizer", "TRC", "Encoding Log"...
+TP_LOCALLAB_EXPRETITOOLS;Advanced Retinex Tools
+TP_LOCALLAB_EXPSHARP_TOOLTIP;RT-Spot minimum 39*39.\nUse low transition values and high weakening transition values and scope to simulate small RT-spot.
+TP_LOCALLAB_EXPTOOL;Tools exposure
+TP_LOCALLAB_EXPTRC;Tone Response Curve - TRC
+TP_LOCALLAB_FATAMOUNT;Amount
+TP_LOCALLAB_FATANCHOR;Anchor
+TP_LOCALLAB_FATANCHORA;Offset
+TP_LOCALLAB_FATDETAIL;Detail
+TP_LOCALLAB_FATFRA;Dynamic Range Compression ƒ
+TP_LOCALLAB_FATFRAME_TOOLTIP;PDE Fattal - use Fattal Tone mapping algorithm.
+TP_LOCALLAB_FATLEVEL;Sigma
+TP_LOCALLAB_FATRES;Amount Residual Image
+TP_LOCALLAB_FATSHFRA;Dynamic Range Compression Mask ƒ
+TP_LOCALLAB_FEATH_TOOLTIP;Gradient width in percent of the Spot diagonal\nUsed by all Graduated filter in all tools.\nNo action if Graduated Filter are not used.
+TP_LOCALLAB_FEATVALUE;Feather gradient (Graduated Filters)
+TP_LOCALLAB_FFTCOL_MASK;FFTW ƒ
+TP_LOCALLAB_FFTW;ƒ - Use Fast Fourier Transform
+TP_LOCALLAB_FFTW2;ƒ - Use Fast Fourier Transform (TIF, JPG,..)
+TP_LOCALLAB_FFTWBLUR;ƒ - Always Use Fast Fourier Transform
+TP_LOCALLAB_FULLIMAGE;Calculate DarkEv - WhiteEv - Value on the entire image
+TP_LOCALLAB_GAM;Gamma
+TP_LOCALLAB_GAMFRA;Tone response curve (TRC)
+TP_LOCALLAB_GAMM;Gamma
+TP_LOCALLAB_GAMMASKCOL;Gamma mask
+TP_LOCALLAB_GAMSH;Gamma
+TP_LOCALLAB_GRADANG;Gradient angle
+TP_LOCALLAB_GRADANG_TOOLTIP;Rotation angle in degrees : -180 0 +180
+TP_LOCALLAB_GRADFRA;Graduated Filter Mask
+TP_LOCALLAB_GRADGEN_TOOLTIP;Graduated filter is supplied with Color and Light & merge file, Exposure & mask, Shadows Highlight, Vibrance, Encoding log.\n\nVibrance, Color and Light & merge file, are provided with GF luminance, chrominance, Hue.\nFeather is located in settings.
+TP_LOCALLAB_GRADLOGFRA;Graduated Filter Luminance
+TP_LOCALLAB_GRADSTR;Gradient strength
+TP_LOCALLAB_GRADSTRAB_TOOLTIP;Filter chroma strength
+TP_LOCALLAB_GRADSTRCHRO;Gradient strength Chrominance
+TP_LOCALLAB_GRADSTRHUE2;Gradient strength Hue
+TP_LOCALLAB_GRADSTRHUE;Gradient strength Hue
+TP_LOCALLAB_GRADSTRHUE_TOOLTIP;Filter Hue strength
+TP_LOCALLAB_GRADSTRLUM;Gradient strength Luminance
+TP_LOCALLAB_GRADSTR_TOOLTIP;Filter strength in stops
+TP_LOCALLAB_GRAINFRA;Film Grain 1:1
+TP_LOCALLAB_GRALWFRA;Graduated Filter Local contrast
+TP_LOCALLAB_GRIDFRAME_TOOLTIP;You can use this tool as a brush. Use small spot and adapt transition and transition weakening\nOnly mode NORMAL and eventually Hue, Saturation, Color, Luminosity are concerned by Merge background (ΔE)
+TP_LOCALLAB_GRIDONE;Color Toning
+TP_LOCALLAB_GRIDTWO;Direct
+TP_LOCALLAB_GUIDBL;Soft radius
+TP_LOCALLAB_GUIDFILTER;Guided filter radius
+TP_LOCALLAB_GUIDFILTER_TOOLTIP;Adapt this values according to images - can reduce or increase artifacts.
+TP_LOCALLAB_HIGHMASKCOL;Highlights mask
+TP_LOCALLAB_HHMASK_TOOLTIP;Fine hue adjustments for example for the skin.
+TP_LOCALLAB_HLH;Curves H
+TP_LOCALLAB_IND;Independent (mouse)
+TP_LOCALLAB_INDSL;Independent (mouse + sliders)
+TP_LOCALLAB_INVERS;Inverse
+TP_LOCALLAB_INVERS_TOOLTIP;If selected (inverse) less possibilities.\n\nAlternative\nFirst Spot:\n full image - delimiter outside preview\n Shape RT-spot area : rectangle. Transition 100\n\nSecond spot : Excluding spot
+TP_LOCALLAB_ISOGR;Coarseness (ISO)
+TP_LOCALLAB_LABEL;Local Adjustments
+TP_LOCALLAB_LABBLURM;Mask Blur
+TP_LOCALLAB_LABGRID;Color correction grid
+TP_LOCALLAB_LABGRIDMERG;Background
+TP_LOCALLAB_LABGRID_VALUES;High(a)=%1 High(b)=%2\nLow(a)=%3 Low(b)=%4
+TP_LOCALLAB_LABSTRUM;Mask Structure
+TP_LOCALLAB_LAPLACC;ΔØ Mask Laplacian solve PDE
+TP_LOCALLAB_LAP_MASK_TOOLTIP;Solve PDE for all Laplacian masks.\nIf enabled Laplacian threshold mask reduce artifacts and smooth result.\nIf disabled linear response.
+TP_LOCALLAB_LAPLACE;Δ - Laplacian threshold ΔE
+TP_LOCALLAB_LAPLACEXP;∆ - Laplacian threshold
+TP_LOCALLAB_LAPMASKCOL;∆ - Laplacian threshold mask
+TP_LOCALLAB_LAPRAD_TOOLTIP;Avoid using Radius and Laplace Threshold simultaneously.\nLaplacian threshold reduce contrast, artifacts, smooth result (if PDE settings enabled).
+TP_LOCALLAB_LC_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated.\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\n
+TP_LOCALLAB_LEVELBLUR;Maximum Blur levels
+TP_LOCALLAB_LEVELLOCCONTRAST_TOOLTIP;On the abscissa local contrast (near concept luminance). On the ordinate, amplification or reduction local contrast.
+TP_LOCALLAB_LEVELWAV;Ψ Wavelets Levels
+TP_LOCALLAB_LEVELWAV_TOOLTIP;The Level is automatically adapted to the size of the spot and the preview.\nFrom level 9 size max 512 to level 1 size max = 4
+TP_LOCALLAB_LIGHTNESS;Lightness
+TP_LOCALLAB_LIGHTN_TOOLTIP;In inverse mode: selection = -100 force luminance to zero
+TP_LOCALLAB_LIGHTRETI;Lightness
+TP_LOCALLAB_LINEAR;Linearity
+TP_LOCALLAB_LMASK_LEVEL_TOOLTIP;Give priority to action on midtones and high lights and by choosing the concerned wavelet levels
+TP_LOCALLAB_LMASK_LL_TOOLTIP;Give priority to action on midtones and high lights
+TP_LOCALLAB_LOCCONT;Unsharp Mask
+TP_LOCALLAB_LOC_CONTRAST;Local contrast -Wavelet - defects
+TP_LOCALLAB_LOC_CONTRASTPYR;Ψ Pyramid 1:
+TP_LOCALLAB_LOC_CONTRASTPYRLAB; Graduated Filter - Edge Sharpness - Blur
+TP_LOCALLAB_LOC_CONTRASTPYR2;Ψ Pyramid 2:
+TP_LOCALLAB_LOC_CONTRASTPYR2LAB; Contrast by Levels- Tone Mapping - Dir. Contrast
+TP_LOCALLAB_LOC_RESIDPYR;Residual Image Main
+TP_LOCALLAB_LOG;Encoding log
+TP_LOCALLAB_LOGAUTO;Automatic
+TP_LOCALLAB_LOGFRA;Source Gray Point
+TP_LOCALLAB_LOGLIN;Logarithm mode
+TP_LOCALLAB_LOGPFRA;Relative Exposure Levels
+TP_LOCALLAB_LOGENCOD_TOOLTIP;Allows Tone Mapping with Logarithm encoding (ACES).\nUsefull for underexposed pictures, or with high dynamic range.\n\nTwo steps in the process : 1) Calculate Dynamic Range 2) User adaptation
+TP_LOCALLAB_LOGFRAME_TOOLTIP;Calculate or use Exposure levels of the image early in the process:\n Black Ev, White Ev and Source Gray point.\n Take into account main exposure compensation.
+TP_LOCALLAB_LOGAUTO_TOOLTIP;Pressing this button will bring an evaluation of dynamic range and Source Gray point (if "Automatic" Source gray enabled).\nTo be able to touch up the automatic values, press the button again
+TP_LOCALLAB_LOGBLACKWHEV_TOOLTIP;Estimated values of Dynamic Range - Black Ev and White Ev
+TP_LOCALLAB_LOGSRCGREY_TOOLTIP;Estimated gray point value of the image, early in the process
+TP_LOCALLAB_LOGTARGGREY_TOOLTIP;You can change this value to adapt it to your taste.
+TP_LOCALLAB_LOGBASE_TOOLTIP;Default = 2.\nValues less than 2 reduce the action of the algorithm, the shadows are darker, the highlights are brighter.\nValues greater than 2 change the action of the algorithm, the shadows are grayer the highlights are more washed out
+TP_LOCALLAB_LUM;Curves LL - CC
+TP_LOCALLAB_LUMADARKEST;Darkest
+TP_LOCALLAB_LUMASK;Luminance Background Mask
+TP_LOCALLAB_LUMASK_TOOLTIP;Adjust the gray of the mask background in Show Mask (Mask and modifications)
+TP_LOCALLAB_LUMAWHITESEST;Whiteest
+TP_LOCALLAB_LUMONLY;Luminance only
+TP_LOCALLAB_MASFRAME;Mask and Merge
+TP_LOCALLAB_MASFRAME_TOOLTIP;For all masks.\nTake into account deltaE image to avoid retouching the selection area when sliders gamma mask, slope mask, chroma mask and curves contrast , levels contrasts, and mask blur, structure(if enabled tool) are used.\nDisabled in Inverse
+TP_LOCALLAB_MASK2;Contrast curve mask
+TP_LOCALLAB_MASK;Mask
+TP_LOCALLAB_MASKCOL;Mask Curves
+TP_LOCALLAB_MASKH;Hue curve mask
+TP_LOCALLAB_MASK_TOOLTIP;You can enable multiple masks for a single tool, this requires activating another tool (but without using the tool : sliders to 0,...) where is the mask you want to activate.\n\nYou can also duplicate the RT-spot and place it right next to each other,variations of references allow fine work on images.
+TP_LOCALLAB_MED;Medium
+TP_LOCALLAB_MEDIAN;Median Low
+TP_LOCALLAB_MEDNONE;None
+TP_LOCALLAB_MERCOL;Color
+TP_LOCALLAB_MERDCOL;Merge background (ΔE)
+TP_LOCALLAB_MERELE;Lighten only
+TP_LOCALLAB_MERFIV;Addition
+TP_LOCALLAB_MERFOR;Color Dodge
+TP_LOCALLAB_MERFOU;Multiply
+TP_LOCALLAB_MERGE1COLFRA;Merge with Original or Previous or Background
+TP_LOCALLAB_MERGECOLFRA;Mask: LCH & Structure
+TP_LOCALLAB_MERGEFIV;Previous Spot(Mask 7) + Mask LCH
+TP_LOCALLAB_MERGEFOU;Previous Spot(Mask 7)
+TP_LOCALLAB_MERGENONE;None
+TP_LOCALLAB_MERGEONE;Short Curves 'L' Mask
+TP_LOCALLAB_MERGEOPA_TOOLTIP;Opacity merge % current Spot with original or previous Spot.\nContrast threshold : adjust result in function of Original contrast
+TP_LOCALLAB_MERGETHR;Original(Mask 7) + Mask LCH
+TP_LOCALLAB_MERGETWO;Original(Mask 7)
+TP_LOCALLAB_MERGETYPE;Merge image and mask
+TP_LOCALLAB_MERGETYPE_TOOLTIP;None, use all mask in LCH mode.\nShort curves 'L' mask, use a short circuit for mask 2, 3, 4, 6, 7.\nOriginal mask 8, blend current image with original
+TP_LOCALLAB_MERGEMER_TOOLTIP;Take into account ΔE to merge files (equivalent of scope for this use)
+TP_LOCALLAB_MERHEI;Overlay
+TP_LOCALLAB_MERHUE;Hue
+TP_LOCALLAB_MERLUCOL;Luminance
+TP_LOCALLAB_MERLUM;Luminosity
+TP_LOCALLAB_MERNIN;Screen
+TP_LOCALLAB_MERONE;Normal
+TP_LOCALLAB_MERSAT;Saturation
+TP_LOCALLAB_MERSEV0;Soft Light Illusion
+TP_LOCALLAB_MERSEV1;Soft Light W3C
+TP_LOCALLAB_MERSEV2;Hard Light
+TP_LOCALLAB_MERSEV;Soft Light Photshop
+TP_LOCALLAB_MERSIX;Divide
+TP_LOCALLAB_MERTEN;Darken only
+TP_LOCALLAB_MERTHI;Color Burn
+TP_LOCALLAB_MERTHR;Difference
+TP_LOCALLAB_MERTWE;Exclusion
+TP_LOCALLAB_MERTWO;Substract
+TP_LOCALLAB_METHOD_TOOLTIP;'Enhanced + chroma denoise' significantly increases processing times.\nBut reduce artifacts.
+TP_LOCALLAB_MLABEL;Restored datas Min=%1 Max=%2 (Clip - Offset)
+TP_LOCALLAB_MLABEL_TOOLTIP;'Should be' near min=0 max=32768 (log mode) but others values are possible.\nYou can act on Clip Restored datas and Offset to normalize.\n\nRestored image with no mixture.
+TP_LOCALLAB_MODE_EXPERT;Expert
+TP_LOCALLAB_MODE_NORMAL;Normal
+TP_LOCALLAB_MRFIV;Background
+TP_LOCALLAB_MRFOU;Previous Spot
+TP_LOCALLAB_MRONE;None
+TP_LOCALLAB_MRTHR;Original Image
+TP_LOCALLAB_MRTWO;Short Curves 'L' Mask
+TP_LOCALLAB_MULTIPL_TOOLTIP;Allows the retouching of tones over a very wide range : -18EV +4EV. The first slider acts on very dark tones between -18EV and -6EV. The last slider acts light tones up to 4EV
+TP_LOCALLAB_NEIGH;Radius
+TP_LOCALLAB_NOISECHROCOARSE;Chroma coarse (Wav)
+TP_LOCALLAB_NOISECHROC_TOOLTIP;If superior to zero, high quality algorithm is enabled.\nCoarse is for slider >=0.02
+TP_LOCALLAB_NOISECHRODETAIL;Chroma detail recovery (DCT ƒ)
+TP_LOCALLAB_NOISECHROFINE;Chroma fine (Wav)
+TP_LOCALLAB_NOISEDETAIL_TOOLTIP;Disabled if slider = 100
+TP_LOCALLAB_NOISELEQUAL;Equalizer white-black
+TP_LOCALLAB_NOISELUMCOARSE;Luminance coarse (Wav)
+TP_LOCALLAB_NOISELUMDETAIL;Luminance detail recovery (DCT ƒ)
+TP_LOCALLAB_NOISELUMFINE;Luminance fine 1 (Wav)
+TP_LOCALLAB_NOISELUMFINETWO;Luminance fine 2 (Wav)
+TP_LOCALLAB_NOISELUMFINEZERO;Luminance fine 0 (Wav)
+TP_LOCALLAB_NOISEMETH;Denoise
+TP_LOCALLAB_NONENOISE;None
+TP_LOCALLAB_OFFS;Offset
+TP_LOCALLAB_OFFSETWAV;Offset
+TP_LOCALLAB_OPACOL;Opacity
+TP_LOCALLAB_ORIGLC;Merge only with original image
+TP_LOCALLAB_ORRETISTREN_TOOLTIP;Acts on the Laplacian threshold, the greater the action, the more the differences in contrast will be reduced
+TP_LOCALLAB_ORRETILAP_TOOLTIP;Acts on a second Laplacian threshold, to take into account ΔE to differentiate the action especially with the background (different from Scope)
+TP_LOCALLAB_PASTELS2;Vibrance
+TP_LOCALLAB_PDE;ΔØ Laplacian PDE - Dynamic Range compression + Standard
+TP_LOCALLAB_PDEFRA;PDE IPOL - Contrast attenuator ƒ
+TP_LOCALLAB_PDEFRAME_TOOLTIP;PDE IPOL - personal algorithm adapted from IPOL to Rawtherapee: lead to very different results and needs differents settings that Standard (negative black, gamma < 1,...)\nMay be usefull for low exposure or high dynamic range.\n
+TP_LOCALLAB_PREVIEW;Preview ΔE
+TP_LOCALLAB_PROXI;ΔE weakening
+TP_LOCALLAB_QUALCURV_METHOD;Curves type
+TP_LOCALLAB_QUAL_METHOD;Global quality
+TP_LOCALLAB_RADIUS;Radius
+TP_LOCALLAB_RADIUS_TOOLTIP;Above Radius 30 Use Fast Fourier Transform
+TP_LOCALLAB_RADMASKCOL;Smooth Radius Mask
+TP_LOCALLAB_RECT;Rectangle
+TP_LOCALLAB_RECURS;Recursive references
+TP_LOCALLAB_RECURS_TOOLTIP;Recalculate references for hue, luma, chroma after each module and after each RT-spot.\nAlso useful for working with masks.
+TP_LOCALLAB_REFLABEL;Ref. (0..1) Chroma=%1 Luma=%2 Hue=%3
+TP_LOCALLAB_REN_DIALOG_LAB;Enter the new Control Spot name
+TP_LOCALLAB_REN_DIALOG_NAME;Renaming Control Spot
+TP_LOCALLAB_RESETSHOW;Reset All Show Modifications
+TP_LOCALLAB_RESID;Residual Image
+TP_LOCALLAB_RESIDBLUR;Blur Residual Image
+TP_LOCALLAB_RESIDCHRO;Residual image Chroma
+TP_LOCALLAB_RESIDCOMP;Compress Residual image
+TP_LOCALLAB_RESIDCONT;Residual image Contrast
+TP_LOCALLAB_RESIDHI;Highlights
+TP_LOCALLAB_RESIDHITHR;Highlights threshold
+TP_LOCALLAB_RESIDSHA;Shadows
+TP_LOCALLAB_RESIDSHATHR;Shadows threshold
+TP_LOCALLAB_RETI;Dehaze - Retinex Strong contrast
+TP_LOCALLAB_RETI_LIMDOFFS_TOOLTIP;Play on internal parameters to optimize response.\nLook at the "restored datas" indicators "near" min=0 and max=32768 (log mode), but others values are possible.
+TP_LOCALLAB_RETI_LIGHTDARK_TOOLTIP;Have no effect when the value "Lightness = 1" or "Darkness =2" is chosen.\nIn other cases, the last step of "Multiple scale Retinex" is applied an algorithm close to "local contrast", these 2 cursors, associated with "Strength" will allow to play upstream on the local contrast.
+TP_LOCALLAB_RETI_LOGLIN_TOOLTIP;Logarithm allows differenciation for haze or normal.\nLogarithm brings more contrast but will generate more halo.
+TP_LOCALLAB_RETI_SCALE_TOOLTIP;If scale=1, retinex behaves like local contrast with many more possibilities.\nThe greater the scale, the more intense the recursive action, the longer the calculation times
+TP_LOCALLAB_RETIFRA;Retinex
+TP_LOCALLAB_RETIM;Original Retinex
+TP_LOCALLAB_RETITOOLFRA;Retinex Tools
+TP_LOCALLAB_RETI_FFTW_TOOLTIP;FFT improve quality and allow big radius, but increases the treatment time.\nThe treatment time depends on the surface to be treated\nThe treatment time depends on the value of scale (be carefull to high values).\nTo be used preferably for large radius.\n\nDimensions can be reduced by a few pixels to optimize FFTW.\nThis optimization can reduce the treatment time by a factor of 1.5 to 10.\nOptimization not used in Preview
+TP_LOCALLAB_RETI_NEIGH_VART_TOOLTIP;Adapt these values according to images - if misty images and depending on whether you want to act on the front or the background
+TP_LOCALLAB_REWEI;Reweighting iterates
+TP_LOCALLAB_RGB;RGB Tone Curve
+TP_LOCALLAB_ROW_NVIS;Not visible
+TP_LOCALLAB_ROW_VIS;Visible
+TP_LOCALLAB_SATUR;Saturation
+TP_LOCALLAB_SAVREST;Save - Restore Current Image
+TP_LOCALLAB_SCALEGR;Scale
+TP_LOCALLAB_SCALERETI;Scale
+TP_LOCALLAB_SCALTM;Scale
+TP_LOCALLAB_SCOPEMASK;Scope Mask ΔE Image
+TP_LOCALLAB_SCOPEMASK_TOOLTIP;Enabled if Mask DeltaE Image is enabled.\nLow values avoid retouching selected area
+TP_LOCALLAB_SENSI;Scope
+TP_LOCALLAB_SENSIBN;Scope
+TP_LOCALLAB_SENSICB;Scope
+TP_LOCALLAB_SENSIDEN;Scope
+TP_LOCALLAB_SENSIEXCLU;Scope
+TP_LOCALLAB_SENSIEXCLU_TOOLTIP;Adjust color to include in exclusion!
+TP_LOCALLAB_SENSIH;Scope
+TP_LOCALLAB_SENSIH_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors.
+TP_LOCALLAB_SENSILOG;Scope
+TP_LOCALLAB_SENSIS;Scope
+TP_LOCALLAB_SENSIS_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors.\nValues smaller than 20 lead to a better algorithm.
+TP_LOCALLAB_SENSI_TOOLTIP;Adjust scope of action:\nSmall values limit action to colors very similar to those under the center spot.\nHigh values let the tool act upon a wider range of colors.\nValues smaller than 20 lead to a better algorithm.
+TP_LOCALLAB_SETTINGS;Settings
+TP_LOCALLAB_SH1;Shadows Highlights
+TP_LOCALLAB_SH2;Equalizer
+TP_LOCALLAB_SHADEX;Shadows
+TP_LOCALLAB_SHADEXCOMP;Shadows compression & tonal width
+TP_LOCALLAB_SHADHIGH;ShadowsHighlight - Tone equalizer
+TP_LOCALLAB_SHADOWHIGHLIGHT_TOOLTIP;Can be used instead - or in complement - of exposure module in difficult cases.\nThe use of Denoise may be necessary : lightening the shadows.\n\nCan be used as graduated filter (increase Scope)
+TP_LOCALLAB_SHAMASKCOL;Shadows mask
+TP_LOCALLAB_SHAPETYPE;Shape RT-spot area
+TP_LOCALLAB_SHAPE_TOOLTIP;Elipse is normal mode.\nRectangle can be used in some cases, for example to work in full image in conjonction with delimiters outside preview, transition = 100.\n\nPolygone - Beziers are waiting for GUI...
+TP_LOCALLAB_SHARAMOUNT;Amount
+TP_LOCALLAB_SHARBLUR;Blur radius
+TP_LOCALLAB_SHARDAMPING;Damping
+TP_LOCALLAB_SHARITER;Iterations
+TP_LOCALLAB_SHARFRAME;Modifications
+TP_LOCALLAB_SHARP;Sharpening
+TP_LOCALLAB_SHARRADIUS;Radius
+TP_LOCALLAB_SHORTC;Short Curves 'L' Mask
+TP_LOCALLAB_SHORTCMASK_TOOLTIP;Short circuit the 2 curves L(L) and L(H).\nAllows you to mix the current image with the original image modified by the mask job.\nUsable with masks 2, 3, 4, 6, 7
+TP_LOCALLAB_SHOWC1;Merge file
+TP_LOCALLAB_SHOWC;Mask and modifications
+TP_LOCALLAB_SHOWCB;Mask and modifications
+TP_LOCALLAB_SHOWDCT;Show process Fourier ƒ
+TP_LOCALLAB_SHOWE;Mask and modifications
+TP_LOCALLAB_SHOWFOURIER;Fourier ƒ(dct)
+TP_LOCALLAB_SHOWLAPLACE;∆ Laplacian (first)
+TP_LOCALLAB_SHOWLC;Mask and modifications
+TP_LOCALLAB_SHOWMASK;Show mask
+TP_LOCALLAB_SHOWMASKCOL_TOOLTIP;Display mask modifications.\nBeware, you can only view one tool mask at the same time.\n\nNote: Use Mask is before algorihtm shape detection.
+TP_LOCALLAB_SHOWMASKSOFT_TOOLTIP;Show process Fourier:\nShows the different stages of the process.\nLaplace - builds the second derivative according to the threshold (first step).\nFourier -shows the transformed Laplacian with DCT.\nPoisson - show solution of Poisson DCE.\nNormalize - show result without normalization luminance.
+TP_LOCALLAB_SHOWMASKTYP1;Blur & Noise
+TP_LOCALLAB_SHOWMASKTYP2;Denoise
+TP_LOCALLAB_SHOWMASKTYP3;Blur & Noise + Denoise
+TP_LOCALLAB_SHOWMASKTYP_TOOLTIP;Mask and modifications can be chosen.\nBlur and noise : in this case it is not used for 'denoise'.\nDenoise : in this case it is not used for 'blur and noise'.\n\nBlur and noise + denoise : mask is shared, be carefull to 'show modifications' and 'scope'
+TP_LOCALLAB_SHOWMNONE;None
+TP_LOCALLAB_SHOWMODIF;Show modifications without mask
+TP_LOCALLAB_SHOWMODIFMASK;Show modifications with mask
+TP_LOCALLAB_SHOWNORMAL;Normalize luminance (no)
+TP_LOCALLAB_SHOWPLUS;Mask and modifications - Smooth-Blur & Denoise
+TP_LOCALLAB_SHOWPOISSON;Poisson (pde ƒ)
+TP_LOCALLAB_SHOWR;Mask and modifications
+TP_LOCALLAB_SHOWS;Mask and modifications
+TP_LOCALLAB_SHOWREF;Preview ΔE
+TP_LOCALLAB_SHOWSTRUC;Show structure Spot
+TP_LOCALLAB_SHOWSTRUCEX;Show structure Spot
+TP_LOCALLAB_SHOWT;Mask and modifications
+TP_LOCALLAB_SHOWVI;Mask and modifications
+TP_LOCALLAB_SHRESFRA;Shadows/Highlights
+TP_LOCALLAB_SHTRC_TOOLTIP;Modifies the tones of the image by acting on a TRC (Tone Response Curve).\nGamma acts mainly on light tones.\nSlope acts mainly on dark tones
+TP_LOCALLAB_SIGMAWAV;Attenuation Response
+TP_LOCALLAB_SIM;Simple
+TP_LOCALLAB_SLOMASKCOL;Slope mask
+TP_LOCALLAB_SLOSH;Slope
+TP_LOCALLAB_SOFT;Soft Light - Original Retinex
+TP_LOCALLAB_SOFTM;Soft Light
+TP_LOCALLAB_SOFTMETHOD_TOOLTIP;Original Retinex is very different from others Retinex method.\nIts acts on grey and balance luminance.\nIt is an emulation of "Dodge" and "Burn"
+TP_LOCALLAB_SOFTRADIUSCOL;Soft radius
+TP_LOCALLAB_SOFTRETI;Reduce artifact ΔE
+TP_LOCALLAB_SOFTRETI_TOOLTIP;Take into account deltaE to improve Transmission map
+TP_LOCALLAB_SOURCE_GRAY;Value
+TP_LOCALLAB_SPECIAL;Special use of RGB curves
+TP_LOCALLAB_SPECIAL_TOOLTIP;Only for this RGB curve, disabled (or reduce effects) of Scope, mask...for example, if you want to have a negative effect.
+TP_LOCALLAB_SPECCASE; Specific cases
+TP_LOCALLAB_SPOTNAME;Control Spot #
+TP_LOCALLAB_STD;Standard
+TP_LOCALLAB_STR;Strength
+TP_LOCALLAB_STRBL;Strength
+TP_LOCALLAB_STREN;Compression Strength
+TP_LOCALLAB_STRENG;Strength
+TP_LOCALLAB_STRENGR;Strength
+TP_LOCALLAB_STRENGTH;Noise
+TP_LOCALLAB_STRGRID;Strength
+TP_LOCALLAB_STRRETI_TOOLTIP;if Strength Retinex < 0.2 only Dehaze is enabled.\nif Strength Retinex >= 0.1 Dehaze is in luminance mode.
+TP_LOCALLAB_STRUC;Structure
+TP_LOCALLAB_STRUCCOL1;Structure Spot
+TP_LOCALLAB_STRUCT_TOOLTIP;Use Sobel algorithm to take into account structure in shape detection.\nyou can have a preview by activating "mask and modifications - Show structure spot".\n\nCan be used in conjunction with masks (expert) structure, blur, wavelet to improve edge detection.\n\nNeeds maskless adjustments to be activated (lightness, exposure...)
+TP_LOCALLAB_STRUCCOL;Structure
+TP_LOCALLAB_STRUMASKCOL;Structure mask strength
+TP_LOCALLAB_STRUMASK_TOOLTIP;Generate a structure mask with difference between surface areas and reliefs.\nIf structure mask as tool is enabled, this mask is used in addition to the other tools (gamma, slope, contrast curve ...)
+TP_LOCALLAB_STYPE;Shape method
+TP_LOCALLAB_STYPE_TOOLTIP;You can choose between:\nSymmetrical - left handle linked to right, top handle linked to bottom.\nIndependent - all handles are independent.
+TP_LOCALLAB_SYM;Symmetrical (mouse)
+TP_LOCALLAB_SYMSL;Symmetrical (mouse + sliders)
+TP_LOCALLAB_TARGET_GRAY;Target Gray Point
+TP_LOCALLAB_THRES;Threshold structure
+TP_LOCALLAB_THRESDELTAE;Threshold ΔE-scope
+TP_LOCALLAB_THRESRETI;Threshold
+TP_LOCALLAB_THRESWAV;Balance Threshold
+TP_LOCALLAB_TLABEL2;TM Effective Tm=%1 TM=%2
+TP_LOCALLAB_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4 (Threshold)
+TP_LOCALLAB_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.\nYou can act on Threshold to normalize
+TP_LOCALLAB_TM;Tone Mapping - Texture
+TP_LOCALLAB_TM_MASK;Use transmission map
+TP_LOCALLAB_TONEMAPESTOP_TOOLTIP;This parameter affects sensitivity to edges.\n The greater it is the more likely an illumination change is to be considered an "edge".\n If set to zero tone mapping will have an effect similar to unsharp masking.
+TP_LOCALLAB_TONEMAPREWEI_TOOLTIP;In some cases tone mapping may result in a cartoonish appearance, and in some rare cases soft but wide halos may appear.\n Increasing the number of reweighting iterates will help fight some of these problems.
+TP_LOCALLAB_TONEMASCALE_TOOLTIP;This control gives meaning to the difference between "local" and "global" contrast.\nThe greater it is the larger a detail needs to be in order to be boosted
+TP_LOCALLAB_TONEMAPGAM_TOOLTIP;Gamma moves the action of tone-mapping to shadows or highlights.
+TP_LOCALLAB_TOOLCOL;Structure mask as tool
+TP_LOCALLAB_TONEMAP_TOOLTIP;Tone Mapping - main menu must be disabled
+TP_LOCALLAB_TOOLMASK;Tools
+TP_LOCALLAB_TRANSIT;Transition Gradient
+TP_LOCALLAB_TRANSITGRAD;Transition differentiation XY
+TP_LOCALLAB_TRANSITGRAD_TOOLTIP;Changes the transition of the abscissa to that of the ordinate
+TP_LOCALLAB_TRANSITVALUE;Transition value
+TP_LOCALLAB_TRANSITWEAK;Transition weakening
+TP_LOCALLAB_TRANSITWEAK_TOOLTIP;Adjust transition weakening : change smoothness process - 1 linear - 2 parabolic - 3 cubic - ^25.\nCan be used in conjunction with very low transition values to reduce defects (CBDL, Wavelet, Color & Light)
+TP_LOCALLAB_TRANSIT_TOOLTIP;Adjust smoothness of transition between affected and unaffected areas, as a percentage of the "radius"
+TP_LOCALLAB_TRANSMISSIONGAIN;Transmission gain
+TP_LOCALLAB_TRANSMISSIONMAP;Transmission map
+TP_LOCALLAB_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.\nYou can act on this curve to change Transmission and reduce the artifacts
+TP_LOCALLAB_USEMASK;Use mask
+TP_LOCALLAB_VART;Variance (contrast)
+TP_LOCALLAB_VIBRANCE;Vibrance - Warm & Cool
+TP_LOCALLAB_VIS_TOOLTIP;Click to show/hide selected Control Spot.\nCtrl+click to show/hide all Control Spot.
+TP_LOCALLAB_LIST_NAME;Add tool to current spot...
+TP_LOCALLAB_LIST_TOOLTIP;Choose a tool and then its level of complexity "Normal" or "Expert".\nThe number reflects the place of the tool in the process of each RT-Spot
+TP_LOCALLAB_COLOR_TOOLNAME;Color&Light (Defects) - 11
+TP_LOCALLAB_EXP_TOOLNAME;Exposure - Dynamic Range Compression - 10
+TP_LOCALLAB_SH_TOOLNAME;Shadows Highlight & Tone Equalizer - 5
+TP_LOCALLAB_VIB_TOOLNAME;Vibrance - Warm & Cool - 3
+TP_LOCALLAB_SOFT_TOOLNAME;Soft Light & Original Retinex - 6
+TP_LOCALLAB_BLUR_TOOLNAME;Smooth Blur Gain & Denoise - 1
+TP_LOCALLAB_TONE_TOOLNAME;Tone Mapping - 4
+TP_LOCALLAB_RET_TOOLNAME;Dehaze & Retinex - 9
+TP_LOCALLAB_SHARP_TOOLNAME;Sharpening - 8
+TP_LOCALLAB_LC_TOOLNAME;Local Constrast & Wavelet (Defects) - 7
+TP_LOCALLAB_CBDL_TOOLNAME;CBDL (Defects) - 2
+TP_LOCALLAB_LOG_TOOLNAME;Encoding log - 0
+TP_LOCALLAB_WAMASKCOL;Ψ Mask Wavelet level
+TP_LOCALLAB_WARM;Warm - Cool & Color artifacts
+TP_LOCALLAB_WARM_TOOLTIP;This slider use Ciecam algorithm and acts as White Balance, it can warm or cool the area selected.\nIt can also in some cases reduce color artifacts.
+TP_LOCALLAB_WAV;Levels local contrast
+TP_LOCALLAB_WAVMASK_TOOLTIP;Allows fine work on mask levels contrasts (structure)
+TP_LOCALLAB_WAVBLUR_TOOLTIP;Performs a blur for each level of decomposition, as well as the residual image.
+TP_LOCALLAB_WAVEDG;Local contrast
+TP_LOCALLAB_WAVCOMP;Compression by Level
+TP_LOCALLAB_WAVCOMP_TOOLTIP;Achive local contrast in function of the direction wavelet decomposition : horizontal, vertical, diagonal
+TP_LOCALLAB_WAVCOMPRE;(un)Compression by Level
+TP_LOCALLAB_WAVCOMPRE_TOOLTIP;Achieve a Tone-mapping or reduction local contrast by levels.\nOn abscissa levels
+TP_LOCALLAB_WAVCON;Contrast by Level
+TP_LOCALLAB_WAVCONTF_TOOLTIP;Similar to Contrast By Detail Levels : on abscissa levels.
+TP_LOCALLAB_WAVDEN;Luminance denoise by level (0 1 2 + 3 and more)
+TP_LOCALLAB_WASDEN_TOOLTIP;Denoise luminance for the 3 first levels (fine).\nThe right limit of the curve correspond to coarse : level 3 and beyond
+TP_LOCALLAB_WAVE;Ψ Wavelet
+TP_LOCALLAB_WAVEEDG_TOOLTIP;Achieves a sharpness taking into account the notion of edges wavelet.\nRequires that at least the first 4 levels are usable
+TP_LOCALLAB_WAVGRAD_TOOLTIP;Graduated filter for Local contrast "luminance"
+TP_LOCALLAB_WAVHIGH;Ψ Wavelet high
+TP_LOCALLAB_WAVLEV;Blur by Level
+TP_LOCALLAB_WAVLOW;Ψ Wavelet low
+TP_LOCALLAB_WAVMASK;Ψ Mask Levels local contrast
+TP_LOCALLAB_WAVMED;Ψ Wavelet normal
+TP_LOCALLAB_WEDIANHI;Median Hi
+TP_LOCALLAB_WHITE_EV;White Ev
+TP_LOCALLAB_BLNOI_EXP;Blur & Noise
+TP_LOCALLAB_DENOI_EXP;Denoise
+TP_LOCAL_HEIGHT;Bottom
+TP_LOCAL_HEIGHT_T;Top
+TP_LOCAL_WIDTH;Right
+TP_LOCAL_WIDTH_L;Left
+TP_LOCRETI_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\n
TP_LOCALCONTRAST_AMOUNT;Amount
TP_LOCALCONTRAST_DARKNESS;Darkness level
TP_LOCALCONTRAST_LABEL;Local Contrast
@@ -1899,6 +2909,10 @@ TP_PREPROCESS_LINEDENOISE_DIRECTION_PDAF_LINES;Horizontal only on PDAF rows
TP_PREPROCESS_LINEDENOISE_DIRECTION_VERTICAL;Vertical
TP_PREPROCESS_NO_FOUND;None found
TP_PREPROCESS_PDAFLINESFILTER;PDAF lines filter
+TP_PREPROCWB_LABEL;Preprocess White Balance
+TP_PREPROCWB_MODE;Mode
+TP_PREPROCWB_MODE_AUTO;Auto
+TP_PREPROCWB_MODE_CAMERA;Camera
TP_PRSHARPENING_LABEL;Post-Resize Sharpening
TP_PRSHARPENING_TOOLTIP;Sharpens the image after resizing. Only works when the "Lanczos" resizing method is used. It is impossible to preview the effects of this tool. See RawPedia for usage instructions.
TP_RAWCACORR_AUTO;Auto-correction
@@ -2052,8 +3066,8 @@ TP_RETINEX_MAP_NONE;None
TP_RETINEX_MEDIAN;Transmission median filter
TP_RETINEX_METHOD;Method
TP_RETINEX_METHOD_TOOLTIP;Low = Reinforce low light.\nUniform = Equalize action.\nHigh = Reinforce high light.\nHighlights = Remove magenta in highlights.
-TP_RETINEX_MLABEL;Restored haze-free Min=%1 Max=%2
-TP_RETINEX_MLABEL_TOOLTIP;Should be near min=0 max=32768\nRestored image with no mixture.
+TP_RETINEX_MLABEL;Restored data Min=%1 Max=%2
+TP_RETINEX_MLABEL_TOOLTIP;'Should be' near min=0 max=32768 (log mode) but others values are possible\nRestored image with no mixture.
TP_RETINEX_NEIGHBOR;Radius
TP_RETINEX_NEUTRAL;Reset
TP_RETINEX_NEUTRAL_TIP;Reset all sliders and curves to their default values.
@@ -2066,11 +3080,11 @@ TP_RETINEX_SLOPE;Free gamma slope
TP_RETINEX_STRENGTH;Strength
TP_RETINEX_THRESHOLD;Threshold
TP_RETINEX_THRESHOLD_TOOLTIP;Limits in/out.\nIn = image source,\nOut = image gauss.
-TP_RETINEX_TLABEL;TM Min=%1 Max=%2 Mean=%3 Sigma=%4
-TP_RETINEX_TLABEL2;TM Tm=%1 TM=%2
-TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nMean and Sigma.\nTm=Min TM=Max of transmission map.
+TP_RETINEX_TLABEL;TM Datas Min=%1 Max=%2 Mean=%3 Sigma=%4
+TP_RETINEX_TLABEL2;TM Effective Tm=%1 TM=%2
+TP_RETINEX_TLABEL_TOOLTIP;Transmission map result.\nMin and Max are used by Variance.\nTm=Min TM=Max of Transmission Map.
TP_RETINEX_TRANF;Transmission
-TP_RETINEX_TRANSMISSION;Transmission map
+TP_RETINEX_TRANSMISSION;Transmission map
TP_RETINEX_TRANSMISSION_TOOLTIP;Transmission according to transmission.\nAbscissa: transmission from negative values (min), mean, and positives values (max).\nOrdinate: amplification or reduction.
TP_RETINEX_UNIFORM;Uniform
TP_RETINEX_VARIANCE;Contrast
@@ -2131,7 +3145,7 @@ TP_SOFTLIGHT_LABEL;Soft Light
TP_SOFTLIGHT_STRENGTH;Strength
TP_TM_FATTAL_AMOUNT;Amount
TP_TM_FATTAL_ANCHOR;Anchor
-TP_TM_FATTAL_LABEL;Dynamic Range Compression
+TP_TM_FATTAL_LABEL;Dynamic Range Compression ƒ
TP_TM_FATTAL_THRESHOLD;Detail
TP_VIBRANCE_AVOIDCOLORSHIFT;Avoid color shift
TP_VIBRANCE_CURVEEDITOR_SKINTONES;HH
@@ -2177,14 +3191,14 @@ TP_WAVELET_BALANCE;Contrast balance d/v-h
TP_WAVELET_BALANCE_TOOLTIP;Alters the balance between the wavelet directions: vertical-horizontal and diagonal.\nIf contrast, chroma or residual tone mapping are activated, the effect due to balance is amplified.
TP_WAVELET_BALCHRO;Chrominance balance
TP_WAVELET_BALCHRO_TOOLTIP;If enabled, the 'Contrast balance' curve or slider also modifies chroma balance.
-TP_WAVELET_BALCHROM;Denoise Equalizer Blue-Red
+TP_WAVELET_BALCHROM;Denoise Equalizer Blue-yellow Red-green
TP_WAVELET_BALLUM;Denoise Equalizer White-Black
TP_WAVELET_BANONE;None
TP_WAVELET_BASLI;Slider
TP_WAVELET_BATYPE;Contrast balance method
TP_WAVELET_BLCURVE;Blur by levels
TP_WAVELET_BLURFRAME;Blur
-TP_WAVELET_BLUWAV;Damper
+TP_WAVELET_BLUWAV;Attenuation Response
TP_WAVELET_CBENAB;Toning and Color Balance
TP_WAVELET_CB_TOOLTIP;For strong values product color-toning by combining it or not with levels decomposition 'toning'\nFor low values you can change the white balance of the background (sky, ...) without changing that of the front plane, generally more contrasted
TP_WAVELET_CCURVE;Local contrast
@@ -2214,10 +3228,12 @@ TP_WAVELET_CONTEDIT;'After' contrast curve
TP_WAVELET_CONTFRAME;Contrast - Compression
TP_WAVELET_CONTR;Gamut
TP_WAVELET_CONTRA;Contrast
+TP_WAVELET_CONTRASTEDIT;Finer - Coarser levels
TP_WAVELET_CONTRAST_MINUS;Contrast -
TP_WAVELET_CONTRAST_PLUS;Contrast +
TP_WAVELET_CONTRA_TOOLTIP;Changes contrast of the residual image.
TP_WAVELET_CTYPE;Chrominance control
+TP_WAVELET_CURVEEDITOR_BL_TOOLTIP;Disabled if zoom > about 300%
TP_WAVELET_CURVEEDITOR_CC_TOOLTIP;Modifies local contrast as a function of the original local contrast (abscissa).\nLow abscissa values represent small local contrast (real values about 10..20).\n50% abscissa represents average local contrast (real value about 100..300).\n66% abscissa represents standard deviation of local contrast (real value about 300..800).\n100% abscissa represents maximum local contrast (real value about 3000..8000).
TP_WAVELET_CURVEEDITOR_CH;Contrast levels=f(Hue)
TP_WAVELET_CURVEEDITOR_CH_TOOLTIP;Modifies each level's contrast as a function of hue.\nTake care not to overwrite changes made with the Gamut sub-tool's hue controls.\nThe curve will only have an effect when wavelet contrast level sliders are non-zero.
@@ -2227,12 +3243,14 @@ TP_WAVELET_CURVEEDITOR_HH;HH
TP_WAVELET_CURVEEDITOR_HH_TOOLTIP;Modifies the residual image's hue as a function of hue.
TP_WAVELET_DALL;All directions
TP_WAVELET_DAUB;Edge performance
+TP_WAVELET_DAUBLOCAL;Wavelet Edge performance
TP_WAVELET_DAUB2;D2 - low
TP_WAVELET_DAUB4;D4 - standard
TP_WAVELET_DAUB6;D6 - standard plus
TP_WAVELET_DAUB10;D10 - medium
TP_WAVELET_DAUB14;D14 - high
TP_WAVELET_DAUB_TOOLTIP;Changes Daubechies coefficients:\nD4 = Standard,\nD14 = Often best performance, 10% more time-intensive.\n\nAffects edge detection as well as the general quality of the firsts levels. However the quality is not strictly related to this coefficient and can vary with images and uses.
+TP_WAVELET_DIRFRAME;Directional contrast
TP_WAVELET_DONE;Vertical
TP_WAVELET_DTHR;Diagonal
TP_WAVELET_DTWO;Horizontal
@@ -2246,7 +3264,7 @@ TP_WAVELET_EDGEDETECTTHR;Threshold low (noise)
TP_WAVELET_EDGEDETECTTHR2;Threshold high (detection)
TP_WAVELET_EDGEDETECTTHR_TOOLTIP;This adjuster lets you target edge detection for example to avoid applying edge sharpness to fine details, such as noise in the sky.
TP_WAVELET_EDGEDETECT_TOOLTIP;Moving the slider to the right increases edge sensitivity. This affects local contrast, edge settings and noise.
-TP_WAVELET_EDEFFECT;Damper
+TP_WAVELET_EDEFFECT;Attenuation Response
TP_WAVELET_EDEFFECT_TOOLTIP;This slider controls how wide the range of contrast values are that receive the maximum effect from the tool.\nMaximum value (2.5) disabled the tool
TP_WAVELET_EDGESENSI;Edge sensitivity
TP_WAVELET_EDGREINF_TOOLTIP;Reinforce or reduce the action of the first level, do the opposite to the second level, and leave the rest unchanged.
@@ -2258,10 +3276,12 @@ TP_WAVELET_EDSL;Threshold Sliders
TP_WAVELET_EDTYPE;Local contrast method
TP_WAVELET_EDVAL;Strength
TP_WAVELET_FINAL;Final Touchup
+TP_WAVELET_FINCFRAME;Final Local Contrast
TP_WAVELET_FINEST;Finest
-TP_WAVELET_HIGHLIGHT;Highlight luminance range
+TP_WAVELET_HIGHLIGHT;Finer levels luminance range
+TP_WAVELET_FINCOAR_TOOLTIP;The left (positive) part of the curve acts on the finer levels (increase).\nThe 2 points on the abscissa represent the respective action limits of finer and coarser levels 5 and 6 (default).\nThe right (negative) part of the curve acts on the coarser levels (increase).\nAvoid moving the left part of the curve with negative values. Avoid moving the right part of the curve with positives values
TP_WAVELET_HS1;Whole luminance range
-TP_WAVELET_HS2;Shadows/Highlights
+TP_WAVELET_HS2;Selective luminance range
TP_WAVELET_HUESKIN;Skin hue
TP_WAVELET_HUESKIN_TOOLTIP;The bottom points set the beginning of the transition zone, and the upper points the end of it, where the effect is at its maximum.\n\nIf you need to move the area significantly, or if there are artifacts, then the white balance is incorrect.
TP_WAVELET_HUESKY;Sky hue
@@ -2271,10 +3291,10 @@ TP_WAVELET_ITER_TOOLTIP;Left: increase low levels and reduce high levels,\nRight
TP_WAVELET_LABEL;Wavelet Levels
TP_WAVELET_LARGEST;Coarsest
TP_WAVELET_LEVCH;Chroma
-TP_WAVELET_LEVDIR_ALL;All levels in all directions
-TP_WAVELET_LEVDIR_INF;Below or equal the level
+TP_WAVELET_LEVDIR_ALL;All levels, in all directions
+TP_WAVELET_LEVDIR_INF;Finer details levels, with selected level
TP_WAVELET_LEVDIR_ONE;One level
-TP_WAVELET_LEVDIR_SUP;Above the level
+TP_WAVELET_LEVDIR_SUP;Coarser details levels, without selected level
TP_WAVELET_LEVELS;Wavelet levels
TP_WAVELET_LEVELS_TOOLTIP;Choose the number of detail levels the image is to be decomposed into. More levels require more RAM and require a longer processing time.
TP_WAVELET_LEVF;Contrast
@@ -2285,7 +3305,7 @@ TP_WAVELET_LEVTWO;Level 3
TP_WAVELET_LEVZERO;Level 1
TP_WAVELET_LINKEDG;Link with Edge Sharpness' Strength
TP_WAVELET_LIPST;Enhanced algoritm
-TP_WAVELET_LOWLIGHT;Shadow luminance range
+TP_WAVELET_LOWLIGHT;Coarser levels luminance range
TP_WAVELET_LOWTHR_TOOLTIP;Prevents amplification of fine textures and noise
TP_WAVELET_MEDGREINF;First level
TP_WAVELET_MEDI;Reduce artifacts in blue sky
@@ -2296,6 +3316,7 @@ TP_WAVELET_MERGEL;Merge Luma
TP_WAVELET_NEUTRAL;Neutral
TP_WAVELET_NOIS;Denoise
TP_WAVELET_NOISE;Denoise and Refine
+TP_WAVELET_NOISE_TOOLTIP;If level 4 luminance denoise superior to 20, mode Agressive is used.\nIf chrominance coarse superior to 20, mode Agressive is used.
TP_WAVELET_NPHIGH;High
TP_WAVELET_NPLOW;Low
TP_WAVELET_NPNONE;None
@@ -2304,16 +3325,19 @@ TP_WAVELET_NPTYPE_TOOLTIP;This algorithm uses the proximity of a pixel and eight
TP_WAVELET_OLDSH;Algorithm using negatives values
TP_WAVELET_OPACITY;Opacity Blue-Yellow
TP_WAVELET_OPACITYW;Contrast balance d/v-h curve
-TP_WAVELET_OPACITYWL;Final local contrast
+TP_WAVELET_OPACITYWL;Local contrast
TP_WAVELET_OPACITYWL_TOOLTIP;Modify the final local contrast at the end of the wavelet treatment.\n\nThe left side represents the smallest local contrast, progressing to the largest local contrast on the right.
TP_WAVELET_PASTEL;Pastel chroma
TP_WAVELET_PROC;Process
+TP_WAVELET_PROTAB;Protection
TP_WAVELET_RADIUS;Radius Shadows - Highlight
+TP_WAVELET_RANGEAB;Range a and b %
TP_WAVELET_RE1;Reinforced
TP_WAVELET_RE2;Unchanged
TP_WAVELET_RE3;Reduced
TP_WAVELET_RESBLUR;Blur Luminance
TP_WAVELET_RESBLURC;Blur Chroma
+TP_WAVELET_RESBLUR_TOOLTIP;Disabled if zoom > about 500%
TP_WAVELET_RESCHRO;Intensity
TP_WAVELET_RESCON;Shadows
TP_WAVELET_RESCONH;Highlights
@@ -2323,8 +3347,9 @@ TP_WAVELET_SETTINGS;Wavelet Settings
TP_WAVELET_SHA;Sharp mask
TP_WAVELET_SHFRAME;Shadows/Highlights
TP_WAVELET_SHOWMASK;Show wavelet 'mask'
-TP_WAVELET_SIGMA;Damper
-TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n The lower it is, the more pinpoint will the effect be applied to a narrow range of contrast values.
+TP_WAVELET_SIGMA;Attenuation Response
+TP_WAVELET_SIGMAFIN;Attenuation Response
+TP_WAVELET_SIGMA_TOOLTIP;The effect of the contrast sliders is stronger in medium contrast details, and weaker in high and low contrast details.\n With this slider you can control how quickly the effect dampens towards the extreme contrasts.\n The higher the slider is set, the wider the range of contrasts which will get a strong change, and the higher the risk to generate artifacts.\n .The lower it is, the more the effect will be pinpointed towards a narrow range of contrast values
TP_WAVELET_SKIN;Skin targetting/protection
TP_WAVELET_SKIN_TOOLTIP;At -100 skin-tones are targetted.\nAt 0 all tones are treated equally.\nAt +100 skin-tones are protected while all other tones are affected.
TP_WAVELET_SKY;Sky targetting/protection
@@ -2334,10 +3359,10 @@ TP_WAVELET_STREN;Strength
TP_WAVELET_STRENGTH;Strength
TP_WAVELET_SUPE;Extra
TP_WAVELET_THR;Shadows threshold
-TP_WAVELET_THRESHOLD;Highlight levels
-TP_WAVELET_THRESHOLD2;Shadow levels
-TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels between 9 and 9 minus the value will be affected by the shadow luminance range. Other levels will be fully treated. The highest level possible is limited by the highlight level value (9 minus highlight level value).
-TP_WAVELET_THRESHOLD_TOOLTIP;Only levels beyond the chosen value will be affected by the highlight luminance range. Other levels will be fully treated. The chosen value here limits the highest possible value of the shadow levels.
+TP_WAVELET_THRESHOLD;Finer levels
+TP_WAVELET_THRESHOLD2;Coarser levels
+TP_WAVELET_THRESHOLD_TOOLTIP;Only levels below and including the chosen value will be affected by the Highlight luminance range.
+TP_WAVELET_THRESHOLD2_TOOLTIP;Only levels from the chosen value to the selected number of ‘wavelet levels’ will be affected by the Shadow luminance range.
TP_WAVELET_THRESWAV;Balance Threshold
TP_WAVELET_THRH;Highlights threshold
TP_WAVELET_TILESBIG;Tiles
@@ -2352,6 +3377,7 @@ TP_WAVELET_TMSTRENGTH;Compression strength
TP_WAVELET_TMSTRENGTH_TOOLTIP;Control the strength of tone mapping or contrast compression of the residual image.
TP_WAVELET_TMEDGS;Edge stopping
TP_WAVELET_TON;Toning
+TP_WAVELET_TONFRAME;Excluded Colors
TP_WAVELET_TMTYPE;Compression method
TP_WAVELET_USH;None
TP_WAVELET_USHARP;Clarity method
@@ -2359,11 +3385,11 @@ TP_WAVELET_USHARP_TOOLTIP;Origin : the source file is the file before Wavelet.\n
TP_WAVELET_USH_TOOLTIP;If you select Sharp-mask, wavelet settings will be automatically positioned :\nBackground=black, Process=below, level=3...you can change level between 1 and 4.\n\nIf you select Clarity, wavelet settings will be automatically positioned :\nBackground=residual, Process=above, level=7..you can change level between 5 and 10 and wavelet levels.
TP_WAVELET_WAVLOWTHR;Low contrast threshold
TP_WAVELET_WAVOFFSET;Offset
-TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between shadows and highlights.\nHigh values here will amplify the contrast change of the highlights, whereas low values will amplify the contrast change of the shadows.\nAlong with a low Damper value you will able to select the contrasts that will be enhanced.
+TP_WAVELET_OFFSET_TOOLTIP;Offset modifies the balance between shadows and highlights.\nHigh values here will amplify the contrast change of the highlights, whereas low values will amplify the contrast change of the shadows.\nAlong with a low Attenuation Response value you will able to select the contrasts that will be enhanced.
TP_WBALANCE_AUTO;Auto
-TP_WBALANCE_AUTOITCGREEN;Auto iterate temperature correlation
-TP_WBALANCE_AUTOOLD;Auto RGB grey
-TP_WBALANCE_AUTO_HEADER;Autos
+TP_WBALANCE_AUTOITCGREEN;Temperature correlation
+TP_WBALANCE_AUTOOLD;RGB grey
+TP_WBALANCE_AUTO_HEADER;Automatic
TP_WBALANCE_CAMERA;Camera
TP_WBALANCE_CLOUDY;Cloudy
TP_WBALANCE_CUSTOM;Custom
@@ -2405,8 +3431,8 @@ TP_WBALANCE_SOLUX41;Solux 4100K
TP_WBALANCE_SOLUX47;Solux 4700K (vendor)
TP_WBALANCE_SOLUX47_NG;Solux 4700K (Nat. Gallery)
TP_WBALANCE_SPOTWB;Use the pipette to pick the white balance from a neutral patch in the preview.
-TP_WBALANCE_STUDLABEL;Student Itcwb: %1
-TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation\nThe lower the student value, the better the correlation\nValues below 0.002 are excellent\nValues below 0.005 are very good\nValues below 0.01 are good\nValues below 0.05 are good enough\nValues above 0.5 are poor\nVery good Student test results does not mean that the WB is good, if the illuminant is non-standard the results are erratic.\nStudent=1000 means the calculations were not restarted but results are probably goods, use previous results
+TP_WBALANCE_STUDLABEL;Correlation factor: %1
+TP_WBALANCE_STUDLABEL_TOOLTIP;Display calculated Student correlation.\nLower values are better, where <0.005 is excellent,\n<0.01 is good, and >0.5 is poor.\nLow values do not mean that the white balance is good:\nif the illuminant is non-standard the results can be erratic.\nA value of 1000 means previous calculations are used and\nthe resultsare probably good.
TP_WBALANCE_TEMPBIAS;AWB temperature bias
TP_WBALANCE_TEMPBIAS_TOOLTIP;Allows to alter the computation of the "auto white balance"\nby biasing it towards warmer or cooler temperatures. The bias\nis expressed as a percentage of the computed temperature,\nso that the result is given by "computedTemp + computedTemp * bias".
TP_WBALANCE_TEMPERATURE;Temperature
diff --git a/rtdata/themes/RawTherapee-GTK3-20_.css b/rtdata/themes/RawTherapee-GTK3-20_.css
index bdadc00db..76f0004ee 100644
--- a/rtdata/themes/RawTherapee-GTK3-20_.css
+++ b/rtdata/themes/RawTherapee-GTK3-20_.css
@@ -745,6 +745,7 @@ flowboxchild:selected {
background-color: #363636;
}
+#LocallabToolPanel frame,
#ExpanderBox frame,
#ExpanderBox2 frame,
#ExpanderBox3 frame {
@@ -761,18 +762,22 @@ flowboxchild:selected {
padding: 0.25em;
}
+#LocallabToolPanel frame > label, #LocallabToolPanel frame frame > label,
#ExpanderBox frame > label, #ExpanderBox frame frame > label,
#ExpanderBox2 frame > label, #ExpanderBox2 frame frame > label,
#ExpanderBox3 frame > label, #ExpanderBox3 frame frame > label {
margin-left: 7pt;
margin-top: 0;
}
+
+#LocallabToolPanel frame > box, #LocallabToolPanel frame frame > box, #LocallabToolPanel frame > grid, #LocallabToolPanel frame frame > grid,
#ExpanderBox frame > box, #ExpanderBox frame frame > box, #ExpanderBox frame > grid, #ExpanderBox frame frame > grid,
#ExpanderBox2 frame > box, #ExpanderBox2 frame frame > box, #ExpanderBox2 frame > grid, #ExpanderBox2 frame frame > grid,
#ExpanderBox3 frame > box, #ExpanderBox3 frame frame > box, #ExpanderBox3 frame > grid, #ExpanderBox3 frame frame > grid {
margin: 0.1666666666666666em;
}
+#LocallabToolPanel > box > checkbutton, #LocallabToolPanel > box > box, #LocallabToolPanel > grid > checkbutton, #LocallabToolPanel > box > grid, #LocallabToolPanel > grid > grid, #LocallabToolPanel frame > box > grid, #LocallabToolPanel frame > grid > grid, #LocallabToolPanel frame > grid > box,
#ExpanderBox > box > checkbutton, #ExpanderBox > box > box, #ExpanderBox > grid > checkbutton, #ExpanderBox > box > grid, #ExpanderBox > grid > grid, #ExpanderBox frame > box > grid, #ExpanderBox frame > grid > grid, #ExpanderBox frame > grid > box,
#ExpanderBox2 > box > checkbutton, #ExpanderBox2 > box > box, #ExpanderBox2 > grid > checkbutton, #ExpanderBox2 > box > grid, #ExpanderBox2 > grid > grid, #ExpanderBox2 frame > box > grid, #ExpanderBox2 frame > grid > grid, #ExpanderBox2 frame > grid > box,
#ExpanderBox3 > box > checkbutton, #ExpanderBox3 > box > box, #ExpanderBox3 > grid > checkbutton, #ExpanderBox3 > box > grid, #ExpanderBox3 > grid > grid, #ExpanderBox3 frame > box > grid, #ExpanderBox3 frame > grid > grid, #ExpanderBox3 frame > grid > box {
@@ -796,6 +801,7 @@ flowboxchild:selected {
}
/* Sub-tool (MyExpander) background */
+#LocallabToolPanel > box, #LocallabToolPanel > grid,
#ExpanderBox2 > box, #ExpanderBox2 > grid {
background-color: #3B3B3B;
border: 0.0833333333333333em solid #2A2A2A;
@@ -804,10 +810,12 @@ flowboxchild:selected {
padding: 0.25em;
}
+#LocallabToolPanel drawingarea,
#ExpanderBox2 drawingarea {
background-color: #3B3B3B;
}
+#LocallabToolPanel frame > border,
#ExpanderBox2 frame > border {
background-color: #414141;
border: 0.0833333333333333em solid #373737;
@@ -816,10 +824,12 @@ flowboxchild:selected {
padding: 0.25em;
}
+#LocallabToolPanel frame drawingarea,
#ExpanderBox2 frame drawingarea {
background-color: #414141;
}
+#LocallabToolPanel frame frame > border,
#ExpanderBox2 frame frame > border {
background-color: #474747;
border: 0.0833333333333333em solid #3D3D3D;
@@ -828,6 +838,7 @@ flowboxchild:selected {
padding: 0.25em;
}
+#LocallabToolPanel frame frame drawingarea,
#ExpanderBox2 frame frame drawingarea {
background-color: #474747;
}
@@ -854,7 +865,7 @@ flowboxchild:selected {
color: #D8D8D8;
}
-#ExpanderBox2 separator, #ExpanderBox3 separator {
+#LocallabToolPanel separator, #ExpanderBox2 separator, #ExpanderBox3 separator {
color: #292929;
}
diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt
index 749c31210..d3634f3d0 100644
--- a/rtengine/CMakeLists.txt
+++ b/rtengine/CMakeLists.txt
@@ -117,7 +117,9 @@ set(RTENGINESOURCEFILES
impulse_denoise.cc
init.cc
ipdehaze.cc
+ ipgrain.cc
iplab2rgb.cc
+ iplocallab.cc
iplabregions.cc
iplocalcontrast.cc
ipresize.cc
diff --git a/rtengine/EdgePreservingDecomposition.cc b/rtengine/EdgePreservingDecomposition.cc
index 04459e88a..34ac2440b 100644
--- a/rtengine/EdgePreservingDecomposition.cc
+++ b/rtengine/EdgePreservingDecomposition.cc
@@ -916,7 +916,7 @@ void EdgePreservingDecomposition::CompressDynamicRange(float *Source, float Scal
float temp;
if(DetailBoost > 0.f) {
- float betemp = expf(-(2.f - DetailBoost + 0.694f)) - 1.f; //0.694 = log(2)
+ float betemp = expf(-(2.f - DetailBoost + 0.693147f)) - 1.f; //0.694 = log(2)
temp = 1.2f * xlogf( -betemp);
} else {
temp = CompressionExponent - 1.0f;
@@ -939,7 +939,7 @@ void EdgePreservingDecomposition::CompressDynamicRange(float *Source, float Scal
cev = xexpf(LVFU(Source[i]) + LVFU(u[i]) * (tempv)) - epsv;
uev = xexpf(LVFU(u[i])) - epsv;
sourcev = xexpf(LVFU(Source[i])) - epsv;
- _mm_storeu_ps( &Source[i], cev + DetailBoostv * (sourcev - uev) );
+ _mm_storeu_ps( &Source[i], cev + DetailBoostv * (sourcev - uev));
}
}
diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc
index 894c72ce2..fca26987f 100644
--- a/rtengine/FTblockDN.cc
+++ b/rtengine/FTblockDN.cc
@@ -43,7 +43,6 @@
#include "procparams.h"
#include "rt_math.h"
#include "sleef.h"
-
#include "../rtgui/threadutils.h"
#include "../rtgui/options.h"
@@ -483,11 +482,9 @@ enum nrquality {QUALITY_STANDARD, QUALITY_HIGH};
void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagefloat * dst, Imagefloat * calclum, float * ch_M, float *max_r, float *max_b, bool isRAW, const procparams::DirPyrDenoiseParams & dnparams, const double expcomp, const NoiseCurve & noiseLCurve, const NoiseCurve & noiseCCurve, float &nresi, float &highresi)
{
BENCHFUN
-//#ifdef _DEBUG
MyTime t1e, t2e;
t1e.set();
-//#endif
if (dnparams.luma == 0 && dnparams.chroma == 0 && !dnparams.median && !noiseLCurve && !noiseCCurve) {
//nothing to do; copy src to dst or do nothing in case src == dst
if (src != dst) {
@@ -549,7 +546,7 @@ BENCHFUN
const float noisevarL = (useNoiseLCurve && (denoiseMethodRgb || !isRAW)) ? SQR(((noiseluma + 1.f) / 125.f) * (10.f + (noiseluma + 1.f) / 25.f)) : SQR((noiseluma / 125.f) * (1.f + noiseluma / 25.f));
const bool denoiseLuminance = (noisevarL > 0.00001f);
- //printf("NL=%f \n",noisevarL);
+// printf("NL=%f \n",noisevarL);
if (useNoiseLCurve || useNoiseCCurve) {
int hei = calclum->getHeight();
int wid = calclum->getWidth();
@@ -955,13 +952,8 @@ BENCHFUN
labdn->b[i1][j1] = B_ < 65535.f ? gamcurve[B_] : Color::gammanf(B_ / 65535.f, gam) * 32768.f;
if (((i1 | j1) & 1) == 0) {
- if (numTries == 1) {
- noisevarlum[(i1 >> 1) * width2 + (j1 >> 1)] = useNoiseLCurve ? lumcalc[i >> 1][j >> 1] : noisevarL;
- noisevarchrom[(i1 >> 1) * width2 + (j1 >> 1)] = useNoiseCCurve ? maxNoiseVarab * ccalc[i >> 1][j >> 1] : 1.f;
- } else {
- noisevarlum[(i1 >> 1) * width2 + (j1 >> 1)] = lumcalc[i >> 1][j >> 1];
- noisevarchrom[(i1 >> 1) * width2 + (j1 >> 1)] = ccalc[i >> 1][j >> 1];
- }
+ noisevarlum[(i1 >> 1) * width2 + (j1 >> 1)] = useNoiseLCurve ? lumcalc[i >> 1][j >> 1] : noisevarL;
+ noisevarchrom[(i1 >> 1) * width2 + (j1 >> 1)] = useNoiseCCurve ? maxNoiseVarab * ccalc[i >> 1][j >> 1] : 1.f;
}
//end chroma
@@ -993,13 +985,8 @@ BENCHFUN
labdn->b[i1][j1] = (Y - Z);
if (((i1 | j1) & 1) == 0) {
- if (numTries == 1) {
- noisevarlum[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseLCurve ? lumcalc[i >> 1][j >> 1] : noisevarL;
- noisevarchrom[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseCCurve ? maxNoiseVarab * ccalc[i >> 1][j >> 1] : 1.f;
- } else {
- noisevarlum[(i1 >> 1)*width2 + (j1 >> 1)] = lumcalc[i >> 1][j >> 1];
- noisevarchrom[(i1 >> 1)*width2 + (j1 >> 1)] = ccalc[i >> 1][j >> 1];
- }
+ noisevarlum[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseLCurve ? lumcalc[i >> 1][j >> 1] : noisevarL;
+ noisevarchrom[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseCCurve ? maxNoiseVarab * ccalc[i >> 1][j >> 1] : 1.f;
}
}
}
@@ -1111,9 +1098,6 @@ BENCHFUN
}
if (execwavelet) {//gain time if user choose only median sliders L <=1 slider chrom master < 1
- wavelet_decomposition* Ldecomp;
- wavelet_decomposition* adecomp;
-
int levwav = 5;
float maxreal = max(realred, realblue);
@@ -1154,9 +1138,9 @@ BENCHFUN
levwav = min(maxlev2, levwav);
// if (settings->verbose) printf("levwavelet=%i noisevarA=%f noisevarB=%f \n",levwav, noisevarab_r, noisevarab_b);
- Ldecomp = new wavelet_decomposition(labdn->L[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels));
+ const std::unique_ptr Ldecomp(new wavelet_decomposition(labdn->L[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)));
- if (Ldecomp->memoryAllocationFailed) {
+ if (Ldecomp->memory_allocation_failed()) {
memoryAllocationFailed = true;
}
@@ -1175,7 +1159,7 @@ BENCHFUN
int Wlvl_L = Ldecomp->level_W(lvl);
int Hlvl_L = Ldecomp->level_H(lvl);
- float ** WavCoeffs_L = Ldecomp->level_coeffs(lvl);
+ const float* const* WavCoeffs_L = Ldecomp->level_coeffs(lvl);
if (!denoiseMethodRgb) {
madL[lvl][dir - 1] = SQR(Mad(WavCoeffs_L[dir], Wlvl_L * Hlvl_L));
@@ -1192,9 +1176,9 @@ BENCHFUN
float chmaxresid = 0.f;
float chmaxresidtemp = 0.f;
- adecomp = new wavelet_decomposition(labdn->a[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels));
+ std::unique_ptr adecomp(new wavelet_decomposition(labdn->a[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)));
- if (adecomp->memoryAllocationFailed) {
+ if (adecomp->memory_allocation_failed()) {
memoryAllocationFailed = true;
}
@@ -1226,12 +1210,12 @@ BENCHFUN
adecomp->reconstruct(labdn->a[0]);
}
- delete adecomp;
+ adecomp.reset();
if (!memoryAllocationFailed) {
- wavelet_decomposition* bdecomp = new wavelet_decomposition(labdn->b[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels));
+ std::unique_ptr bdecomp(new wavelet_decomposition(labdn->b[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)));
- if (bdecomp->memoryAllocationFailed) {
+ if (bdecomp->memory_allocation_failed()) {
memoryAllocationFailed = true;
}
@@ -1266,7 +1250,7 @@ BENCHFUN
bdecomp->reconstruct(labdn->b[0]);
}
- delete bdecomp;
+ bdecomp.reset();
if (!memoryAllocationFailed) {
if (denoiseLuminance) {
@@ -1306,8 +1290,6 @@ BENCHFUN
}
}
}
-
- delete Ldecomp;
}
if (!memoryAllocationFailed) {
@@ -2035,14 +2017,10 @@ BENCHFUN
delete[] ccalc;
}
-//#ifdef _DEBUG
if (settings->verbose) {
t2e.set();
printf("Denoise performed in %d usec:\n", t2e.etime(t1e));
}
-
-//#endif
-
}//end of main RGB_denoise
@@ -2194,7 +2172,7 @@ void ImProcFunctions::Noise_residualAB(const wavelet_decomposition &WaveletCoeff
const int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl);
const int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl);
- float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl);
+ const float* const* WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl);
const float madC = SQR(denoiseMethodRgb ? MadRgb(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab) : Mad(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab));
resid += madC;
@@ -2209,12 +2187,12 @@ void ImProcFunctions::Noise_residualAB(const wavelet_decomposition &WaveletCoeff
chmaxresid = maxresid;
}
-bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels)
+bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposition& WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels)
{
int maxlvl = min(WaveletCoeffs_L.maxlevel(), 5);
const float eps = 0.01f;
- if (edge == 1 || edge == 3 || edge == 4) {
+ if (edge == 1 || edge == 3 || edge == 4 || edge == 5) {
maxlvl = 4; //for refine denoise edge wavelet
}
@@ -2260,7 +2238,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W
int Wlvl_L = WaveletCoeffs_L.level_W(lvl);
int Hlvl_L = WaveletCoeffs_L.level_H(lvl);
- float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl);
+ float* const* WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl);
if (lvl == maxlvl - 1) {
// int edge = 0;
@@ -2286,7 +2264,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W
for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) {
nvl[i] = 0.f;
}
- if ((edge == 1 || edge == 2 || edge == 3) && vari) {
+ if ((edge == 1 || edge == 2 || edge == 3 || edge == 5) && vari) {
// nvl = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer
if ((edge == 1 || edge == 3)) {
for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) {
@@ -2294,7 +2272,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W
}
}
- if (edge == 2 || edge == 4) {
+ if (edge == 2 || edge == 4 || edge == 5) {
for (int i = 0; i < Hlvl_L * Wlvl_L; ++i) {
nvl[i] = vari[lvl] * SQR(noisevarlum[i]);
}
@@ -2392,8 +2370,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(const wavelet_decomposition &W
}
-bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels)
-
+bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposition& WaveletCoeffs_L, wavelet_decomposition& WaveletCoeffs_ab, float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels)
{
int maxlvl = WaveletCoeffs_L.maxlevel();
@@ -2449,7 +2426,7 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &
// compute median absolute deviation (MAD) of detail coefficients as robust noise estimator
int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl);
int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl);
- float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl);
+ const float* const* WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl);
if (!denoiseMethodRgb) {
madab[lvl][dir - 1] = SQR(Mad(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab));
@@ -2468,8 +2445,8 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &
int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl);
int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl);
- float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl);
- float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl);
+ float* const* WavCoeffs_L = WaveletCoeffs_L.level_coeffs(lvl);
+ float* const* WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl);
if (lvl == maxlvl - 1) {
ShrinkAllAB(WaveletCoeffs_L, WaveletCoeffs_ab, buffer, lvl, dir, noisevarchrom, noisevar_ab, useNoiseCCurve, autoch, denoiseMethodRgb, madL[lvl], nullptr, 0, madab[lvl], true);
@@ -2563,13 +2540,13 @@ bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(const wavelet_decomposition &
}
-bool ImProcFunctions::WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels)//mod JD
+bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition& WaveletCoeffs_L, float *noisevarlum, float madL[8][3], float * vari, int edge, int denoiseNestedLevels)//mod JD
{
int maxlvl = min(WaveletCoeffs_L.maxlevel(), 5);
- if (edge == 1 || edge == 3) {
+ if (edge == 1 || edge == 3 || edge == 5) {
maxlvl = 4; //for refine denoise edge wavelet
}
@@ -2624,7 +2601,7 @@ bool ImProcFunctions::WaveletDenoiseAllL(const wavelet_decomposition &WaveletCoe
}
-bool ImProcFunctions::WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCoeffs_L, const wavelet_decomposition &WaveletCoeffs_ab,
+bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition& WaveletCoeffs_L, wavelet_decomposition& WaveletCoeffs_ab,
float *noisevarchrom, float madL[8][3], float *variC, int local, float noisevar_ab, const bool useNoiseCCurve, bool autoch, bool denoiseMethodRgb, int denoiseNestedLevels)//mod JD
{
@@ -2688,7 +2665,7 @@ bool ImProcFunctions::WaveletDenoiseAllAB(const wavelet_decomposition &WaveletCo
-void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir,
+void ImProcFunctions::ShrinkAllL(wavelet_decomposition& WaveletCoeffs_L, float **buffer, int level, int dir,
float *noisevarlum, float * madL, float * vari, int edge)
{
@@ -2702,7 +2679,7 @@ void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, f
const int W_L = WaveletCoeffs_L.level_W(level);
const int H_L = WaveletCoeffs_L.level_H(level);
- float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(level);
+ float* const* WavCoeffs_L = WaveletCoeffs_L.level_coeffs(level);
const float mad_L = madL[dir - 1] ;
const float levelFactor = mad_L * 5.f / static_cast(level + 1);
@@ -2713,7 +2690,7 @@ void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, f
nvl[i] = 0.f;
}
- if ((edge == 1 || edge == 2 || edge == 3) && vari) {
+ if ((edge == 1 || edge == 2 || edge == 3 || edge == 5) && vari) {
// nvl = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer
if ((edge == 1 || edge == 3)) {
for (int i = 0; i < W_L * H_L; ++i) {
@@ -2721,7 +2698,7 @@ void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, f
}
}
- if (edge == 2 || edge == 4) {
+ if (edge == 2 || edge == 4 || edge == 5) {
for (int i = 0; i < W_L * H_L; ++i) {
nvl[i] = vari[level] * SQR(noisevarlum[i]);
}
@@ -2779,7 +2756,7 @@ void ImProcFunctions::ShrinkAllL(const wavelet_decomposition &WaveletCoeffs_L, f
}
-void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition & WaveletCoeffs_L, const wavelet_decomposition & WaveletCoeffs_ab, float **buffer, int level, int dir,
+void ImProcFunctions::ShrinkAllAB(wavelet_decomposition& WaveletCoeffs_L, wavelet_decomposition& WaveletCoeffs_ab, float **buffer, int level, int dir,
float * noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch,
bool denoiseMethodRgb, float * madL, float * variC, int local, float * madaab, bool madCalculated)
@@ -2798,8 +2775,8 @@ void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition & WaveletCoeffs_L,
int W_ab = WaveletCoeffs_ab.level_W(level);
int H_ab = WaveletCoeffs_ab.level_H(level);
- float ** WavCoeffs_L = WaveletCoeffs_L.level_coeffs(level);
- float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(level);
+ float* const* WavCoeffs_L = WaveletCoeffs_L.level_coeffs(level);
+ float* const* WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(level);
float madab;
float mad_L = madL[dir - 1];
@@ -2918,7 +2895,7 @@ void ImProcFunctions::ShrinkAllAB(const wavelet_decomposition & WaveletCoeffs_L,
delete [] nvc;
}
-void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** WavCoeffs_b,
+void ImProcFunctions::ShrinkAll_info(const float* const* WavCoeffs_a, const float* const* WavCoeffs_b,
int W_ab, int H_ab, float **noisevarlum, float **noisevarchrom, float **noisevarhue, float & chaut, int &Nb, float & redaut, float & blueaut,
float & maxredaut, float & maxblueaut, float & minredaut, float & minblueaut, int schoice, int lvl, float & chromina, float & sigma, float & lumema, float & sigma_L, float & redyel, float & skinc, float & nsknc,
float & maxchred, float & maxchblue, float & minchred, float & minchblue, int &nb, float & chau, float & chred, float & chblue, bool denoiseMethodRgb)
@@ -3048,8 +3025,8 @@ void ImProcFunctions::WaveletDenoiseAll_info(int levwav, const wavelet_decomposi
int Wlvl_ab = WaveletCoeffs_a.level_W(lvl);
int Hlvl_ab = WaveletCoeffs_a.level_H(lvl);
- float ** WavCoeffs_a = WaveletCoeffs_a.level_coeffs(lvl);
- float ** WavCoeffs_b = WaveletCoeffs_b.level_coeffs(lvl);
+ const float* const* WavCoeffs_a = WaveletCoeffs_a.level_coeffs(lvl);
+ const float* const* WavCoeffs_b = WaveletCoeffs_b.level_coeffs(lvl);
ShrinkAll_info(WavCoeffs_a, WavCoeffs_b, Wlvl_ab, Hlvl_ab,
noisevarlum, noisevarchrom, noisevarhue, chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut,
diff --git a/rtengine/camconst.json b/rtengine/camconst.json
index 5fc7d4062..6e686c2f1 100644
--- a/rtengine/camconst.json
+++ b/rtengine/camconst.json
@@ -430,6 +430,7 @@ Camera constants:
{ // Quality B, some intermediate ISO samples missing, LENR samples missing so White Levels not properly indicated, some aperture scaling missing
"make_model": "Canon EOS 5D Mark IV",
+ "global_green_equilibration" : true,
"dcraw_matrix": [ 6446,-366,-864,-4436,12204,2513,-952,2496,6348 ], // DNG_V9.7 D65
"raw_crop": [ 136, 42, 6740, 4500 ], // full size 6880x4544, official crop 148,54,6867,4533
"masked_areas": [ 54, 4, 4534, 132 ],
@@ -1295,12 +1296,6 @@ Camera constants:
"ranges": { "white": 16100 }
},
- { // Quality C
- "make_model": [ "FUJIFILM X100V", "FUJIFILM X-T4" ],
- "dcraw_matrix": [ 13426,-6334,-1177,-4244,12136,2371,-580,1303,5980 ], // DNG_v12.2 D65
- "raw_crop": [ 0, 5, 6252, 4140 ]
- },
-
{ // Quality C
"make_model": "Fujifilm X10",
"ranges": { "white": 3788 }
@@ -1384,7 +1379,7 @@ Camera constants:
},
{ // Quality C, only raw crop
- "make_model": [ "FUJIFILM X-T3", "FUJIFILM X-T30", "FUJIFILM X-PRO3" ],
+ "make_model": [ "FUJIFILM X-T3", "FUJIFILM X-T30", "FUJIFILM X-PRO3", "FUJIFILM X100V", "FUJIFILM X-T4" ],
"dcraw_matrix": [ 13426,-6334,-1177,-4244,12136,2371,-580,1303,5980 ], // DNG_v11, standard_v2 d65
"raw_crop": [ 0, 5, 6252, 4176]
},
diff --git a/rtengine/canon_cr3_decoder.cc b/rtengine/canon_cr3_decoder.cc
index d9a10900c..f9850189c 100644
--- a/rtengine/canon_cr3_decoder.cc
+++ b/rtengine/canon_cr3_decoder.cc
@@ -3042,11 +3042,11 @@ bool crxSetupImageData(
void crxFreeImageData(CrxImage* img)
{
- CrxTile* tile = img->tiles;
- const int nTiles = img->tileRows * img->tileCols;
-
if (img->tiles) {
- for (std::int32_t curTile = 0; curTile < nTiles; curTile++, tile++) {
+ CrxTile* const tile = img->tiles;
+ const int nTiles = img->tileRows * img->tileCols;
+
+ for (std::int32_t curTile = 0; curTile < nTiles; ++curTile) {
if (tile[curTile].comps) {
for (std::int32_t curPlane = 0; curPlane < img->nPlanes; ++curPlane) {
crxFreeSubbandData(img, tile[curTile].comps + curPlane);
diff --git a/rtengine/ciecam02.cc b/rtengine/ciecam02.cc
index 208ed4366..c591bcb2c 100644
--- a/rtengine/ciecam02.cc
+++ b/rtengine/ciecam02.cc
@@ -22,11 +22,6 @@
#include
#include "sleef.h"
-#ifdef _DEBUG
-#include "settings.h"
-#include
-#endif
-
#undef CLIPD
#define CLIPD(a) ((a)>0.f?((a)<1.f?(a):1.f):0.f)
#define MAXR(a,b) ((a) > (b) ? (a) : (b))
@@ -420,13 +415,6 @@ void Ciecam02::initcam1float (float yb, float pilotd, float f, float la, float x
aw = achromatic_response_to_whitefloat ( xw, yw, zw, d, fl, nbb);
wh = ( 4.0f / c ) * ( aw + 4.0f ) * pow_F ( fl, 0.25f );
pfl = pow_F ( fl, 0.25f );
-#ifdef _DEBUG
-
- if (settings->verbose) {
- printf ("Source float d=%f aw=%f fl=%f wh=%f c=%f awc=%f\n", d, aw, fl, wh, c, (4.f / c) * (aw + 4.f));
- }
-
-#endif
}
void Ciecam02::initcam2float (float yb, float pilotd, float f, float la, float xw, float yw, float zw, float &n, float &d, float &nbb, float &ncb,
@@ -445,13 +433,6 @@ void Ciecam02::initcam2float (float yb, float pilotd, float f, float la, float x
nbb = ncb = 0.725f * pow_F ( 1.0f / n, 0.2f );
cz = 1.48f + sqrt ( n );
aw = achromatic_response_to_whitefloat ( xw, yw, zw, d, fl, nbb);
-#ifdef _DEBUG
-
- if (settings->verbose) {
- printf ("Viewing float d=%f aw=%f fl=%f n=%f\n", d, aw, fl, n);
- }
-
-#endif
}
void Ciecam02::xyz2jchqms_ciecam02float ( float &J, float &C, float &h, float &Q, float &M, float &s, float aw, float fl, float wh,
diff --git a/rtengine/color.cc b/rtengine/color.cc
index 89be69e9d..11668451e 100644
--- a/rtengine/color.cc
+++ b/rtengine/color.cc
@@ -25,10 +25,6 @@
#include "opthelper.h"
#include "iccstore.h"
-#ifdef _DEBUG
-#include "mytime.h"
-#endif
-
using namespace std;
namespace rtengine
@@ -45,6 +41,9 @@ LUTf Color::igammatab_srgb;
LUTf Color::igammatab_srgb1;
LUTf Color::gammatab_srgb;
LUTf Color::gammatab_srgb1;
+LUTf Color::gammatab_srgb327;
+LUTf Color::gammatab_bt709;
+LUTf Color::igammatab_bt709;
LUTf Color::denoiseGammaTab;
LUTf Color::denoiseIGammaTab;
@@ -103,20 +102,6 @@ LUTf Color::_10GY30, Color::_10GY40, Color::_10GY50, Color::_10GY60, Color::_10G
LUTf Color::_75GY30, Color::_75GY40, Color::_75GY50, Color::_75GY60, Color::_75GY70, Color::_75GY80;
LUTf Color::_5GY30, Color::_5GY40, Color::_5GY50, Color::_5GY60, Color::_5GY70, Color::_5GY80;
-#ifdef _DEBUG
-MunsellDebugInfo::MunsellDebugInfo()
-{
- reinitValues();
-}
-void MunsellDebugInfo::reinitValues()
-{
- maxdhue[0] = maxdhue[1] = maxdhue[2] = maxdhue[3] = 0.0f;
- maxdhuelum[0] = maxdhuelum[1] = maxdhuelum[2] = maxdhuelum[3] = 0.0f;
- depass = depassLum = 0;
-}
-#endif
-
-
void Color::init ()
{
@@ -130,9 +115,12 @@ void Color::init ()
gammatabThumb(maxindex, 0);
igammatab_srgb(maxindex, 0);
+ igammatab_bt709(maxindex, 0);
igammatab_srgb1(maxindex, 0);
gammatab_srgb(maxindex, 0);
+ gammatab_bt709(maxindex, 0);
gammatab_srgb1(maxindex, 0);
+ gammatab_srgb327(32768, 0);
denoiseGammaTab(maxindex, 0);
denoiseIGammaTab(maxindex, 0);
@@ -197,6 +185,18 @@ void Color::init ()
}
#ifdef _OPENMP
#pragma omp section
+#endif
+ {
+ for (int i = 0; i < 32768; i++)
+ {
+ gammatab_srgb327[i] = gamma2(i / 32767.0);
+ }
+
+ gammatab_srgb327 *= 32767.f;
+ // gamma2curve.share(gammatab_srgb, LUT_CLIP_BELOW | LUT_CLIP_ABOVE); // shares the buffer with gammatab_srgb but has different clip flags
+ }
+#ifdef _OPENMP
+ #pragma omp section
#endif
{
for (int i = 0; i < maxindex; i++)
@@ -206,6 +206,7 @@ void Color::init ()
igammatab_srgb *= 65535.f;
}
+
#ifdef _OPENMP
#pragma omp section
#endif
@@ -282,6 +283,22 @@ void Color::init ()
break;
}
+#ifdef _OPENMP
+ #pragma omp section
+#endif
+
+ for (int i = 0; i < maxindex; i++) {
+ gammatab_bt709[i] = 65535.0 * gamma709(i / 65535.0);
+ }
+
+#ifdef _OPENMP
+ #pragma omp section
+#endif
+
+ for (int i = 0; i < maxindex; i++) {
+ igammatab_bt709[i] = 65535.0 * igamma709(i / 65535.0);
+ }
+
#ifdef _OPENMP
#pragma omp section
#endif
@@ -1421,15 +1438,7 @@ void Color::interpolateRGBColor (const float balance, const float r1, const floa
Color::Lab2Lch(a_1, b_1, c1, h1);
Lr = L1 / 327.68f; //for gamutlch
//gamut control on r1 g1 b1
-#ifndef NDEBUG
- bool neg = false;
- bool more_rgb = false;
-
- //gamut control : Lab values are in gamut
- Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f, neg, more_rgb);
-#else
Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f);
-#endif
L1 = Lr * 327.68f;
@@ -1440,14 +1449,7 @@ void Color::interpolateRGBColor (const float balance, const float r1, const floa
Lr = L2 / 327.68f; //for gamutlch
//gamut control on r2 g2 b2
-#ifndef NDEBUG
- neg = false;
- more_rgb = false;
- //gamut control : Lab values are in gamut
- Color::gamutLchonly(h2, Lr, c2, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f, neg, more_rgb);
-#else
Color::gamutLchonly(h2, Lr, c2, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f);
-#endif
L2 = Lr * 327.68f;
// interpolating Lch values
@@ -1477,15 +1479,8 @@ void Color::interpolateRGBColor (const float balance, const float r1, const floa
// here I have put gamut control with gamutlchonly on final process
Lr = L1 / 327.68f; //for gamutlch
-#ifndef NDEBUG
- neg = false;
- more_rgb = false;
- //gamut control : Lab values are in gamut
- Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f, neg, more_rgb);
-#else
//gamut control : Lab values are in gamut
Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f);
-#endif
//convert CH ==> ab
L1 = Lr * 327.68f;
@@ -2264,11 +2259,7 @@ void Color::transitred (const float HH, float const Chprov1, const float dred, c
* float correctlum : correction Hue for luminance (brigtness, contrast,...)
* MunsellDebugInfo* munsDbgInfo: (Debug target only) object to collect information.
*/
-#ifdef _DEBUG
-void Color::AllMunsellLch(bool lumaMuns, float Lprov1, float Loldd, float HH, float Chprov1, float CC, float &correctionHuechroma, float &correctlum, MunsellDebugInfo* munsDbgInfo)
-#else
void Color::AllMunsellLch(bool lumaMuns, float Lprov1, float Loldd, float HH, float Chprov1, float CC, float &correctionHuechroma, float &correctlum)
-#endif
{
bool contin1, contin2;
@@ -2292,22 +2283,6 @@ void Color::AllMunsellLch(bool lumaMuns, float Lprov1, float Loldd, float HH, fl
contin1 = contin2 = false;
correctL = false;
MunsellLch (Lprov1, HH, Chprov1, CC, correctionHue, zo, correctionHueLum, correctL); //munsell chroma correction
-#ifdef _DEBUG
- float absCorrectionHue = fabs(correctionHue);
-
- if(correctionHue != 0.0) {
- int idx = zo - 1;
- #pragma omp critical (maxdhue)
- {
- munsDbgInfo->maxdhue[idx] = MAX(munsDbgInfo->maxdhue[idx], absCorrectionHue);
- }
- }
-
- if(absCorrectionHue > 0.45)
- #pragma omp atomic
- munsDbgInfo->depass++; //verify if no bug in calculation
-
-#endif
correctionHuechroma = correctionHue; //preserve
if(lumaMuns) {
@@ -2339,46 +2314,11 @@ void Color::AllMunsellLch(bool lumaMuns, float Lprov1, float Loldd, float HH, fl
if(contin1 && contin2) {
correctlum = correctlumprov2 - correctlumprov;
}
-
-#ifdef _DEBUG
- float absCorrectLum = fabs(correctlum);
-
- if(correctlum != 0.0) {
- int idx = zo - 1;
- #pragma omp critical (maxdhuelum)
- {
- munsDbgInfo->maxdhuelum[idx] = MAX(munsDbgInfo->maxdhuelum[idx], absCorrectLum);
- }
- }
-
- if(absCorrectLum > 0.35)
- #pragma omp atomic
- munsDbgInfo->depassLum++; //verify if no bug in calculation
-
-#endif
}
}
}
}
-
}
-
-#ifdef _DEBUG
-
- if (correctlum < -0.35f) {
- correctlum = -0.35f;
- } else if(correctlum > 0.35f) {
- correctlum = 0.35f;
- }
-
- if (correctionHuechroma < -0.45f) {
- correctionHuechroma = -0.45f;
- } else if(correctionHuechroma > 0.45f) {
- correctionHuechroma = 0.45f;
- }
-
-#endif
-
}
/*
@@ -2437,17 +2377,10 @@ void Color::AllMunsellLch(float Lprov1, float HH, float Chprov1, float CC, float
* float coef : a float number between [0.95 ; 1.0[... the nearest it is from 1.0, the more precise it will be... and the longer too as more iteration will be necessary)
* bool neg and moreRGB : only in DEBUG mode to calculate iterations for negatives values and > 65535
*/
-#ifdef _DEBUG
-void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef, bool &neg, bool &more_rgb)
-#else
void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef)
-#endif
{
const float ClipLevel = 65535.0f;
bool inGamut;
-#ifdef _DEBUG
- neg = false, more_rgb = false;
-#endif
float2 sincosval = xsincosf(HH);
do {
@@ -2471,10 +2404,6 @@ void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, flo
// gamut control before saturation to put Lab values in future gamut, but not RGB
if (R < 0.0f || G < 0.0f || B < 0.0f) {
-#ifdef _DEBUG
- neg = true;
-#endif
-
if (Lprov1 < 0.1f) {
Lprov1 = 0.1f;
}
@@ -2520,10 +2449,6 @@ void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, flo
} else if (!isHLEnabled && rtengine::max(R, G, B) > ClipLevel && rtengine::min(R, G, B) <= ClipLevel) {
// if "highlight reconstruction" is enabled or the point is completely white (clipped, no color), don't control Gamut
-#ifdef _DEBUG
- more_rgb = true;
-#endif
-
if (Lprov1 > 99.999f) {
Lprov1 = 99.98f;
}
@@ -2558,17 +2483,10 @@ void Color::gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, flo
* float coef : a float number between [0.95 ; 1.0[... the nearest it is from 1.0, the more precise it will be... and the longer too as more iteration will be necessary)
* bool neg and moreRGB : only in DEBUG mode to calculate iterations for negatives values and > 65535
*/
-#ifdef _DEBUG
-void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef, bool &neg, bool &more_rgb)
-#else
void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef)
-#endif
{
constexpr float ClipLevel = 65535.0f;
bool inGamut;
-#ifdef _DEBUG
- neg = false, more_rgb = false;
-#endif
float ChprovSave = Chprov1;
do {
@@ -2590,9 +2508,6 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr
// gamut control before saturation to put Lab values in future gamut, but not RGB
if (R < 0.0f || G < 0.0f || B < 0.0f) {
-#ifdef _DEBUG
- neg = true;
-#endif
if (isnan(HH)) {
float atemp = ChprovSave * sincosval.y * 327.68;
@@ -2645,10 +2560,6 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr
} else if (!isHLEnabled && rtengine::max(R, G, B) > ClipLevel && rtengine::min(R, G, B) <= ClipLevel) {
// if "highlight reconstruction" is enabled or the point is completely white (clipped, no color), don't control Gamut
-#ifdef _DEBUG
- more_rgb = true;
-#endif
-
if (Lprov1 > 99.999f) {
Lprov1 = 99.98f;
}
@@ -2770,17 +2681,10 @@ void Color::gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chpr
}
-#ifdef _DEBUG
-void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const float wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef, bool &neg, bool &more_rgb)
-#else
void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const float wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef)
-#endif
{
const float ClipLevel = 65535.0f;
bool inGamut;
-#ifdef _DEBUG
- neg = false, more_rgb = false;
-#endif
do {
inGamut = true;
@@ -2804,10 +2708,6 @@ void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const
// gamut control before saturation to put Lab values in future gamut, but not RGB
if (R < 0.0f || G < 0.0f || B < 0.0f) {
-#ifdef _DEBUG
- neg = true;
-#endif
-
if (Lprov1 < 0.01f) {
Lprov1 = 0.01f;
}
@@ -2822,10 +2722,6 @@ void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const
} else if (!isHLEnabled && rtengine::max(R, G, B) > ClipLevel && rtengine::min(R, G, B) <= ClipLevel) {
// if "highlight reconstruction" is enabled or the point is completely white (clipped, no color), don't control Gamut
-#ifdef _DEBUG
- more_rgb = true;
-#endif
-
if (Lprov1 > 99.999f) {
Lprov1 = 99.98f;
}
@@ -2865,17 +2761,6 @@ void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const
*/
void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N, bool corMunsell, bool lumaMuns, bool isHLEnabled, bool gamut, const double wip[3][3])
{
-#ifdef _DEBUG
- MyTime t1e, t2e;
- t1e.set();
- int negat = 0, moreRGB = 0;
- MunsellDebugInfo* MunsDebugInfo = nullptr;
-
- if (corMunsell) {
- MunsDebugInfo = new MunsellDebugInfo();
- }
-
-#endif
float correctlum = 0.f;
float correctionHuechroma = 0.f;
#ifdef __SSE2__
@@ -2914,9 +2799,6 @@ void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N,
float2 sincosval;
if(gamut) {
-#ifdef _DEBUG
- bool neg, more_rgb;
-#endif
// According to mathematical laws we can get the sin and cos of HH by simple operations
float R, G, B;
@@ -2929,23 +2811,7 @@ void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N,
}
//gamut control : Lab values are in gamut
-#ifdef _DEBUG
- gamutLchonly(HH, sincosval, Lprov1, Chprov1, R, G, B, wip, isHLEnabled, 0.15f, 0.96f, neg, more_rgb);
-#else
gamutLchonly(HH, sincosval, Lprov1, Chprov1, R, G, B, wip, isHLEnabled, 0.15f, 0.96f);
-#endif
-
-#ifdef _DEBUG
-
- if(neg) {
- negat++;
- }
-
- if(more_rgb) {
- moreRGB++;
- }
-
-#endif
}
labL[j] = Lprov1 * 327.68f;
@@ -2953,12 +2819,7 @@ void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N,
correctlum = 0.f;
if(corMunsell)
-#ifdef _DEBUG
- AllMunsellLch(lumaMuns, Lprov1, Loldd, HH, Chprov1, Coldd, correctionHuechroma, correctlum, MunsDebugInfo);
-
-#else
AllMunsellLch(lumaMuns, Lprov1, Loldd, HH, Chprov1, Coldd, correctionHuechroma, correctlum);
-#endif
if(correctlum == 0.f && correctionHuechroma == 0.f) {
if(!gamut) {
@@ -2979,28 +2840,6 @@ void Color::LabGamutMunsell(float *labL, float *laba, float *labb, const int N,
laba[j] = Chprov1 * sincosval.y * 327.68f;
labb[j] = Chprov1 * sincosval.x * 327.68f;
}
-
-#ifdef _DEBUG
- t2e.set();
-
- if (settings->verbose) {
- printf("Color::LabGamutMunsell (correction performed in %d usec):\n", t2e.etime(t1e));
- printf(" Gamut : G1negat=%iiter G165535=%iiter \n", negat, moreRGB);
-
- if (MunsDebugInfo) {
- printf(" Munsell chrominance: MaxBP=%1.2frad MaxRY=%1.2frad MaxGY=%1.2frad MaxRP=%1.2frad depass=%u\n", MunsDebugInfo->maxdhue[0], MunsDebugInfo->maxdhue[1], MunsDebugInfo->maxdhue[2], MunsDebugInfo->maxdhue[3], MunsDebugInfo->depass);
- printf(" Munsell luminance : MaxBP=%1.2frad MaxRY=%1.2frad MaxGY=%1.2frad MaxRP=%1.2frad depass=%u\n", MunsDebugInfo->maxdhuelum[0] , MunsDebugInfo->maxdhuelum[1], MunsDebugInfo->maxdhuelum[2], MunsDebugInfo->maxdhuelum[3], MunsDebugInfo->depassLum);
- } else {
- printf(" Munsell correction wasn't requested\n");
- }
- }
-
- if (MunsDebugInfo) {
- delete MunsDebugInfo;
- }
-
-#endif
-
}
/*
@@ -3105,11 +2944,6 @@ void Color::SkinSat (float lum, float hue, float chrom, float &satreduc)
*/
void Color::initMunsell ()
{
-#ifdef _DEBUG
- MyTime t1e, t2e;
- t1e.set();
-#endif
-
const int maxInd = 140;
const int maxInd2 = 90;
const int maxInd3 = 50;
@@ -5710,14 +5544,6 @@ void Color::initMunsell ()
//printf("5GY %1.2f %1.2f %1.2f\n",_5GY80[44],_5GY80[84],_5GY80[125] );
-#ifdef _DEBUG
- t2e.set();
-
- if (settings->verbose) {
- printf("Lutf Munsell %d usec\n", t2e.etime(t1e));
- }
-
-#endif
}
}
diff --git a/rtengine/color.h b/rtengine/color.h
index 045e062ad..55ef52e36 100644
--- a/rtengine/color.h
+++ b/rtengine/color.h
@@ -36,23 +36,6 @@ namespace rtengine
typedef std::array GammaValues;
-#ifdef _DEBUG
-
-class MunsellDebugInfo
-{
-public:
- float maxdhuelum[4];
- float maxdhue[4];
- unsigned int depass;
- unsigned int depassLum;
-
- MunsellDebugInfo();
- void reinitValues();
-};
-
-#endif
-
-
class Color
{
@@ -162,12 +145,15 @@ public:
static LUTf igammatab_srgb;
static LUTf igammatab_srgb1;
static LUTf gammatab_srgb;
+ static LUTf gammatab_srgb327;
static LUTf gammatab_srgb1;
+ static LUTf gammatab_bt709;
static LUTf denoiseGammaTab;
static LUTf denoiseIGammaTab;
static LUTf igammatab_24_17;
+ static LUTf igammatab_bt709;
static LUTf gammatab_24_17a;
static LUTf gammatab_13_2;
static LUTf igammatab_13_2;
@@ -1150,23 +1136,25 @@ public:
}
- /*
+/*
* @brief Get the gamma value for Gamma=2.2 Slope=4.5
* @param x red, green or blue channel's value [0 ; 1]
* @return the gamma modified's value [0 ; 1]
*
+*/
static inline double gamma709 (double x) {
return x <= 0.0176 ? x*4.5 : 1.0954*exp(log(x)/2.2)-0.0954;
}
-
+/*
* @brief Get the inverse gamma value for Gamma=2.2 Slope=4.5
* @param x red, green or blue channel's value [0 ; 1]
* @return the inverse gamma modified's value [0 ; 1]
*
+*/
static inline double igamma709 (double x) {
return x <= 0.0795 ? x/4.5 : exp(log((x+0.0954)/1.0954)*2.2);
}
- */
+
@@ -1390,11 +1378,7 @@ public:
* @param munsDbgInfo (Debug target only) object to collect information
*/
-#ifdef _DEBUG
- static void AllMunsellLch (bool lumaMuns, float Lprov1, float Loldd, float HH, float Chprov1, float CC, float &correctionHueChroma, float &correctlum, MunsellDebugInfo* munsDbgInfo);
-#else
static void AllMunsellLch (bool lumaMuns, float Lprov1, float Loldd, float HH, float Chprov1, float CC, float &correctionHueChroma, float &correctlum);
-#endif
static void AllMunsellLch (float Lprov1, float HH, float Chprov1, float CC, float &correctionHueChroma);
@@ -1419,15 +1403,9 @@ public:
* @param neg (Debug target only) to calculate iterations for negatives values
* @param moreRGB (Debug target only) to calculate iterations for values >65535
*/
-#ifdef _DEBUG
- static void gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef, bool &neg, bool &more_rgb);
- static void gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef, bool &neg, bool &more_rgb);
- static void gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const float wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef, bool &neg, bool &more_rgb);
-#else
static void gamutLchonly (float HH, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef);
static void gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &R, float &G, float &B, const double wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef);
static void gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const float wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef);
-#endif
static void gamutLchonly (float HH, float2 sincosval, float &Lprov1, float &Chprov1, float &saturation, const float wip[3][3], bool isHLEnabled, float lowerCoef, float higherCoef);
@@ -1494,6 +1472,57 @@ public:
static void skinredfloat ( float J, float h, float sres, float Sp, float dred, float protect_red, int sk, float rstprotection, float ko, float &s);
// static void scaleredcdbl ( float skinprot, float param, float limit, float HH, float deltaHH, float &scale,float &scaleext);
+ static inline void pregamutlab(float lum, float hue, float &chr) //big approximation to limit gamut (Prophoto) before good gamut procedure for locallab chroma, to avoid crash
+ {
+ if (lum >= 95.0f) {
+ if (hue > 1.5f && hue < 2.f) {
+ chr = 120.f;
+ } else if (hue > 0.7f && hue <= 1.5f) {
+ chr = 60.f;
+ } else {
+ chr = 40.f;
+ }
+ } else if (lum > 75.f) {
+ if (hue > 1.f && hue < 3.14f) {
+ chr = 130.f;
+ } else if (hue > -0.4f && hue <= 1.f) {
+ chr = 80.f;
+ } else if (hue > -3.15f && hue < -2.f) {
+ chr = 80.f;
+ } else {
+ chr = 60.f;
+ }
+
+ } else if (lum > 35.f) {
+ chr = 100.f;
+ } else if (lum > 20.f) {
+ if (hue < -1.f && hue > -2.f) {
+ chr = 120.f;
+ } else {
+ chr = 80.f;
+ }
+ } else if (lum > 7.f) {
+ if (hue < -1.f && hue > -1.8f) {
+ chr = 120.f;
+ } else {
+ chr = 60.f;
+ }
+
+ } else {
+ if (hue < -1.f && hue > -1.6f) {
+ chr = 80.f;
+ } else {
+ chr = 40.f;
+ }
+
+ }
+
+ // if(lum < 4.f) {
+ // chr = 0.1f;
+ // }
+ }
+
+
static inline void SkinSatCbdl (float lum, float hue, float chrom, float skinprot, float &scale, bool neg, float b_l, float t_l, float t_r)
{
diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc
index 2780fcc84..417476876 100644
--- a/rtengine/colortemp.cc
+++ b/rtengine/colortemp.cc
@@ -2898,15 +2898,15 @@ void ColorTemp::icieCAT02float(float Xw, float Yw, float Zw, float &iCAM02BB00,
float D = adap / 2.;
//white destination Wd : RT use always D50
- cam_dest[0] = INVCAT02[0][0] * whiteD50p[0] + INVCAT02[0][1] * whiteD50p[1] + INVCAT02[0][2] * whiteD50p[2]; //Cone reponse RoD
+ cam_dest[0] = INVCAT02[0][0] * whiteD50p[0] + INVCAT02[0][1] * whiteD50p[1] + INVCAT02[0][2] * whiteD50p[2]; //Cone response RoD
cam_dest[1] = INVCAT02[1][0] * whiteD50p[0] + INVCAT02[1][1] * whiteD50p[1] + INVCAT02[1][2] * whiteD50p[2]; //GaD
cam_dest[2] = INVCAT02[2][0] * whiteD50p[0] + INVCAT02[2][1] * whiteD50p[1] + INVCAT02[2][2] * whiteD50p[2]; //BeD
//origin white Ws : A, D65, custom, etc.
- cam_orig[0] = INVCAT02[0][0] * Xw + INVCAT02[0][1] * Yw + INVCAT02[0][2] * Zw; //Cone reponse RoS
+ cam_orig[0] = INVCAT02[0][0] * Xw + INVCAT02[0][1] * Yw + INVCAT02[0][2] * Zw; //Cone response RoS
cam_orig[1] = INVCAT02[1][0] * Xw + INVCAT02[1][1] * Yw + INVCAT02[1][2] * Zw;
cam_orig[2] = INVCAT02[2][0] * Xw + INVCAT02[2][1] * Yw + INVCAT02[2][2] * Zw;
-// cam_orig[0] = CAT02[0][0] * Xw + CAT02[0][1] * Yw + CAT02[0][2] * Zw; //Cone reponse RoS
+// cam_orig[0] = CAT02[0][0] * Xw + CAT02[0][1] * Yw + CAT02[0][2] * Zw; //Cone response RoS
// cam_orig[1] = CAT02[1][0] * Xw + CAT02[1][1] * Yw + CAT02[1][2] * Zw;
// cam_orig[2] = CAT02[2][0] * Xw + CAT02[2][1] * Yw + CAT02[2][2] * Zw;
@@ -3624,7 +3624,7 @@ void ColorTemp::tempxy(bool separated, int repref, float **Tx, float **Ty, float
double XX;
double ZZ;
} WbTxyz;
- //probbaly can be "passed" with rawimagesource.cc but I don't know how to do.
+ //probably can be "passed" with rawimagesource.cc but I don't know how to do this.
constexpr WbTxyz Txyz[118] = {//temperature Xwb Zwb 118 values - same table as in Rawimagesource.cc x wb and y wb are calculated after
{2001., 1.273842, 0.145295},
{2101., 1.244008, 0.167533},
diff --git a/rtengine/cplx_wavelet_dec.h b/rtengine/cplx_wavelet_dec.h
index c127a7adf..592bd2f37 100644
--- a/rtengine/cplx_wavelet_dec.h
+++ b/rtengine/cplx_wavelet_dec.h
@@ -33,37 +33,38 @@ class wavelet_decomposition :
public NonCopyable
{
public:
-
- typedef float internal_type;
- float *coeff0;
- bool memoryAllocationFailed;
-
-private:
-
- static const int maxlevels = 10;//should be greater than any conceivable order of decimation
-
- int lvltot, subsamp;
- int m_w, m_h;//dimensions
-
- int wavfilt_len, wavfilt_offset;
- float *wavfilt_anal;
- float *wavfilt_synth;
-
-
- wavelet_level * wavelet_decomp[maxlevels];
-
-public:
+ using internal_type = float;
template
wavelet_decomposition(E * src, int width, int height, int maxlvl, int subsampling, int skipcrop = 1, int numThreads = 1, int Daub4Len = 6);
~wavelet_decomposition();
- internal_type ** level_coeffs(int level) const
+ bool memory_allocation_failed() const
+ {
+ return memoryAllocationFailed;
+ }
+
+ const internal_type* const* level_coeffs(int level) const
{
return wavelet_decomp[level]->subbands();
}
+ internal_type* const* level_coeffs(int level)
+ {
+ return wavelet_decomp[level]->subbands();
+ }
+
+ const internal_type* get_coeff0() const
+ {
+ return coeff0;
+ }
+
+ internal_type* get_coeff0()
+ {
+ return coeff0;
+ }
+
int level_W(int level) const
{
return wavelet_decomp[level]->width();
@@ -88,13 +89,47 @@ public:
{
return subsamp;
}
+
template
void reconstruct(E * dst, const float blend = 1.f);
+
+private:
+ static const int maxlevels = 10; // should be greater than any conceivable order of decimation
+
+ int lvltot;
+ int subsamp;
+ // Dimensions
+ int m_w;
+ int m_h;
+
+ int wavfilt_len;
+ int wavfilt_offset;
+ internal_type* wavfilt_anal;
+ internal_type* wavfilt_synth;
+
+ internal_type* coeff0;
+ bool memoryAllocationFailed;
+
+ wavelet_level* wavelet_decomp[maxlevels];
};
template
-wavelet_decomposition::wavelet_decomposition(E * src, int width, int height, int maxlvl, int subsampling, int skipcrop, int numThreads, int Daub4Len)
- : coeff0(nullptr), memoryAllocationFailed(false), lvltot(0), subsamp(subsampling), m_w(width), m_h(height)
+wavelet_decomposition::wavelet_decomposition(
+ E * src,
+ int width,
+ int height,
+ int maxlvl,
+ int subsampling,
+ int skipcrop,
+ int numThreads,
+ int Daub4Len
+) :
+ lvltot(0),
+ subsamp(subsampling),
+ m_w(width),
+ m_h(height),
+ coeff0(nullptr),
+ memoryAllocationFailed(false)
{
//initialize wavelet filters
@@ -135,6 +170,14 @@ wavelet_decomposition::wavelet_decomposition(E * src, int width, int height, int
//n=0 lopass, n=1 hipass
}
}
+/* } else if(wavfilt_len == 22) {
+ for (int n = 0; n < 2; n++) {
+ for (int i = 0; i < wavfilt_len; i++) {
+ wavfilt_anal[wavfilt_len * (n) + i] = Daub4_anal22[n][i];
+ wavfilt_synth[wavfilt_len * (n) + i] = Daub4_anal22[n][wavfilt_len - 1 - i];
+ //n=0 lopass, n=1 hipass
+ }
+ } */
} else if(wavfilt_len == 4) {
for (int n = 0; n < 2; n++) {
for (int i = 0; i < wavfilt_len; i++) {
@@ -144,7 +187,7 @@ wavelet_decomposition::wavelet_decomposition(E * src, int width, int height, int
}
}
}
-
+//printf("OK cplx\n");
// after coefficient rotation, data structure is:
// wavelet_decomp[scale][channel={lo,hi1,hi2,hi3}][pixel_array]
diff --git a/rtengine/cplx_wavelet_filter_coeffs.h b/rtengine/cplx_wavelet_filter_coeffs.h
index 5d191e50c..3386be8d0 100644
--- a/rtengine/cplx_wavelet_filter_coeffs.h
+++ b/rtengine/cplx_wavelet_filter_coeffs.h
@@ -48,11 +48,14 @@ const float Daub4_anal16[2][16] ALIGNED16 = {//Daub 14
{0.f, 0.f, 0.055049715f, 0.28039564f, 0.515574245f, 0.33218624f, -0.10175691f, -0.158417505f, 0.05042335f, 0.057001725f, -0.026891225f, -0.01171997f, 0.008874895f, 0.0003037575f, -0.0012739524f, 0.0002501134f},
{ -0.0002501134f, -0.0012739524f, -0.0003037575f, 0.008874895f, 0.01171997f , -0.026891225f, -0.057001725f, 0.05042335f, 0.158417505f, -0.10175691f, -0.33218624f, 0.515574245f, -0.28039564f, 0.055049715f, 0.f, 0.f}
};
-/*
-const double Daub4_anal22[2][22] ALIGNED16 = {//Daub 20
- {0., 0., 0.01885858, 0.13306109, 0.37278754, 0.48681406, 0.19881887, -0.1766681, -0.13855494, 0.09006372, 0.0658015, -0.05048328, -0.02082962, 0.0234849, 0.0025502185, -0.0075895, 0.0009866625, 0.0014088433, -0.00048497392, -0.0000823545, 0.00006617718, -0.000009379205},
- {0.000009379205, -0.00006617718, 0.0000823545, 0.00048497392, -0.0014088433, -0.0009866627, 0.0075895, -0.0025502185, -0.0234849, 0.02082962, 0.05048328, -0.0658015, -0.09006372, 0.13855494, 0.1766681, -0.19881887, -0.48681406, -0.37278754, -0.13306109, -0.01885858, 0., 0.}
+
+const float Daub4_anal22[2][22] ALIGNED16 = {//Daub 20
+ {0.f, 0.f, 0.01885858f, 0.13306109f, 0.37278535f, 0.48681406f, 0.19881887f, -0.1766681f, -0.13855494f, 0.09006372f, 0.0658015f, -0.05048328f, -0.02082962f,
+ 0.0234849f, 0.002550218f, -0.0075895f, 0.0009866627f, 0.001408843f, -0.000484973f, -0.0000823545f, 0.0000661271f, -0.00000939f},
+ {0.00000939f, -0.0000661271f, 0.0000823545f, 0.000484973f, -0.001408843f, -0.0009866627f, 0.0075895f, -0.002550218f, -0.0234849f,
+ 0.02082962f, 0.05048328f, -0.0658015f, -0.09006372f, 0.13855494f, 0.1766681f, -0.19881887f, -0.48681406f, -0.37278535f, -0.13306109f, -0.01885858f, 0.f, 0.f}
};
-*/
+
+// if necessary ?? we can add D20 !!
}
diff --git a/rtengine/curves.cc b/rtengine/curves.cc
index 14711c730..7f74467be 100644
--- a/rtengine/curves.cc
+++ b/rtengine/curves.cc
@@ -39,7 +39,6 @@ using namespace std;
namespace rtengine
{
-
bool sanitizeCurve(std::vector& curve)
{
// A curve is valid under one of the following conditions:
@@ -47,19 +46,19 @@ bool sanitizeCurve(std::vector& curve)
// 2) Number of curve entries is > 3 and odd
// 3) curve[0] == DCT_Parametric and curve size is >= 8 and curve[1] .. curve[3] are ordered ascending and are distinct
if (curve.empty()) {
- curve.push_back (DCT_Linear);
+ curve.push_back(DCT_Linear);
return true;
- } else if(curve.size() == 1 && curve[0] != DCT_Linear) {
+ } else if (curve.size() == 1 && curve[0] != DCT_Linear) {
curve[0] = DCT_Linear;
return true;
- } else if((curve.size() % 2 == 0 || curve.size() < 5) && curve[0] != DCT_Parametric) {
+ } else if ((curve.size() % 2 == 0 || curve.size() < 5) && curve[0] != DCT_Parametric) {
curve.clear();
- curve.push_back (DCT_Linear);
+ curve.push_back(DCT_Linear);
return true;
- } else if(curve[0] == DCT_Parametric) {
+ } else if (curve[0] == DCT_Parametric) {
if (curve.size() < 8) {
curve.clear();
- curve.push_back (DCT_Linear);
+ curve.push_back(DCT_Linear);
return true;
} else {
// curve[1] to curve[3] must be ordered ascending and distinct
@@ -73,12 +72,13 @@ bool sanitizeCurve(std::vector& curve)
}
}
}
+
return false;
}
-Curve::Curve () : N(0), ppn(0), x(nullptr), y(nullptr), mc(0.0), mfc(0.0), msc(0.0), mhc(0.0), hashSize(1000 /* has to be initialized to the maximum value */), ypp(nullptr), x1(0.0), y1(0.0), x2(0.0), y2(0.0), x3(0.0), y3(0.0), firstPointIncluded(false), increment(0.0), nbr_points(0) {}
+Curve::Curve() : N(0), ppn(0), x(nullptr), y(nullptr), mc(0.0), mfc(0.0), msc(0.0), mhc(0.0), hashSize(1000 /* has to be initialized to the maximum value */), ypp(nullptr), x1(0.0), y1(0.0), x2(0.0), y2(0.0), x3(0.0), y3(0.0), firstPointIncluded(false), increment(0.0), nbr_points(0) {}
-void Curve::AddPolygons ()
+void Curve::AddPolygons()
{
if (firstPointIncluded) {
poly_x.push_back(x1);
@@ -93,8 +93,8 @@ void Curve::AddPolygons ()
double tr2t = tr * 2 * t;
// adding a point to the polyline
- poly_x.push_back( tr2 * x1 + tr2t * x2 + t2 * x3);
- poly_y.push_back( tr2 * y1 + tr2t * y2 + t2 * y3);
+ poly_x.push_back(tr2 * x1 + tr2t * x2 + t2 * x3);
+ poly_y.push_back(tr2 * y1 + tr2t * y2 + t2 * y3);
}
// adding the last point of the sub-curve
@@ -102,11 +102,11 @@ void Curve::AddPolygons ()
poly_y.push_back(y3);
}
-void Curve::fillDyByDx ()
+void Curve::fillDyByDx()
{
dyByDx.resize(poly_x.size() - 1);
- for(unsigned int i = 0; i < poly_x.size() - 1; i++) {
+ for (unsigned int i = 0; i < poly_x.size() - 1; i++) {
double dx = poly_x[i + 1] - poly_x[i];
double dy = poly_y[i + 1] - poly_y[i];
dyByDx[i] = dy / dx;
@@ -123,7 +123,7 @@ void Curve::fillHash()
double milestone = 0.;
for (unsigned short i = 0; i < (hashSize + 1);) {
- while(poly_x[polyIter] <= milestone) {
+ while (poly_x[polyIter] <= milestone) {
++polyIter;
}
@@ -136,7 +136,7 @@ void Curve::fillHash()
polyIter = 0;
for (unsigned int i = 0; i < hashSize + 1u;) {
- while(poly_x[polyIter] < (milestone + increment)) {
+ while (poly_x[polyIter] < (milestone + increment)) {
++polyIter;
}
@@ -173,7 +173,7 @@ void Curve::fillHash()
* This method return the number of control points of a curve. Not suitable for parametric curves.
* @return number of control points of the curve. 0 will be sent back for Parametric curves
*/
-int Curve::getSize () const
+int Curve::getSize() const
{
return N;
}
@@ -204,11 +204,11 @@ void fillCurveArray(DiagonalCurve* diagCurve, LUTf &outCurve, int skip, bool nee
{
if (needed) {
- for (int i = 0; i <= 0xffff; i += i < 0xffff - skip ? skip : 1 ) {
+ for (int i = 0; i <= 0xffff; i += i < 0xffff - skip ? skip : 1) {
// change to [0,1] range
float val = (float)i / 65535.f;
// apply custom/parametric/NURBS curve, if any
- val = diagCurve->getVal (val);
+ val = diagCurve->getVal(val);
// store result in a temporary array
outCurve[i] = val;
}
@@ -218,8 +218,8 @@ void fillCurveArray(DiagonalCurve* diagCurve, LUTf &outCurve, int skip, bool nee
float skipmul = 1.f / (float) skip;
for (int i = 0; i <= 0x10000 - skip; i += skip) {
- for(int j = 1; j < skip; j++) {
- outCurve[i + j] = ( outCurve[i] * (skip - j) + outCurve[i + skip] * j ) * skipmul;
+ for (int j = 1; j < skip; j++) {
+ outCurve[i + j] = (outCurve[i] * (skip - j) + outCurve[i + skip] * j) * skipmul;
}
}
}
@@ -230,7 +230,7 @@ void fillCurveArray(DiagonalCurve* diagCurve, LUTf &outCurve, int skip, bool nee
}
}
-void CurveFactory::curveLightBrightColor (const std::vector& curvePoints1, const std::vector& curvePoints2, const std::vector& curvePoints3,
+void CurveFactory::curveLightBrightColor(const std::vector& curvePoints1, const std::vector& curvePoints2, const std::vector& curvePoints3,
const LUTu & histogram, LUTu & outBeforeCCurveHistogram,//for Luminance
const LUTu & histogramC, LUTu & outBeforeCCurveHistogramC,//for chroma
ColorAppearance & customColCurve1, ColorAppearance & customColCurve2, ColorAppearance & customColCurve3, int skip)
@@ -289,9 +289,9 @@ void CurveFactory::curveLightBrightColor (const std::vector& curvePoints
}
}
-void CurveFactory::curveBW ( const std::vector& curvePointsbw, const std::vector& curvePointsbw2,
- const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw,//for Luminance
- ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, int skip)
+void CurveFactory::curveBW(const std::vector& curvePointsbw, const std::vector& curvePointsbw2,
+ const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw,//for Luminance
+ ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, int skip)
{
const float gamma_ = Color::sRGBGammaCurve;
@@ -319,7 +319,7 @@ void CurveFactory::curveBW ( const std::vector& curvePointsbw, const std
if (!curvePointsbw.empty() && curvePointsbw[0] > DCT_Linear && curvePointsbw[0] < DCT_Unchanged) {
DiagonalCurve tcurve(curvePointsbw, CURVES_MIN_POLY_POINTS / skip);
- if (outBeforeCCurveHistogrambw ) {
+ if (outBeforeCCurveHistogrambw) {
histNeeded = true;
}
@@ -336,13 +336,13 @@ void CurveFactory::curveBW ( const std::vector& curvePointsbw, const std
}
// add curve Lab : C=f(L)
-void CurveFactory::curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, int skip)
+void CurveFactory::curveCL(bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, int skip)
{
clcutili = false;
std::unique_ptr dCurve;
if (!clcurvePoints.empty() && clcurvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(clcurvePoints, CURVES_MIN_POLY_POINTS / skip));
+ dCurve = std::unique_ptr (new DiagonalCurve(clcurvePoints, CURVES_MIN_POLY_POINTS / skip));
if (dCurve && !dCurve->isIdentity()) {
clcutili = true;
@@ -352,7 +352,7 @@ void CurveFactory::curveCL ( bool & clcutili, const std::vector& clcurve
fillCurveArray(dCurve.get(), clCurve, skip, clcutili);
}
-void CurveFactory::mapcurve ( bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram)
+void CurveFactory::mapcurve(bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram)
{
bool needed = false;
std::unique_ptr dCurve;
@@ -360,7 +360,7 @@ void CurveFactory::mapcurve ( bool & mapcontlutili, const std::vector& m
bool histNeeded = false;
if (!mapcurvePoints.empty() && mapcurvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(mapcurvePoints, CURVES_MIN_POLY_POINTS / skip));
+ dCurve = std::unique_ptr (new DiagonalCurve(mapcurvePoints, CURVES_MIN_POLY_POINTS / skip));
if (outBeforeCurveHistogram) {
histNeeded = true;
@@ -379,7 +379,7 @@ void CurveFactory::mapcurve ( bool & mapcontlutili, const std::vector& m
fillCurveArray(dCurve.get(), mapcurve, skip, needed);
}
-void CurveFactory::curveDehaContL ( bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram)
+void CurveFactory::curveDehaContL(bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram)
{
bool needed = false;
std::unique_ptr dCurve;
@@ -387,7 +387,7 @@ void CurveFactory::curveDehaContL ( bool & dehacontlutili, const std::vector(new DiagonalCurve(dehaclcurvePoints, CURVES_MIN_POLY_POINTS / skip));
+ dCurve = std::unique_ptr (new DiagonalCurve(dehaclcurvePoints, CURVES_MIN_POLY_POINTS / skip));
if (outBeforeCurveHistogram) {
histNeeded = true;
@@ -407,13 +407,13 @@ void CurveFactory::curveDehaContL ( bool & dehacontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve, /*LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip)
+void CurveFactory::curveWavContL(bool & wavcontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve, /*LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip)
{
bool needed = false;
std::unique_ptr dCurve;
if (!wavclcurvePoints.empty() && wavclcurvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(wavclcurvePoints, CURVES_MIN_POLY_POINTS / skip));
+ dCurve = std::unique_ptr (new DiagonalCurve(wavclcurvePoints, CURVES_MIN_POLY_POINTS / skip));
if (dCurve && !dCurve->isIdentity()) {
needed = true;
@@ -425,13 +425,13 @@ void CurveFactory::curveWavContL ( bool & wavcontlutili, const std::vector& curvePoints, LUTf & ToningCurve, int skip)
+void CurveFactory::curveToning(const std::vector& curvePoints, LUTf & ToningCurve, int skip)
{
bool needed = false;
std::unique_ptr dCurve;
if (!curvePoints.empty() && curvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip));
+ dCurve = std::unique_ptr (new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip));
if (dCurve && !dCurve->isIdentity()) {
needed = true;
@@ -441,12 +441,294 @@ void CurveFactory::curveToning ( const std::vector& curvePoints, LUTf &
fillCurveArray(dCurve.get(), ToningCurve, skip, needed);
}
+void CurveFactory::curveLocal(bool & locallutili, const std::vector& curvePoints, LUTf & LocalLCurve, int skip)
+{
+ bool needed = false;
+ std::unique_ptr dCurve;
+
+ if (!curvePoints.empty() && curvePoints[0] != 0) {
+ dCurve = std::unique_ptr (new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip));
+
+ if (dCurve && !dCurve->isIdentity()) {
+ needed = true;
+ locallutili = true;
+ }
+ }
+
+ fillCurveArray(dCurve.get(), LocalLCurve, skip, needed);
+ //LocalLCurve.dump("wav");
+
+}
+
+void CurveFactory::curveCCLocal(bool & localcutili, const std::vector& curvePoints, LUTf & LocalCCurve, int skip)
+{
+ bool needed = false;
+ std::unique_ptr dCurve;
+
+ if (!curvePoints.empty() && curvePoints[0] != 0) {
+ dCurve = std::unique_ptr (new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip));
+
+ if (dCurve && !dCurve->isIdentity()) {
+ needed = true;
+ localcutili = true;
+ }
+ }
+
+ fillCurveArray(dCurve.get(), LocalCCurve, skip, needed);
+ //LocalLCurve.dump("wav");
+
+}
+
+void CurveFactory::curveskLocal(bool & localskutili, const std::vector& curvePoints, LUTf & LocalskCurve, int skip)
+{
+ bool needed = false;
+ std::unique_ptr dCurve;
+
+// if (localskutili && !curvePoints.empty() && curvePoints[0] != 0) {
+ if (!curvePoints.empty() && curvePoints[0] != 0) {
+ dCurve = std::unique_ptr (new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip));
+
+ if (dCurve && !dCurve->isIdentity()) {
+ needed = true;
+ localskutili = true;
+ }
+ }
+
+ fillCurveArray(dCurve.get(), LocalskCurve, skip, needed);
+
+}
+
+void CurveFactory::curveexLocal(bool & localexutili, const std::vector& curvePoints, LUTf & LocalexCurve, int skip)
+{
+ bool needed = false;
+ std::unique_ptr dCurve;
+
+// if (localexutili && !curvePoints.empty() && curvePoints[0] != 0) {
+ if (!curvePoints.empty() && curvePoints[0] != 0) {
+ dCurve = std::unique_ptr (new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip));
+
+ if (dCurve && !dCurve->isIdentity()) {
+ needed = true;
+ localexutili = true;
+ }
+ }
+
+ fillCurveArray(dCurve.get(), LocalexCurve, skip, needed);
+
+}
+
+void CurveFactory::curvemaskLocal(bool & localmaskutili, const std::vector& curvePoints, LUTf & LocalmaskCurve, int skip)
+{
+ bool needed = false;
+ std::unique_ptr dCurve;
+
+// if (localexutili && !curvePoints.empty() && curvePoints[0] != 0) {
+ if (!curvePoints.empty() && curvePoints[0] != 0) {
+ dCurve = std::unique_ptr (new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip));
+
+ if (dCurve && !dCurve->isIdentity()) {
+ needed = true;
+ localmaskutili = true;
+ }
+ }
+
+ fillCurveArray(dCurve.get(), LocalmaskCurve, skip, needed);
+
+}
+
+
+
+void CurveFactory::localLCurve(double br, double contr, /*const std::vector& curvePoints,*/
+ LUTu & histogram, LUTf & outCurve,
+ int skip, bool & utili)
+{
+
+ // curve without contrast
+ LUTf dcurve(65536, 0);
+
+ // clear array that stores histogram valid before applying the custom curve
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ // tone curve base. a: slope (from exp.comp.), b: black, def_mul: max. x value (can be>1), hr,sr: highlight,shadow recovery
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ // check if brightness curve is needed
+ if (br > 0.00001 || br < -0.00001) {
+ utili = true;
+
+ std::vector brightcurvePoints;
+ brightcurvePoints.resize(9);
+ brightcurvePoints.at(0) = double (DCT_NURBS);
+
+ brightcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
+ brightcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range
+
+ if (br > 0) {
+ brightcurvePoints.at(3) = 0.1; // toe point
+ brightcurvePoints.at(4) = 0.1 + br / 150.0; //value at toe point
+
+ brightcurvePoints.at(5) = 0.7; // shoulder point
+ brightcurvePoints.at(6) = min(1.0, 0.7 + br / 300.0); //value at shoulder point
+ } else {
+ brightcurvePoints.at(3) = 0.1 - br / 150.0; // toe point
+ brightcurvePoints.at(4) = 0.1; // value at toe point
+
+ brightcurvePoints.at(5) = min(1.0, 0.7 - br / 300.0); // shoulder point
+ brightcurvePoints.at(6) = 0.7; // value at shoulder point
+ }
+
+ brightcurvePoints.at(7) = 1.; // white point
+ brightcurvePoints.at(8) = 1.; // value at white point
+
+ DiagonalCurve* brightcurve = new DiagonalCurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip);
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ // Applying brightness curve
+ for (int i = 0; i < 32768; i++) { // L values range up to 32767, higher values are for highlight overflow
+
+ // change to [0,1] range
+ float val = (float)i / 32767.0;
+
+ // apply brightness curve
+ val = brightcurve->getVal(val);
+
+ // store result in a temporary array
+ dcurve[i] = val;
+ }
+
+ delete brightcurve;
+ } else {
+ for (int i = 0; i < 32768; i++) { // L values range up to 32767, higher values are for highlight overflow
+ // set the identity curve in the temporary array
+ dcurve[i] = (float)i / 32767.0;
+ }
+ }
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ // check if contrast curve is needed
+ if (contr > 0.00001 || contr < -0.00001) {
+ utili = true;
+
+ DiagonalCurve* contrastcurve = NULL;
+
+ // compute mean luminance of the image with the curve applied
+ int sum = 0;
+ float avg = 0;
+
+ //float sqavg = 0;
+ for (int i = 0; i < 32768; i++) {
+ avg += dcurve[i] * histogram[i];
+ //sqavg += dcurve[i]*dcurve[i] * histogram[i];
+ sum += histogram[i];
+ }
+
+ if (sum) {
+ avg /= sum;
+ //sqavg /= sum;
+ //float stddev = sqrt(sqavg-avg*avg);
+ // printf("avg=%f\n",avg);
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ std::vector contrastcurvePoints;
+ contrastcurvePoints.resize(9);
+ contrastcurvePoints.at(0) = double (DCT_NURBS);
+
+ contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
+ contrastcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range
+
+ contrastcurvePoints.at(3) = avg - avg * (0.6 - contr / 250.0); // toe point
+ contrastcurvePoints.at(4) = avg - avg * (0.6 + contr / 250.0); // value at toe point
+
+ contrastcurvePoints.at(5) = avg + (1 - avg) * (0.6 - contr / 250.0); // shoulder point
+ contrastcurvePoints.at(6) = avg + (1 - avg) * (0.6 + contr / 250.0); // value at shoulder point
+
+ contrastcurvePoints.at(7) = 1.; // white point
+ contrastcurvePoints.at(8) = 1.; // value at white point
+
+ contrastcurve = new DiagonalCurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip);
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ } else {
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ // sum has an invalid value (next to 0, producing a division by zero, so we create a fake contrast curve, producing a white image
+ std::vector contrastcurvePoints;
+ contrastcurvePoints.resize(5);
+ contrastcurvePoints.at(0) = double (DCT_NURBS);
+
+ contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
+ contrastcurvePoints.at(2) = 1.; // black point. Value in [0 ; 1] range
+
+ contrastcurvePoints.at(3) = 1.; // white point
+ contrastcurvePoints.at(4) = 1.; // value at white point
+
+ contrastcurve = new DiagonalCurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip);
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ }
+
+ // apply contrast enhancement
+ for (int i = 0; i < 32768; i++) {
+ dcurve[i] = contrastcurve->getVal(dcurve[i]);
+ }
+
+ delete contrastcurve;
+ }
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ // create a curve if needed
+ /* DiagonalCurve* tcurve = NULL;
+ bool histNeeded = false;
+ if (!curvePoints.empty() && curvePoints[0]!=0) {
+ tcurve = new DiagonalCurve (curvePoints, CURVES_MIN_POLY_POINTS/skip);
+ }
+ if (tcurve && tcurve->isIdentity()) {
+ delete tcurve;
+ tcurve = NULL;
+ }
+
+ if (tcurve) {
+ utili=true;//if active
+
+ // L values go up to 32767, last stop is for highlight overflow
+ for (int i=0; i<32768; i++) {
+ float val;
+ // apply custom/parametric/NURBS curve, if any
+ val = tcurve->getVal (dcurve[i]);
+
+ outCurve[i] = (32767.0 * val);
+ }
+ }
+ else
+ */
+ {
+ // Skip the slow getval method if no curve is used (or an identity curve)
+ // L values go up to 32767, last stop is for highlight overflow
+ for (int i = 0; i < 32768; i++) {
+ outCurve[i] = 32767.0 * dcurve[i];
+ }
+ }
+
+ for (int i = 32768; i < 65536; i++) {
+ outCurve[i] = (float)i;
+ }
+
+ // if (tcurve)
+ // delete tcurve;
+
+}
+
+
+
+
+
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutili, bool & cclutili,
- const std::vector& acurvePoints, const std::vector& bcurvePoints, const std::vector& cccurvePoints,
- const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve,
- int skip)
+void CurveFactory::complexsgnCurve(bool & autili, bool & butili, bool & ccutili, bool & cclutili,
+ const std::vector& acurvePoints, const std::vector& bcurvePoints, const std::vector& cccurvePoints,
+ const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve,
+ int skip)
{
autili = butili = ccutili = cclutili = false;
@@ -454,7 +736,7 @@ void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutil
// create a curve if needed
if (!acurvePoints.empty() && acurvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(acurvePoints, CURVES_MIN_POLY_POINTS / skip));
+ dCurve = std::unique_ptr (new DiagonalCurve(acurvePoints, CURVES_MIN_POLY_POINTS / skip));
if (dCurve && !dCurve->isIdentity()) {
autili = true;
@@ -468,7 +750,7 @@ void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutil
//-----------------------------------------------------
if (!bcurvePoints.empty() && bcurvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(bcurvePoints, CURVES_MIN_POLY_POINTS / skip));
+ dCurve = std::unique_ptr (new DiagonalCurve(bcurvePoints, CURVES_MIN_POLY_POINTS / skip));
if (dCurve && !dCurve->isIdentity()) {
butili = true;
@@ -482,7 +764,7 @@ void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutil
//-----------------------------------------------
if (!cccurvePoints.empty() && cccurvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(cccurvePoints, CURVES_MIN_POLY_POINTS / skip));
+ dCurve = std::unique_ptr (new DiagonalCurve(cccurvePoints, CURVES_MIN_POLY_POINTS / skip));
if (dCurve && !dCurve->isIdentity()) {
ccutili = true;
@@ -496,7 +778,7 @@ void CurveFactory::complexsgnCurve (bool & autili, bool & butili, bool & ccutil
//----------------------------
if (!lccurvePoints.empty() && lccurvePoints[0] != 0) {
- dCurve = std::unique_ptr(new DiagonalCurve(lccurvePoints, CURVES_MIN_POLY_POINTS / skip));
+ dCurve = std::unique_ptr (new DiagonalCurve(lccurvePoints, CURVES_MIN_POLY_POINTS / skip));
if (dCurve && !dCurve->isIdentity()) {
cclutili = true;
@@ -522,13 +804,14 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
// the curve shapes are defined in sRGB gamma, but the output curves will operate on linear floating point data,
// hence we do both forward and inverse gamma conversions here.
const float gamma_ = Color::sRGBGammaCurve;
- const float start = expf(gamma_ * logf( -0.055 / ((1.0 / gamma_ - 1.0) * 1.055 )));
- const float slope = 1.055 * powf (start, 1.0 / gamma_ - 1) - 0.055 / start;
+ const float start = expf(gamma_ * logf(-0.055 / ((1.0 / gamma_ - 1.0) * 1.055)));
+ const float slope = 1.055 * powf(start, 1.0 / gamma_ - 1) - 0.055 / start;
const float mul = 1.055;
const float add = 0.055;
+
// a: slope of the curve, black: starting point at the x axis
- const float a = powf (2.0, ecomp);
+ const float a = powf(2.0, ecomp);
// clear array that stores histogram valid before applying the custom curve
outBeforeCCurveHistogram.clear();
@@ -548,14 +831,14 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
brightcurvePoints[1] = 0.; //black point. Value in [0 ; 1] range
brightcurvePoints[2] = 0.; //black point. Value in [0 ; 1] range
- if(br > 0) {
+ if (br > 0) {
brightcurvePoints[3] = 0.1; //toe point
brightcurvePoints[4] = 0.1 + br / 150.0; //value at toe point
brightcurvePoints[5] = 0.7; //shoulder point
- brightcurvePoints[6] = min(1.0, 0.7 + br / 300.0); //value at shoulder point
+ brightcurvePoints[6] = min(1.0, 0.7 + br / 300.0); //value at shoulder point
} else {
- brightcurvePoints[3] = max(0.0, 0.1 - br / 150.0); //toe point
+ brightcurvePoints[3] = max(0.0, 0.1 - br / 150.0); //toe point
brightcurvePoints[4] = 0.1; //value at toe point
brightcurvePoints[5] = 0.7 - br / 300.0; //shoulder point
@@ -565,12 +848,12 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
brightcurvePoints[7] = 1.; // white point
brightcurvePoints[8] = 1.; // value at white point
- brightcurve = std::unique_ptr(new DiagonalCurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip));
+ brightcurve = std::unique_ptr (new DiagonalCurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip));
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- hlCurve.setClip(LUT_CLIP_BELOW); // used LUT_CLIP_BELOW, because we want to have a baseline of 2^expcomp in this curve. If we don't clip the lut we get wrong values, see Issue 2621 #14 for details
+ hlCurve.setClip(LUT_CLIP_BELOW); // used LUT_CLIP_BELOW, because we want to have a baseline of 2^expcomp in this curve. If we don't clip the lut we get wrong values, see Issue 2621 #14 for details
float exp_scale = a;
float scale = 65536.0;
float comp = (max(0.0, ecomp) + 1.0) * hlcompr / 100.0;
@@ -586,11 +869,11 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
#ifdef __SSE2__
int i = shoulder + 1;
- if(i & 1) { // original formula, slower than optimized formulas below but only used once or none, so I let it as is for reference
+ if (i & 1) { // original formula, slower than optimized formulas below but only used once or none, so I let it as is for reference
// change to [0,1] range
float val = (float)i - shoulder;
float R = val * comp / (scalemshoulder);
- hlCurve[i] = xlog(1.0 + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision
+ hlCurve[i] = xlog(1.0 + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision
i++;
}
@@ -615,7 +898,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
for (int i = shoulder + 1; i < 0x10000; i++) {
// change to [0,1] range
- hlCurve[i] = xlog(1.0 + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision
+ hlCurve[i] = xlog(1.0 + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision
R += increment;
}
@@ -629,7 +912,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
//%%%%%%%%%%%%%%%%%%%%%%%%%%
// change to [0,1] range
- shCurve.setClip(LUT_CLIP_ABOVE); // used LUT_CLIP_ABOVE, because the curve converges to 1.0 at the upper end and we don't want to exceed this value.
+ shCurve.setClip(LUT_CLIP_ABOVE); // used LUT_CLIP_ABOVE, because the curve converges to 1.0 at the upper end and we don't want to exceed this value.
if (black == 0.0) {
shCurve.makeConstant(1.f);
} else {
@@ -709,7 +992,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// apply contrast enhancement
for (int i = 0; i <= 0xffff; i++) {
- dcurve[i] = contrastcurve.getVal (dcurve[i]);
+ dcurve[i] = contrastcurve.getVal(dcurve[i]);
}
}
@@ -726,7 +1009,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
customToneCurve2.Set(tcurve, gamma_);
}
- if (outBeforeCCurveHistogram ) {
+ if (outBeforeCCurveHistogram) {
histNeeded = true;
}
}
@@ -762,7 +1045,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
for (int i = 0; i <= 0xffff; i += 4) {
vfloat valv = LVFU(dcurve[i]);
- valv = igamma (valv, gamma_v, startv, slopev, mulv, addv);
+ valv = igamma(valv, gamma_v, startv, slopev, mulv, addv);
STVFU(outCurve[i], c65535v * valv);
}
@@ -770,7 +1053,7 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
for (int i = 0; i <= 0xffff; i++) {
float val = dcurve[i];
- val = igamma (val, gamma_, start, slope, mul, add);
+ val = igamma(val, gamma_, start, slope, mul, add);
outCurve[i] = (65535.f * val);
}
@@ -788,16 +1071,342 @@ void CurveFactory::complexCurve (double ecomp, double black, double hlcompr, dou
}
+void CurveFactory::Curvelocalhl(double ecomp, double hlcompr, double hlcomprthresh, LUTf & hlCurve)
+{
+
+ // a: slope of the curve
+ const float a = powf(2.0f, ecomp);
+
+
+
+
+ hlCurve.setClip(LUT_CLIP_BELOW); // used LUT_CLIP_BELOW, because we want to have a baseline of 2^expcomp in this curve. If we don't clip the lut we get wrong values, see Issue 2621 #14 for details
+ float exp_scale = a;
+ float maxran = 65536.f;
+ float scale = maxran;
+ float comp = (max(0.0, ecomp) + 1.0) * hlcompr / 100.0;
+ float shoulder = ((scale / max(1.0f, exp_scale)) * (hlcomprthresh / 200.0)) + 0.1;
+
+ if (comp <= 0.0f) {
+ hlCurve.makeConstant(exp_scale);
+ } else {
+ hlCurve.makeConstant(exp_scale, shoulder + 1);
+
+ float scalemshoulder = scale - shoulder;
+
+#ifdef __SSE2__
+ int i = shoulder + 1;
+
+ if (i & 1) { // original formula, slower than optimized formulas below but only used once or none, so I let it as is for reference
+ // change to [0,1] range
+ float val = (float)i - shoulder;
+ float R = val * comp / (scalemshoulder);
+ hlCurve[i] = xlog(1.0f + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision
+ i++;
+ }
+
+ vdouble onev = _mm_set1_pd(1.0);
+ vdouble Rv = _mm_set_pd((i + 1 - shoulder) * (double)comp / scalemshoulder, (i - shoulder) * (double)comp / scalemshoulder);
+ vdouble incrementv = _mm_set1_pd(2.0 * comp / scalemshoulder);
+ vdouble exp_scalev = _mm_set1_pd(exp_scale);
+
+ // for (; i < 0x10000; i += 2) {
+ for (; i < maxran; i += 2) {
+ // change to [0,1] range
+ vdouble resultv = xlog(onev + Rv * exp_scalev) / Rv;
+ vfloat resultfv = _mm_cvtpd_ps(resultv);
+ _mm_store_ss(&hlCurve[i], resultfv);
+ resultfv = PERMUTEPS(resultfv, _MM_SHUFFLE(1, 1, 1, 1));
+ _mm_store_ss(&hlCurve[i + 1], resultfv);
+ Rv += incrementv;
+ }
+
+#else
+ float R = comp / scalemshoulder;
+ float increment = R;
+
+ // for (int i = shoulder + 1; i < 0x10000; i++) {
+ for (int i = shoulder + 1; i < maxran; i++) {
+ // change to [0,1] range
+ hlCurve[i] = xlog(1.0f + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision
+ R += increment;
+ }
+
+#endif
+
+ }
+}
+
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+void CurveFactory::complexCurvelocal(double ecomp, double black, double hlcompr, double hlcomprthresh,
+ double shcompr, double br, double cont, double lumare,
+ LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTf & lightCurveloc, float avg,
+ int skip)
+{
+
+ const float gamma_ = 2.22; //BT 709
+ const float start = expf(gamma_ * logf(-0.0954f / ((1.0f / gamma_ - 1.0f) * 1.0954f)));
+ const float slope = 1.0954f * powf(start, 1.0f / gamma_ - 1.f) - 0.0954f / start;
+ const float mul = 1.0954f;
+ const float add = 0.0954f;
+ float maxran = 65536.f; //65536
+
+// ecomp /= 100.;
+
+ // check if brightness curve is needed
+ if (br > 0.00001 || br < -0.00001) {
+ // utili = true;
+ if(br > 0) {
+ br /= 4.f;//to avoid artifacts in some cases
+ }
+ std::vector brightcurvePoints;
+ brightcurvePoints.resize(9);
+ brightcurvePoints.at(0) = double (DCT_NURBS);
+
+ brightcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
+ brightcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range
+
+ if (br > 0) {
+ brightcurvePoints.at(3) = 0.2; // toe point
+ brightcurvePoints.at(4) = 0.2 + br / 250.0; //value at toe point
+
+ brightcurvePoints.at(5) = 0.6; // shoulder point
+ brightcurvePoints.at(6) = min(1.0, 0.6 + br / 200.0); //value at shoulder point
+ } else {
+ brightcurvePoints.at(3) = 0.1 - br / 150.0; // toe point
+ brightcurvePoints.at(4) = 0.1; // value at toe point
+
+ brightcurvePoints.at(5) = min(1.0, 0.7 - br / 300.0); // shoulder point
+ brightcurvePoints.at(6) = 0.7; // value at shoulder point
+ }
+
+ brightcurvePoints.at(7) = 1.; // white point
+ brightcurvePoints.at(8) = 1.; // value at white point
+
+ DiagonalCurve brightcurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip);
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ // Applying brightness curve
+ for (int i = 0; i < 32768; i++) { // L values range up to 32767, higher values are for highlight overflow
+
+ // change to [0,1] range
+ float val = (float)i / 32767.0;
+
+ // apply brightness curve
+ val = brightcurve.getVal(val);
+
+ // store result in a temporary array
+ lightCurveloc[i] = val;
+ }
+
+
+
+ } else {
+ lightCurveloc.makeIdentity(32767.f);
+ }
+
+ // check if contrast curve is needed
+ if (cont > 0.00001 || cont < -0.00001) {
+
+
+ int k = avg * 32768;
+ avg = lightCurveloc[k];
+ // printf("avg=%f lumaref=%f\n", avg, lumare/100.f);
+ std::vector contrastcurvePoints;
+ bool lumm = true;
+
+ if (lumm) {
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ contrastcurvePoints.resize(9);
+ contrastcurvePoints.at(0) = double (DCT_NURBS);
+
+ contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
+ contrastcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range
+
+ contrastcurvePoints.at(3) = avg - avg * (0.6 - cont / 250.0); // toe point
+ contrastcurvePoints.at(4) = avg - avg * (0.6 + cont / 250.0); // value at toe point
+
+ contrastcurvePoints.at(5) = avg + (1 - avg) * (0.6 - cont / 250.0); // shoulder point
+ contrastcurvePoints.at(6) = avg + (1 - avg) * (0.6 + cont / 250.0); // value at shoulder point
+
+ contrastcurvePoints.at(7) = 1.; // white point
+ contrastcurvePoints.at(8) = 1.; // value at white point
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ } else {
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ // sum has an invalid value (next to 0, producing a division by zero, so we create a fake contrast curve, producing a white image
+ contrastcurvePoints.resize(5);
+ contrastcurvePoints.at(0) = double (DCT_NURBS);
+
+ contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
+ contrastcurvePoints.at(2) = 1.; // black point. Value in [0 ; 1] range
+
+ contrastcurvePoints.at(3) = 1.; // white point
+ contrastcurvePoints.at(4) = 1.; // value at white point
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ }
+
+ DiagonalCurve contrastcurve(contrastcurvePoints, CURVES_MIN_POLY_POINTS / skip);
+
+ // apply contrast enhancement
+ for (int i = 0; i < 32768; i++) {
+ lightCurveloc[i] = contrastcurve.getVal(lightCurveloc[i]);
+ }
+
+ }
+
+ lightCurveloc *= 32767.f;
+
+ for (int i = 32768; i < 32770; i++) { // set last two elements of lut to 32768 and 32769 to allow linear interpolation
+ lightCurveloc[i] = (float)i;
+ }
+
+
+ // a: slope of the curve, black: starting point at the x axis
+ const float a = powf(2.0f, ecomp);
+
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ // tone curve base. a: slope (from exp.comp.), b: black, def_mul: max. x value (can be>1), hr,sr: highlight,shadow recovery
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+ hlCurve.setClip(LUT_CLIP_BELOW); // used LUT_CLIP_BELOW, because we want to have a baseline of 2^expcomp in this curve. If we don't clip the lut we get wrong values, see Issue 2621 #14 for details
+ float exp_scale = a;
+// float scale = 65536.0;
+ float scale = maxran;
+ float comp = (max(0.0, ecomp) + 1.0) * hlcompr / 100.0;
+ float shoulder = ((scale / max(1.0f, exp_scale)) * (hlcomprthresh / 200.0)) + 0.1;
+
+ if (comp <= 0.0f) {
+ hlCurve.makeConstant(exp_scale);
+ } else {
+ hlCurve.makeConstant(exp_scale, shoulder + 1);
+
+ float scalemshoulder = scale - shoulder;
+
+#ifdef __SSE2__
+ int i = shoulder + 1;
+
+ if (i & 1) { // original formula, slower than optimized formulas below but only used once or none, so I let it as is for reference
+ // change to [0,1] range
+ float val = (float)i - shoulder;
+ float R = val * comp / (scalemshoulder);
+ hlCurve[i] = xlog(1.0f + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision
+ i++;
+ }
+
+ vdouble onev = _mm_set1_pd(1.0);
+ vdouble Rv = _mm_set_pd((i + 1 - shoulder) * (double)comp / scalemshoulder, (i - shoulder) * (double)comp / scalemshoulder);
+ vdouble incrementv = _mm_set1_pd(2.0 * comp / scalemshoulder);
+ vdouble exp_scalev = _mm_set1_pd(exp_scale);
+
+ // for (; i < 0x10000; i += 2) {
+ for (; i < maxran; i += 2) {
+ // change to [0,1] range
+ vdouble resultv = xlog(onev + Rv * exp_scalev) / Rv;
+ vfloat resultfv = _mm_cvtpd_ps(resultv);
+ _mm_store_ss(&hlCurve[i], resultfv);
+ resultfv = PERMUTEPS(resultfv, _MM_SHUFFLE(1, 1, 1, 1));
+ _mm_store_ss(&hlCurve[i + 1], resultfv);
+ Rv += incrementv;
+ }
+
+#else
+ float R = comp / scalemshoulder;
+ float increment = R;
+
+ // for (int i = shoulder + 1; i < 0x10000; i++) {
+ for (int i = shoulder + 1; i < maxran; i++) {
+ // change to [0,1] range
+ hlCurve[i] = xlog(1.0f + R * exp_scale) / R; // don't use xlogf or 1.f here. Leads to errors caused by too low precision
+ R += increment;
+ }
+
+#endif
+
+ }
+
+
+ // curve without contrast
+ LUTf dcurve(maxran);
+
+ //%%%%%%%%%%%%%%%%%%%%%%%%%%
+ // change to [0,1] range
+ shCurve.setClip(LUT_CLIP_ABOVE); // used LUT_CLIP_ABOVE, because the curve converges to 1.0 at the upper end and we don't want to exceed this value.
+ if (black == 0.0) {
+ shCurve.makeConstant(1.f);
+ } else {
+ const float val = 1.f / (maxran - 1.f);
+ shCurve[0] = simplebasecurve(val, black, 0.015 * shcompr) / val;
+ }
+
+
+
+ // gamma correction
+
+ float val = Color::gammatab_bt709[0] / maxran;
+ // store result in a temporary array
+ dcurve[0] = LIM01(val);
+
+ for (int i = 1; i < maxran; i++) {
+ float val = i / (maxran - 1.f);
+
+// float val2 = simplebasecurve(val, black, 0.015 * shcompr);
+// shCurve[i] = val2 / val;
+ if (black != 0.0) {
+ const float val = i / 65535.f;
+ shCurve[i] = simplebasecurve(val, black, 0.015 * shcompr) / val;
+ }
+
+ // gamma correction
+ val = Color::gammatab_bt709[i] / maxran;
+ // store result in a temporary array
+ dcurve[i] = val;
+ }
+
+
+#ifdef __SSE2__
+ vfloat gamma_v = F2V(gamma_);
+ vfloat startv = F2V(start);
+ vfloat slopev = F2V(slope);
+ vfloat mulv = F2V(mul);
+ vfloat addv = F2V(add);
+ // vfloat c65535v = F2V (65535.f);
+ vfloat c65535v = F2V(maxran - 1.f);
+
+ for (int i = 0; i <= (maxran - 1.f); i += 4) {
+ vfloat valv = LVFU(dcurve[i]);
+ valv = igamma(valv, gamma_v, startv, slopev, mulv, addv);
+ STVFU(outCurve[i], c65535v * valv);
+ }
+
+#else
+
+ for (int i = 0; i <= (maxran - 1.f); i++) {
+ float val = dcurve[i];
+ val = igamma(val, gamma_, start, slope, mul, add);
+ outCurve[i] = ((maxran - 1.) * val);
+ }
+
+#endif
+
+}
+
+
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-void CurveFactory::complexLCurve (double br, double contr, const std::vector& curvePoints,
- const LUTu & histogram, LUTf & outCurve,
- LUTu & outBeforeCCurveHistogram, int skip, bool & utili)
+void CurveFactory::complexLCurve(double br, double contr, const std::vector& curvePoints,
+ const LUTu & histogram, LUTf & outCurve,
+ LUTu & outBeforeCCurveHistogram, int skip, bool & utili)
{
utili = false;
+
// clear array that stores histogram valid before applying the custom curve
if (outBeforeCCurveHistogram) {
outBeforeCCurveHistogram.clear();
@@ -813,27 +1422,27 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector brightcurvePoints;
brightcurvePoints.resize(9);
- brightcurvePoints.at(0) = double(DCT_NURBS);
+ brightcurvePoints.at(0) = double (DCT_NURBS);
- brightcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
- brightcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range
+ brightcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
+ brightcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range
if (br > 0) {
- brightcurvePoints.at(3) = 0.1; // toe point
- brightcurvePoints.at(4) = 0.1 + br / 150.0; //value at toe point
+ brightcurvePoints.at(3) = 0.1; // toe point
+ brightcurvePoints.at(4) = 0.1 + br / 150.0; //value at toe point
- brightcurvePoints.at(5) = 0.7; // shoulder point
- brightcurvePoints.at(6) = min(1.0, 0.7 + br / 300.0); //value at shoulder point
+ brightcurvePoints.at(5) = 0.7; // shoulder point
+ brightcurvePoints.at(6) = min(1.0, 0.7 + br / 300.0); //value at shoulder point
} else {
- brightcurvePoints.at(3) = 0.1 - br / 150.0; // toe point
- brightcurvePoints.at(4) = 0.1; // value at toe point
+ brightcurvePoints.at(3) = 0.1 - br / 150.0; // toe point
+ brightcurvePoints.at(4) = 0.1; // value at toe point
- brightcurvePoints.at(5) = min(1.0, 0.7 - br / 300.0); // shoulder point
- brightcurvePoints.at(6) = 0.7; // value at shoulder point
+ brightcurvePoints.at(5) = min(1.0, 0.7 - br / 300.0); // shoulder point
+ brightcurvePoints.at(6) = 0.7; // value at shoulder point
}
- brightcurvePoints.at(7) = 1.; // white point
- brightcurvePoints.at(8) = 1.; // value at white point
+ brightcurvePoints.at(7) = 1.; // white point
+ brightcurvePoints.at(8) = 1.; // value at white point
DiagonalCurve brightcurve(brightcurvePoints, CURVES_MIN_POLY_POINTS / skip);
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -845,7 +1454,7 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector(val);
@@ -874,37 +1483,37 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector contrastcurvePoints;
- if(sum) {
+ if (sum) {
avg /= sum;
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
contrastcurvePoints.resize(9);
- contrastcurvePoints.at(0) = double(DCT_NURBS);
+ contrastcurvePoints.at(0) = double (DCT_NURBS);
- contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
- contrastcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range
+ contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
+ contrastcurvePoints.at(2) = 0.; // black point. Value in [0 ; 1] range
- contrastcurvePoints.at(3) = avg - avg * (0.6 - contr / 250.0); // toe point
- contrastcurvePoints.at(4) = avg - avg * (0.6 + contr / 250.0); // value at toe point
+ contrastcurvePoints.at(3) = avg - avg * (0.6 - contr / 250.0); // toe point
+ contrastcurvePoints.at(4) = avg - avg * (0.6 + contr / 250.0); // value at toe point
- contrastcurvePoints.at(5) = avg + (1 - avg) * (0.6 - contr / 250.0); // shoulder point
- contrastcurvePoints.at(6) = avg + (1 - avg) * (0.6 + contr / 250.0); // value at shoulder point
+ contrastcurvePoints.at(5) = avg + (1 - avg) * (0.6 - contr / 250.0); // shoulder point
+ contrastcurvePoints.at(6) = avg + (1 - avg) * (0.6 + contr / 250.0); // value at shoulder point
- contrastcurvePoints.at(7) = 1.; // white point
- contrastcurvePoints.at(8) = 1.; // value at white point
+ contrastcurvePoints.at(7) = 1.; // white point
+ contrastcurvePoints.at(8) = 1.; // value at white point
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
} else {
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// sum has an invalid value (next to 0, producing a division by zero, so we create a fake contrast curve, producing a white image
contrastcurvePoints.resize(5);
- contrastcurvePoints.at(0) = double(DCT_NURBS);
+ contrastcurvePoints.at(0) = double (DCT_NURBS);
- contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
- contrastcurvePoints.at(2) = 1.; // black point. Value in [0 ; 1] range
+ contrastcurvePoints.at(1) = 0.; // black point. Value in [0 ; 1] range
+ contrastcurvePoints.at(2) = 1.; // black point. Value in [0 ; 1] range
- contrastcurvePoints.at(3) = 1.; // white point
- contrastcurvePoints.at(4) = 1.; // value at white point
+ contrastcurvePoints.at(3) = 1.; // white point
+ contrastcurvePoints.at(4) = 1.; // value at white point
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
}
@@ -913,7 +1522,7 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector(new DiagonalCurve (curvePoints, CURVES_MIN_POLY_POINTS / skip));
+ tcurve = std::unique_ptr (new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip));
if (outBeforeCCurveHistogram) {
histNeeded = true;
@@ -950,7 +1559,7 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vectorgetVal (outCurve[i]);
+ val = tcurve->getVal(outCurve[i]);
outCurve[i] = (32767.f * val);
}
@@ -958,7 +1567,7 @@ void CurveFactory::complexLCurve (double br, double contr, const std::vector& curvePoints, LUTf & outCurve, int skip)
+void CurveFactory::RGBCurve(const std::vector& curvePoints, LUTf & outCurve, int skip)
{
// create a curve if needed
std::unique_ptr tcurve;
if (!curvePoints.empty() && curvePoints[0] != 0) {
- tcurve = std::unique_ptr(new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip));
+ tcurve = std::unique_ptr (new DiagonalCurve(curvePoints, CURVES_MIN_POLY_POINTS / skip));
}
if (tcurve && tcurve->isIdentity()) {
@@ -1008,6 +1617,1273 @@ void CurveFactory::RGBCurve (const std::vector& curvePoints, LUTf & outC
}
+LocretigainCurverab::LocretigainCurverab() : sum(0.f) {};
+
+void LocretigainCurverab::Reset()
+{
+ lutLocretigainCurverab.reset();
+ sum = 0.f;
+}
+
+void LocretigainCurverab::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocretigainCurverab(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocretigainCurverab[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocretigainCurverab[i] < 0.02f) {
+ lutLocretigainCurverab[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocretigainCurverab[i];
+ }
+
+ //lutLocCurve.dump("wav");
+}
+
+void LocretigainCurverab::Set(const std::vector &curvePoints)
+{
+
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ tcurve.setIdentityValue(0.);
+ Set(tcurve);
+ } else {
+ Reset();
+ }
+}
+LocHHmaskblCurve::LocHHmaskblCurve() : sum(0.f) {};
+
+void LocHHmaskblCurve::Reset()
+{
+ lutLocHHmaskblCurve.reset();
+ sum = 0.f;
+}
+
+
+void LocHHmaskblCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocHHmaskblCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocHHmaskblCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocHHmaskblCurve[i] < 0.02f) {
+ lutLocHHmaskblCurve[i] = 0.02f;
+ }
+
+ sum += lutLocHHmaskblCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+void LocHHmaskblCurve::Set(const std::vector &curvePoints, bool & lhmasblutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lhmasblutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocLLmaskblCurve::LocLLmaskblCurve() : sum(0.f) {};
+
+void LocLLmaskblCurve::Reset()
+{
+ lutLocLLmaskblCurve.reset();
+ sum = 0.f;
+}
+
+void LocLLmaskblCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocLLmaskblCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocLLmaskblCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocLLmaskblCurve[i] < 0.02f) {
+ lutLocLLmaskblCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocLLmaskblCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocLLmaskblCurve::Set(const std::vector &curvePoints, bool & llmasblutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ llmasblutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocCCmaskblCurve::LocCCmaskblCurve() : sum(0.f) {};
+
+void LocCCmaskblCurve::Reset()
+{
+ lutLocCCmaskblCurve.reset();
+ sum = 0.f;
+}
+
+void LocCCmaskblCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocCCmaskblCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocCCmaskblCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocCCmaskblCurve[i] < 0.02f) {
+ lutLocCCmaskblCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocCCmaskblCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocCCmaskblCurve::Set(const std::vector &curvePoints, bool & lcmasblutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lcmasblutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+LocHHmasktmCurve::LocHHmasktmCurve() : sum(0.f) {};
+
+void LocHHmasktmCurve::Reset()
+{
+ lutLocHHmasktmCurve.reset();
+ sum = 0.f;
+}
+
+
+void LocHHmasktmCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocHHmasktmCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocHHmasktmCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocHHmasktmCurve[i] < 0.02f) {
+ lutLocHHmasktmCurve[i] = 0.02f;
+ }
+
+ sum += lutLocHHmasktmCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+void LocHHmasktmCurve::Set(const std::vector &curvePoints, bool & lhmastmutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lhmastmutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocLLmasktmCurve::LocLLmasktmCurve() : sum(0.f) {};
+
+void LocLLmasktmCurve::Reset()
+{
+ lutLocLLmasktmCurve.reset();
+ sum = 0.f;
+}
+
+void LocLLmasktmCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocLLmasktmCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocLLmasktmCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocLLmasktmCurve[i] < 0.02f) {
+ lutLocLLmasktmCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocLLmasktmCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocLLmasktmCurve::Set(const std::vector &curvePoints, bool & llmastmutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ llmastmutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocCCmasktmCurve::LocCCmasktmCurve() : sum(0.f) {};
+
+void LocCCmasktmCurve::Reset()
+{
+ lutLocCCmasktmCurve.reset();
+ sum = 0.f;
+}
+
+void LocCCmasktmCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocCCmasktmCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocCCmasktmCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocCCmasktmCurve[i] < 0.02f) {
+ lutLocCCmasktmCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocCCmasktmCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocCCmasktmCurve::Set(const std::vector &curvePoints, bool & lcmastmutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lcmastmutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+
+LocHHmaskretiCurve::LocHHmaskretiCurve() : sum(0.f) {};
+
+void LocHHmaskretiCurve::Reset()
+{
+ lutLocHHmaskretiCurve.reset();
+ sum = 0.f;
+}
+
+
+void LocHHmaskretiCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocHHmaskretiCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocHHmaskretiCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocHHmaskretiCurve[i] < 0.02f) {
+ lutLocHHmaskretiCurve[i] = 0.02f;
+ }
+
+ sum += lutLocHHmaskretiCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+void LocHHmaskretiCurve::Set(const std::vector &curvePoints, bool & lhmasretiutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lhmasretiutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocLLmaskretiCurve::LocLLmaskretiCurve() : sum(0.f) {};
+
+void LocLLmaskretiCurve::Reset()
+{
+ lutLocLLmaskretiCurve.reset();
+ sum = 0.f;
+}
+
+void LocLLmaskretiCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocLLmaskretiCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocLLmaskretiCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocLLmaskretiCurve[i] < 0.02f) {
+ lutLocLLmaskretiCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocLLmaskretiCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocLLmaskretiCurve::Set(const std::vector &curvePoints, bool & llmasretiutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ llmasretiutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocCCmaskretiCurve::LocCCmaskretiCurve() : sum(0.f) {};
+
+void LocCCmaskretiCurve::Reset()
+{
+ lutLocCCmaskretiCurve.reset();
+ sum = 0.f;
+}
+
+void LocCCmaskretiCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocCCmaskretiCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocCCmaskretiCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocCCmaskretiCurve[i] < 0.02f) {
+ lutLocCCmaskretiCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocCCmaskretiCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocCCmaskretiCurve::Set(const std::vector &curvePoints, bool & lcmasretiutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lcmasretiutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+
+
+
+
+
+LocHHmaskcbCurve::LocHHmaskcbCurve() : sum(0.f) {};
+
+void LocHHmaskcbCurve::Reset()
+{
+ lutLocHHmaskcbCurve.reset();
+ sum = 0.f;
+}
+
+
+void LocHHmaskcbCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocHHmaskcbCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocHHmaskcbCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocHHmaskcbCurve[i] < 0.02f) {
+ lutLocHHmaskcbCurve[i] = 0.02f;
+ }
+
+ sum += lutLocHHmaskcbCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+void LocHHmaskcbCurve::Set(const std::vector &curvePoints, bool & lhmascbutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lhmascbutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocLLmaskcbCurve::LocLLmaskcbCurve() : sum(0.f) {};
+
+void LocLLmaskcbCurve::Reset()
+{
+ lutLocLLmaskcbCurve.reset();
+ sum = 0.f;
+}
+
+void LocLLmaskcbCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocLLmaskcbCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocLLmaskcbCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocLLmaskcbCurve[i] < 0.02f) {
+ lutLocLLmaskcbCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocLLmaskcbCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocLLmaskcbCurve::Set(const std::vector &curvePoints, bool & llmascbutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ llmascbutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocCCmaskcbCurve::LocCCmaskcbCurve() : sum(0.f) {};
+
+void LocCCmaskcbCurve::Reset()
+{
+ lutLocCCmaskcbCurve.reset();
+ sum = 0.f;
+}
+
+void LocCCmaskcbCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocCCmaskcbCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocCCmaskcbCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocCCmaskcbCurve[i] < 0.02f) {
+ lutLocCCmaskcbCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocCCmaskcbCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocCCmaskcbCurve::Set(const std::vector &curvePoints, bool & lcmascbutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lcmascbutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+
+LocHHmaskSHCurve::LocHHmaskSHCurve() : sum(0.f) {};
+
+void LocHHmaskSHCurve::Reset()
+{
+ lutLocHHmaskSHCurve.reset();
+ sum = 0.f;
+}
+
+
+void LocHHmaskSHCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocHHmaskSHCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocHHmaskSHCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocHHmaskSHCurve[i] < 0.02f) {
+ lutLocHHmaskSHCurve[i] = 0.02f;
+ }
+
+ sum += lutLocHHmaskSHCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocHHmaskSHCurve::Set(const std::vector &curvePoints, bool & lhmasSHutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lhmasSHutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+LocLLmaskSHCurve::LocLLmaskSHCurve() : sum(0.f) {};
+
+void LocLLmaskSHCurve::Reset()
+{
+ lutLocLLmaskSHCurve.reset();
+ sum = 0.f;
+}
+
+void LocLLmaskSHCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocLLmaskSHCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocLLmaskSHCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocLLmaskSHCurve[i] < 0.02f) {
+ lutLocLLmaskSHCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocLLmaskSHCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocLLmaskSHCurve::Set(const std::vector &curvePoints, bool & llmasSHutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ llmasSHutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+
+LocCCmaskSHCurve::LocCCmaskSHCurve() : sum(0.f) {};
+
+void LocCCmaskSHCurve::Reset()
+{
+ lutLocCCmaskSHCurve.reset();
+ sum = 0.f;
+}
+
+void LocCCmaskSHCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocCCmaskSHCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocCCmaskSHCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocCCmaskSHCurve[i] < 0.02f) {
+ lutLocCCmaskSHCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocCCmaskSHCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocCCmaskSHCurve::Set(const std::vector &curvePoints, bool & lcmasSHutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lcmasSHutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+
+
+LocHHmaskexpCurve::LocHHmaskexpCurve() : sum(0.f) {};
+
+void LocHHmaskexpCurve::Reset()
+{
+ lutLocHHmaskexpCurve.reset();
+ sum = 0.f;
+}
+
+
+void LocHHmaskexpCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocHHmaskexpCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocHHmaskexpCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocHHmaskexpCurve[i] < 0.02f) {
+ lutLocHHmaskexpCurve[i] = 0.02f;
+ }
+
+ sum += lutLocHHmaskexpCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocHHmaskexpCurve::Set(const std::vector &curvePoints, bool & lhmasexputili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lhmasexputili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+LocLLmaskexpCurve::LocLLmaskexpCurve() : sum(0.f) {};
+
+void LocLLmaskexpCurve::Reset()
+{
+ lutLocLLmaskexpCurve.reset();
+ sum = 0.f;
+}
+
+void LocLLmaskexpCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocLLmaskexpCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocLLmaskexpCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocLLmaskexpCurve[i] < 0.02f) {
+ lutLocLLmaskexpCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocLLmaskexpCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocLLmaskexpCurve::Set(const std::vector &curvePoints, bool & llmasexputili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ llmasexputili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+
+LocCCmaskexpCurve::LocCCmaskexpCurve() : sum(0.f) {};
+
+void LocCCmaskexpCurve::Reset()
+{
+ lutLocCCmaskexpCurve.reset();
+ sum = 0.f;
+}
+
+void LocCCmaskexpCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocCCmaskexpCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocCCmaskexpCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocCCmaskexpCurve[i] < 0.02f) {
+ lutLocCCmaskexpCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocCCmaskexpCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocCCmaskexpCurve::Set(const std::vector &curvePoints, bool & lcmasexputili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lcmasexputili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocHHmaskCurve::LocHHmaskCurve() : sum(0.f) {};
+
+void LocHHmaskCurve::Reset()
+{
+ lutLocHHmaskCurve.reset();
+ sum = 0.f;
+}
+
+
+void LocHHmaskCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocHHmaskCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocHHmaskCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocHHmaskCurve[i] < 0.02f) {
+ lutLocHHmaskCurve[i] = 0.02f;
+ }
+
+ sum += lutLocHHmaskCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocHHmaskCurve::Set(const std::vector &curvePoints, bool & lhmasutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lhmasutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+
+LocCCmaskCurve::LocCCmaskCurve() : sum(0.f) {};
+
+void LocCCmaskCurve::Reset()
+{
+ lutLocCCmaskCurve.reset();
+ sum = 0.f;
+}
+
+
+void LocCCmaskCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocCCmaskCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocCCmaskCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocCCmaskCurve[i] < 0.02f) {
+ lutLocCCmaskCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocCCmaskCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocCCmaskCurve::Set(const std::vector &curvePoints, bool & lcmasutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ lcmasutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocLLmaskCurve::LocLLmaskCurve() : sum(0.f) {};
+
+void LocLLmaskCurve::Reset()
+{
+ lutLocLLmaskCurve.reset();
+ sum = 0.f;
+}
+
+void LocLLmaskCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocLLmaskCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocLLmaskCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocLLmaskCurve[i] < 0.02f) {
+ lutLocLLmaskCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocLLmaskCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocLLmaskCurve::Set(const std::vector &curvePoints, bool & llmasutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ llmasutili = true;
+ Set(ttcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
+
+LocHHCurve::LocHHCurve() : sum(0.f) {};
+
+void LocHHCurve::Reset()
+{
+ lutLocHHCurve.reset();
+ sum = 0.f;
+}
+void LocHHCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocHHCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocHHCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocHHCurve[i] < 0.02f) {
+ lutLocHHCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocHHCurve[i];
+ }
+
+ //lutLocHHCurve.dump("wav");
+}
+
+
+
+void LocHHCurve::Set(const std::vector &curvePoints, bool &HHutili)
+{
+ // if (HHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve ttcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ ttcurve.setIdentityValue(0.);
+ Set(ttcurve);
+ HHutili = true;
+ } else {
+ Reset();
+ }
+}
+
+
+LocLHCurve::LocLHCurve() : sum(0.f) {};
+
+void LocLHCurve::Reset()
+{
+ lutLocLHCurve.reset();
+ sum = 0.f;
+}
+
+void LocLHCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocLHCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocLHCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocLHCurve[i] < 0.02f) {
+ lutLocLHCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocLHCurve[i];
+ }
+
+ //lutLocCurve.dump("wav");
+}
+
+
+
+
+void LocLHCurve::Set(const std::vector &curvePoints, bool &LHutili)
+{
+
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+// if (LHutili && !curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ tcurve.setIdentityValue(0.);
+ Set(tcurve);
+ LHutili = true;
+ } else {
+ Reset();
+ }
+}
+
+LocwavCurve::LocwavCurve() : sum(0.f) {};
+
+void LocwavCurve::Reset()
+{
+ lutLocwavCurve.reset();
+ sum = 0.f;
+}
+
+void LocwavCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocwavCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocwavCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocwavCurve[i] < 0.02f) {
+ lutLocwavCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocwavCurve[i];
+ }
+
+ //lutLocCurve.dump("wav");
+}
+void LocwavCurve::Set(const std::vector &curvePoints, bool & lcwavutili)
+{
+
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ tcurve.setIdentityValue(0.);
+ lcwavutili = true;
+ Set(tcurve);
+ } else {
+ Reset();
+ }
+}
+
+LocretitransCurve::LocretitransCurve() : sum(0.f) {};
+
+void LocretitransCurve::Reset()
+{
+ lutLocretitransCurve.reset();
+ sum = 0.f;
+}
+
+void LocretitransCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocretitransCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocretitransCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocretitransCurve[i] < 0.02f) {
+ lutLocretitransCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocretitransCurve[i];
+ }
+
+ //lutLocCurve.dump("wav");
+}
+void LocretitransCurve::Set(const std::vector &curvePoints)
+{
+
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ tcurve.setIdentityValue(0.);
+ Set(tcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+LocretigainCurve::LocretigainCurve() : sum(0.f) {};
+
+void LocretigainCurve::Reset()
+{
+ lutLocretigainCurve.reset();
+ sum = 0.f;
+}
+
+void LocretigainCurve::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutLocretigainCurve(501); // raise this value if the quality suffers from this number of samples
+ sum = 0.f;
+
+ for (int i = 0; i < 501; i++) {
+ lutLocretigainCurve[i] = pCurve.getVal(double (i) / 500.);
+
+ if (lutLocretigainCurve[i] < 0.02f) {
+ lutLocretigainCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
+ }
+
+ sum += lutLocretigainCurve[i];
+ }
+
+ //lutLocCurve.dump("wav");
+}
+void LocretigainCurve::Set(const std::vector &curvePoints)
+{
+
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ tcurve.setIdentityValue(0.);
+ Set(tcurve);
+ } else {
+ Reset();
+ }
+}
+
+
+
void ColorAppearance::Reset()
{
lutColCurve.reset();
@@ -1019,7 +2895,7 @@ void ColorAppearance::Set(const Curve &pCurve)
lutColCurve(65536);
for (int i = 0; i < 65536; i++) {
- lutColCurve[i] = pCurve.getVal(double(i) / 65535.) * 65535.;
+ lutColCurve[i] = pCurve.getVal(double (i) / 65535.) * 65535.;
}
}
@@ -1038,10 +2914,10 @@ void RetinextransmissionCurve::Set(const Curve &pCurve)
return;
}
- luttransmission(501); // raise this value if the quality suffers from this number of samples
+ luttransmission(501); // raise this value if the quality suffers from this number of samples
for (int i = 0; i < 501; i++) {
- luttransmission[i] = pCurve.getVal(double(i) / 500.);
+ luttransmission[i] = pCurve.getVal(double (i) / 500.);
}
}
@@ -1071,10 +2947,10 @@ void RetinexgaintransmissionCurve::Set(const Curve &pCurve)
return;
}
- lutgaintransmission(501); // raise this value if the quality suffers from this number of samples
+ lutgaintransmission(501); // raise this value if the quality suffers from this number of samples
for (int i = 0; i < 501; i++) {
- lutgaintransmission[i] = pCurve.getVal(double(i) / 500.);
+ lutgaintransmission[i] = pCurve.getVal(double (i) / 500.);
}
}
@@ -1101,9 +2977,9 @@ void ToneCurve::Set(const Curve &pCurve, float gamma)
if (gamma <= 0.0 || gamma == 1.) {
for (int i = 0; i < 65536; i++) {
- lutToneCurve[i] = (float)pCurve.getVal(float(i) / 65535.f) * 65535.f;
+ lutToneCurve[i] = (float)pCurve.getVal(float (i) / 65535.f) * 65535.f;
}
- } else if(gamma == (float)Color::sRGBGammaCurve) {
+ } else if (gamma == (float)Color::sRGBGammaCurve) {
// for sRGB gamma we can use luts, which is much faster
for (int i = 0; i < 65536; i++) {
float val = Color::gammatab_srgb[i] / 65535.f;
@@ -1113,17 +2989,17 @@ void ToneCurve::Set(const Curve &pCurve, float gamma)
}
} else {
- const float start = expf(gamma * logf( -0.055 / ((1.0 / gamma - 1.0) * 1.055 )));
- const float slope = 1.055 * powf (start, 1.0 / gamma - 1) - 0.055 / start;
+ const float start = expf(gamma * logf(-0.055 / ((1.0 / gamma - 1.0) * 1.055)));
+ const float slope = 1.055 * powf(start, 1.0 / gamma - 1) - 0.055 / start;
const float mul = 1.055;
const float add = 0.055;
// apply gamma, that is 'pCurve' is defined with the given gamma and here we convert it to a curve in linear space
for (int i = 0; i < 65536; i++) {
- float val = float(i) / 65535.f;
- val = CurveFactory::gamma (val, gamma, start, slope, mul, add);
+ float val = float (i) / 65535.f;
+ val = CurveFactory::gamma(val, gamma, start, slope, mul, add);
val = pCurve.getVal(val);
- val = CurveFactory::igamma (val, gamma, start, slope, mul, add);
+ val = CurveFactory::igamma(val, gamma, start, slope, mul, add);
lutToneCurve[i] = val * 65535.f;
}
}
@@ -1141,10 +3017,10 @@ void OpacityCurve::Set(const Curve *pCurve)
return;
}
- lutOpacityCurve(501); // raise this value if the quality suffers from this number of samples
+ lutOpacityCurve(501); // raise this value if the quality suffers from this number of samples
for (int i = 0; i < 501; i++) {
- lutOpacityCurve[i] = pCurve->getVal(double(i) / 500.);
+ lutOpacityCurve[i] = pCurve->getVal(double (i) / 500.);
}
//lutOpacityCurve.dump("opacity");
@@ -1155,7 +3031,7 @@ void OpacityCurve::Set(const std::vector &curvePoints, bool &opautili)
std::unique_ptr tcurve;
if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
- tcurve = std::unique_ptr(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2));
+ tcurve = std::unique_ptr (new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2));
tcurve->setIdentityValue(0.);
}
@@ -1182,13 +3058,13 @@ void WavCurve::Set(const Curve &pCurve)
return;
}
- lutWavCurve(501); // raise this value if the quality suffers from this number of samples
+ lutWavCurve(501); // raise this value if the quality suffers from this number of samples
sum = 0.f;
for (int i = 0; i < 501; i++) {
- lutWavCurve[i] = pCurve.getVal(double(i) / 500.);
+ lutWavCurve[i] = pCurve.getVal(double (i) / 500.);
- if(lutWavCurve[i] < 0.02f) {
+ if (lutWavCurve[i] < 0.02f) {
lutWavCurve[i] = 0.02f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
}
@@ -1259,10 +3135,10 @@ void WavOpacityCurveRG::Set(const Curve &pCurve)
return;
}
- lutOpacityCurveRG(501); // raise this value if the quality suffers from this number of samples
+ lutOpacityCurveRG(501); // raise this value if the quality suffers from this number of samples
for (int i = 0; i < 501; i++) {
- lutOpacityCurveRG[i] = pCurve.getVal(double(i) / 500.);
+ lutOpacityCurveRG[i] = pCurve.getVal(double (i) / 500.);
}
}
@@ -1278,6 +3154,43 @@ void WavOpacityCurveRG::Set(const std::vector &curvePoints)
}
+WavOpacityCurveSH::WavOpacityCurveSH() {}
+
+void WavOpacityCurveSH::Reset()
+{
+ lutOpacityCurveSH.reset();
+}
+
+void WavOpacityCurveSH::Set(const Curve &pCurve)
+{
+ if (pCurve.isIdentity()) {
+ Reset(); // raise this value if the quality suffers from this number of samples
+ return;
+ }
+
+ lutOpacityCurveSH(501); // raise this value if the quality suffers from this number of samples
+
+ for (int i = 0; i < 501; i++) {
+ lutOpacityCurveSH[i] = pCurve.getVal(double(i) / 500.);
+ }
+}
+
+void WavOpacityCurveSH::Set(const std::vector &curvePoints)
+{
+ if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
+ FlatCurve tcurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2);
+ tcurve.setIdentityValue(0.);
+ Set(tcurve);
+ } else {
+ Reset();
+ }
+
+}
+
+
+
+
+
WavOpacityCurveBY::WavOpacityCurveBY() {}
void WavOpacityCurveBY::Reset()
@@ -1292,10 +3205,10 @@ void WavOpacityCurveBY::Set(const Curve &pCurve)
return;
}
- lutOpacityCurveBY(501); // raise this value if the quality suffers from this number of samples
+ lutOpacityCurveBY(501); // raise this value if the quality suffers from this number of samples
for (int i = 0; i < 501; i++) {
- lutOpacityCurveBY[i] = pCurve.getVal(double(i) / 500.);
+ lutOpacityCurveBY[i] = pCurve.getVal(double (i) / 500.);
}
}
@@ -1324,10 +3237,10 @@ void WavOpacityCurveW::Set(const Curve &pCurve)
return;
}
- lutOpacityCurveW(501); // raise this value if the quality suffers from this number of samples
+ lutOpacityCurveW(501); // raise this value if the quality suffers from this number of samples
for (int i = 0; i < 501; i++) {
- lutOpacityCurveW[i] = pCurve.getVal(double(i) / 500.);
+ lutOpacityCurveW[i] = pCurve.getVal(double (i) / 500.);
}
}
@@ -1356,10 +3269,10 @@ void WavOpacityCurveWL::Set(const Curve &pCurve)
return;
}
- lutOpacityCurveWL(501); // raise this value if the quality suffers from this number of samples
+ lutOpacityCurveWL(501); // raise this value if the quality suffers from this number of samples
for (int i = 0; i < 501; i++) {
- lutOpacityCurveWL[i] = pCurve.getVal(double(i) / 500.);
+ lutOpacityCurveWL[i] = pCurve.getVal(double (i) / 500.);
}
}
@@ -1390,13 +3303,13 @@ void NoiseCurve::Set(const Curve &pCurve)
return;
}
- lutNoiseCurve(501); // raise this value if the quality suffers from this number of samples
+ lutNoiseCurve(501); // raise this value if the quality suffers from this number of samples
sum = 0.f;
for (int i = 0; i < 501; i++) {
- lutNoiseCurve[i] = pCurve.getVal(double(i) / 500.);
+ lutNoiseCurve[i] = pCurve.getVal(double (i) / 500.);
- if(lutNoiseCurve[i] < 0.01f) {
+ if (lutNoiseCurve[i] < 0.01f) {
lutNoiseCurve[i] = 0.01f; //avoid 0.f for wavelet : under 0.01f quasi no action for each value
}
@@ -1470,7 +3383,7 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3],
//lr1=low;
for (int i = 0; i <= upperBound; ++i) {
- double x = double(i) / double(upperBound);
+ double x = double (i) / double (upperBound);
if (x > nextX) {
++ptNum;
@@ -1486,13 +3399,13 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3],
}
if (!ptNum) {
- Color::hsv2rgb(float(prevY), satur, lr1, r, g, b);
+ Color::hsv2rgb(float (prevY), satur, lr1, r, g, b);
Color::rgbxyz(r, g, b, xx, yy, zz, xyz_rgb);
lut1[i] = xx;
lut2[i] = yy;
lut3[i] = zz;
} else if (ptNum >= nPoints) {
- Color::hsv2rgb(float(nextY), satur, lr2, r, g, b);
+ Color::hsv2rgb(float (nextY), satur, lr2, r, g, b);
Color::rgbxyz(r, g, b, xx, yy, zz, xyz_rgb);
lut1[i] = xx;
lut2[i] = yy;
@@ -1502,8 +3415,8 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3],
if (dY > 0.000001 || dY < -0.000001) {
float r1, g1, b1, r2, g2, b2;
- Color::hsv2rgb(float(prevY), satur, lr1, r1, g1, b1);
- Color::hsv2rgb(float(nextY), satur, lr2, r2, g2, b2);
+ Color::hsv2rgb(float (prevY), satur, lr1, r1, g1, b1);
+ Color::hsv2rgb(float (nextY), satur, lr2, r2, g2, b2);
LUTf dum;
float X1, X2, Y1, Y2, Z1, Z2, L1, a_1, b_1, c1, h1;
Color::rgbxyz(r2, g2, b2, X2, Y2, Z2, xyz_rgb);
@@ -1511,34 +3424,27 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3],
//I use XYZ to mix color 1 and 2 rather than rgb (gamut) and rather than Lab artifacts
X1 = X1 + (X2 - X1) * currY / dY;
- if(X1 < 0.f) {
+ if (X1 < 0.f) {
X1 = 0.f; //negative value not good
}
Y1 = Y1 + (Y2 - Y1) * currY / dY;
- if(Y1 < 0.f) {
+ if (Y1 < 0.f) {
Y1 = 0.f;
}
Z1 = Z1 + (Z2 - Z1) * currY / dY;
- if(Z1 < 0.f) {
+ if (Z1 < 0.f) {
Z1 = 0.f;
}
- Color::XYZ2Lab(X1, Y1, Z1, L1, a_1, b_1);//prepare to gamut control
+ Color::XYZ2Lab(X1, Y1, Z1, L1, a_1, b_1); //prepare to gamut control
Color::Lab2Lch(a_1, b_1, c1, h1);
float Lr = L1 / 327.68f;
float RR, GG, BB;
-#ifndef NDEBUG
- bool neg = false;
- bool more_rgb = false;
- //gamut control : Lab values are in gamut
- Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f, neg, more_rgb);
-#else
Color::gamutLchonly(h1, Lr, c1, RR, GG, BB, xyz_rgb, false, 0.15f, 0.96f);
-#endif
L1 = Lr * 327.68f;
float La, Lb, X, Y, Z;
// converting back to rgb
@@ -1548,7 +3454,7 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3],
lut2[i] = Y;
lut3[i] = Z;
} else {
- Color::hsv2rgb(float(nextY), satur, lumin, r, g, b);
+ Color::hsv2rgb(float (nextY), satur, lumin, r, g, b);
Color::rgbxyz(r, g, b, xx, yy, zz, xyz_rgb);
lut1[i] = xx;
lut2[i] = yy;
@@ -1556,14 +3462,6 @@ void ColorGradientCurve::SetXYZ(const Curve *pCurve, const double xyz_rgb[3][3],
}
}
}
-
- /*
- #ifndef NDEBUG
- lutRed.dump("red");
- lutGreen.dump("green");
- lutBlue.dump("blue");
- #endif
- */
}
void ColorGradientCurve::SetXYZ(const std::vector &curvePoints, const double xyz_rgb[3][3], float satur, float lumin)
@@ -1571,7 +3469,7 @@ void ColorGradientCurve::SetXYZ(const std::vector &curvePoints, const do
std::unique_ptr tcurve;
if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
- tcurve = std::unique_ptr(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2));
+ tcurve = std::unique_ptr (new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2));
}
if (tcurve) {
@@ -1607,7 +3505,7 @@ void ColorGradientCurve::SetRGB(const Curve *pCurve)
Color::eInterpolationDirection dir = Color::ID_DOWN;
for (int i = 0; i <= upperBound; ++i) {
- double x = double(i) / double(upperBound);
+ double x = double (i) / double (upperBound);
if (x > nextX) {
++ptNum;
@@ -1621,12 +3519,12 @@ void ColorGradientCurve::SetRGB(const Curve *pCurve)
}
if (!ptNum) {
- Color::hsv2rgb(float(prevY), 1.f, 1.f, r, g, b);
+ Color::hsv2rgb(float (prevY), 1.f, 1.f, r, g, b);
lut1[i] = r;
lut2[i] = g;
lut3[i] = b;
} else if (ptNum >= nPoints) {
- Color::hsv2rgb(float(nextY), 1.f, 1.f, r, g, b);
+ Color::hsv2rgb(float (nextY), 1.f, 1.f, r, g, b);
lut1[i] = r;
lut2[i] = g;
lut3[i] = b;
@@ -1640,29 +3538,21 @@ void ColorGradientCurve::SetRGB(const Curve *pCurve)
Color::hsv2rgb(h2, 1.f, 1.f, ro, go, bo);
#else
float r1, g1, b1, r2, g2, b2, ro, go, bo;
- Color::hsv2rgb(float(prevY), 1., 1., r1, g1, b1);
- Color::hsv2rgb(float(nextY), 1., 1., r2, g2, b2);
+ Color::hsv2rgb(float (prevY), 1., 1., r1, g1, b1);
+ Color::hsv2rgb(float (nextY), 1., 1., r2, g2, b2);
Color::interpolateRGBColor(currY / dY, r1, g1, b1, r2, g2, b2, Color::CHANNEL_LIGHTNESS | Color::CHANNEL_CHROMATICITY | Color::CHANNEL_HUE, xyz_rgb, rgb_xyz, ro, go, bo);
#endif
lut1[i] = ro;
lut2[i] = go;
lut3[i] = bo;
} else {
- Color::hsv2rgb(float(nextY), 1.f, 1.f, r, g, b);
+ Color::hsv2rgb(float (nextY), 1.f, 1.f, r, g, b);
lut1[i] = r;
lut2[i] = g;
lut3[i] = b;
}
}
}
-
- /*
- #ifndef NDEBUG
- lut1.dump("red");
- lut2.dump("green");
- lut3.dump("blue");
- #endif
- */
}
void ColorGradientCurve::SetRGB(const std::vector &curvePoints)
@@ -1670,7 +3560,7 @@ void ColorGradientCurve::SetRGB(const std::vector &curvePoints)
std::unique_ptr tcurve;
if (!curvePoints.empty() && curvePoints[0] > FCT_Linear && curvePoints[0] < FCT_Unchanged) {
- tcurve = std::unique_ptr(new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2));
+ tcurve = std::unique_ptr (new FlatCurve(curvePoints, false, CURVES_MIN_POLY_POINTS / 2));
}
if (tcurve) {
@@ -1716,18 +3606,18 @@ void PerceptualToneCurve::cubic_spline(const float x[], const float y[], const i
A[i][len - 1] = 6 * (b[i + 1] - b[i]);
}
- for(i = 1; i < len - 2; i++) {
+ for (i = 1; i < len - 2; i++) {
float v = A[i + 1][i] / A[i][i];
- for(j = 1; j <= len - 1; j++) {
+ for (j = 1; j <= len - 1; j++) {
A[i + 1][j] -= v * A[i][j];
}
}
- for(i = len - 2; i > 0; i--) {
+ for (i = len - 2; i > 0; i--) {
float acc = 0;
- for(j = i; j <= len - 2; j++) {
+ for (j = i; j <= len - 2; j++) {
acc += A[i][j] * c[j];
}
@@ -1847,7 +3737,7 @@ float PerceptualToneCurve::calculateToneCurveContrastValue() const
// Note: the analysis is made on the gamma encoded curve, as the LUT is linear we make backwards gamma to
struct find_tc_slope_fun_arg arg = { this };
- float k = find_minimum_interval_halving(find_tc_slope_fun, &arg, 0.1, 5.0, 0.01, 20); // normally found in 8 iterations
+ float k = find_minimum_interval_halving(find_tc_slope_fun, &arg, 0.1, 5.0, 0.01, 20); // normally found in 8 iterations
//fprintf(stderr, "average slope: %f\n", k);
float maxslope = 0;
@@ -1904,7 +3794,7 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
if (oog_r && oog_g && oog_b) {
continue;
}
-
+
float r = CLIP(rc[i]);
float g = CLIP(gc[i]);
float b = CLIP(bc[i]);
@@ -1927,17 +3817,35 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
if (ar >= 65535.f && ag >= 65535.f && ab >= 65535.f) {
// clip fast path, will also avoid strange colours of clipped highlights
//rc[i] = gc[i] = bc[i] = 65535.f;
- if (!oog_r) rc[i] = 65535.f;
- if (!oog_g) gc[i] = 65535.f;
- if (!oog_b) bc[i] = 65535.f;
+ if (!oog_r) {
+ rc[i] = 65535.f;
+ }
+
+ if (!oog_g) {
+ gc[i] = 65535.f;
+ }
+
+ if (!oog_b) {
+ bc[i] = 65535.f;
+ }
+
continue;
}
if (ar <= 0.f && ag <= 0.f && ab <= 0.f) {
//rc[i] = gc[i] = bc[i] = 0;
- if (!oog_r) rc[i] = 0.f;
- if (!oog_g) gc[i] = 0.f;
- if (!oog_b) bc[i] = 0.f;
+ if (!oog_r) {
+ rc[i] = 0.f;
+ }
+
+ if (!oog_g) {
+ gc[i] = 0.f;
+ }
+
+ if (!oog_b) {
+ bc[i] = 0.f;
+ }
+
continue;
}
@@ -1960,11 +3868,11 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
Color::Prophotoxyz(r, g, b, x, y, z);
float J, C, h;
- Ciecam02::xyz2jch_ciecam02float( J, C, h,
- aw, fl,
- x * 0.0015259022f, y * 0.0015259022f, z * 0.0015259022f,
- xw, yw, zw,
- c, nc, pow1, nbb, ncb, cz, d);
+ Ciecam02::xyz2jch_ciecam02float(J, C, h,
+ aw, fl,
+ x * 0.0015259022f, y * 0.0015259022f, z * 0.0015259022f,
+ xw, yw, zw,
+ c, nc, pow1, nbb, ncb, cz, d);
if (!isfinite(J) || !isfinite(C) || !isfinite(h)) {
@@ -1977,9 +3885,18 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
g = newg;
b = newb;
}
- if (!oog_r) rc[i] = r;
- if (!oog_g) gc[i] = g;
- if (!oog_b) bc[i] = b;
+
+ if (!oog_r) {
+ rc[i] = r;
+ }
+
+ if (!oog_g) {
+ gc[i] = g;
+ }
+
+ if (!oog_b) {
+ bc[i] = b;
+ }
continue;
}
@@ -2071,10 +3988,10 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
C *= cmul;
- Ciecam02::jch2xyz_ciecam02float( x, y, z,
- J, C, h,
- xw, yw, zw,
- c, nc, pow1, nbb, ncb, fl, cz, d, aw );
+ Ciecam02::jch2xyz_ciecam02float(x, y, z,
+ J, C, h,
+ xw, yw, zw,
+ c, nc, pow1, nbb, ncb, fl, cz, d, aw);
if (!isfinite(x) || !isfinite(y) || !isfinite(z)) {
// can happen for colours on the rim of being outside gamut, that worked without chroma scaling but not with. Then we return only the curve's result.
@@ -2087,9 +4004,17 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
b = newb;
}
- if (!oog_r) rc[i] = r;
- if (!oog_g) gc[i] = g;
- if (!oog_b) bc[i] = b;
+ if (!oog_r) {
+ rc[i] = r;
+ }
+
+ if (!oog_g) {
+ gc[i] = g;
+ }
+
+ if (!oog_b) {
+ bc[i] = b;
+ }
continue;
}
@@ -2150,9 +4075,18 @@ void PerceptualToneCurve::BatchApply(const size_t start, const size_t end, float
g = newg;
b = newb;
}
- if (!oog_r) rc[i] = r;
- if (!oog_g) gc[i] = g;
- if (!oog_b) bc[i] = b;
+
+ if (!oog_r) {
+ rc[i] = r;
+ }
+
+ if (!oog_g) {
+ gc[i] = g;
+ }
+
+ if (!oog_b) {
+ bc[i] = b;
+ }
}
}
float PerceptualToneCurve::cf_range[2];
@@ -2175,7 +4109,7 @@ void PerceptualToneCurve::init()
Ciecam02::initcam1float(yb, 1.f, f, la, xw, yw, zw, n, d, nbb, ncb,
cz, aw, wh, pfl, fl, c);
- pow1 = pow_F( 1.64f - pow_F( 0.29f, n ), 0.73f );
+ pow1 = pow_F(1.64f - pow_F(0.29f, n), 0.73f);
{
// init contrast-value-to-chroma-scaling conversion curve
@@ -2243,7 +4177,7 @@ void PerceptualToneCurve::initApplyState(PerceptualToneCurveState & state, const
state.Working2Prophoto[i][j] += prophoto_xyz[i][k] * Work[k][j];
}
- Work = ICCStore::getInstance()->workingSpaceInverseMatrix (workingSpace);
+ Work = ICCStore::getInstance()->workingSpaceInverseMatrix(workingSpace);
memset(state.Prophoto2Working, 0, sizeof(state.Prophoto2Working));
for (int i = 0; i < 3; i++)
diff --git a/rtengine/curves.h b/rtengine/curves.h
index 03fa3e812..9eb3d8e56 100644
--- a/rtengine/curves.h
+++ b/rtengine/curves.h
@@ -74,7 +74,8 @@ inline void setUnlessOOG(vfloat &r, vfloat &g, vfloat &b, const vfloat rr, const
bool sanitizeCurve(std::vector& curve);
-namespace curves {
+namespace curves
+{
inline void setLutVal(const LUTf &lut, float &val)
{
@@ -124,33 +125,33 @@ class CurveFactory
protected:
// functions calculating the parameters of the contrast curve based on the desired slope at the center
- static double solve_upper (double m, double c, double deriv);
- static double solve_lower (double m, double c, double deriv);
- static double dupper (const double b, const double m, const double c);
- static double dlower (const double b, const double m, const double c);
+ static double solve_upper(double m, double c, double deriv);
+ static double solve_lower(double m, double c, double deriv);
+ static double dupper(const double b, const double m, const double c);
+ static double dlower(const double b, const double m, const double c);
// basic convex function between (0,0) and (1,1). m1 and m2 controls the slope at the start and end point
- static inline double basel (double x, double m1, double m2)
+ static inline double basel(double x, double m1, double m2)
{
if (x == 0.0) {
return 0.0;
}
- double k = sqrt ((m1 - 1.0) * (m1 - m2) * 0.5) / (1.0 - m2);
+ double k = sqrt((m1 - 1.0) * (m1 - m2) * 0.5) / (1.0 - m2);
double l = (m1 - m2) / (1.0 - m2) + k;
double lx = xlog(x);
return m2 * x + (1.0 - m2) * (2.0 - xexp(k * lx)) * xexp(l * lx);
}
// basic concave function between (0,0) and (1,1). m1 and m2 controls the slope at the start and end point
- static inline double baseu (double x, double m1, double m2)
+ static inline double baseu(double x, double m1, double m2)
{
return 1.0 - basel(1.0 - x, m1, m2);
}
// convex curve between (0,0) and (1,1) with slope m at (0,0). hr controls the highlight recovery
- static inline double cupper (double x, double m, double hr)
+ static inline double cupper(double x, double m, double hr)
{
if (hr > 1.0) {
- return baseu (x, m, 2.0 * (hr - 1.0) / m);
+ return baseu(x, m, 2.0 * (hr - 1.0) / m);
}
double x1 = (1.0 - hr) / m;
@@ -167,12 +168,12 @@ protected:
return 1.0 - hr + hr * baseu((x - x1) / hr, m, 0);
}
// concave curve between (0,0) and (1,1) with slope m at (1,1). sr controls the shadow recovery
- static inline double clower (double x, double m, double sr)
+ static inline double clower(double x, double m, double sr)
{
return 1.0 - cupper(1.0 - x, m, sr);
}
// convex curve between (0,0) and (1,1) with slope m at (0,0). hr controls the highlight recovery
- static inline double cupper2 (double x, double m, double hr)
+ static inline double cupper2(double x, double m, double hr)
{
double x1 = (1.0 - hr) / m;
double x2 = x1 + hr;
@@ -187,7 +188,7 @@ protected:
return 1.0 - hr + hr * baseu((x - x1) / hr, m, 0.3 * hr);
}
- static inline double clower2 (double x, double m, double sr)
+ static inline double clower2(double x, double m, double sr)
{
//curve for b<0; starts with positive slope and then rolls over toward straight line to x=y=1
double x1 = sr / 1.5 + 0.00001;
@@ -201,7 +202,7 @@ protected:
}
// tone curve base. a: slope (from exp.comp.), b: black point normalized by 65535,
// D: max. x value (can be>1), hr,sr: highlight,shadow recovery
- static inline double basecurve (double x, double a, double b, double D, double hr, double sr)
+ static inline double basecurve(double x, double a, double b, double D, double hr, double sr)
{
if (b < 0) {
double m = 0.5;//midpoint
@@ -219,7 +220,7 @@ protected:
double y = a * D > 1.0 ? 0.25 : (m - b / a) * slope;
if (x <= m) {
- return b == 0 ? x * slope : clower (x / m, slope * m / y, sr) * y;
+ return b == 0 ? x * slope : clower(x / m, slope * m / y, sr) * y;
} else if (a * D > 1.0) {
return y + (1.0 - y) * cupper2((x - m) / (D - m), slope * (D - m) / (1.0 - y), hr);
} else {
@@ -227,7 +228,7 @@ protected:
}
}
}
- static inline double simplebasecurve (double x, double b, double sr)
+ static inline double simplebasecurve(double x, double b, double sr)
{
// a = 1, D = 1, hr = 0 (unused for a = D = 1)
if (b == 0.0) {
@@ -248,7 +249,7 @@ protected:
double y = (m - b) * slope;
if (x <= m) {
- return clower (x / m, slope * m / y, sr) * y;
+ return clower(x / m, slope * m / y, sr) * y;
} else {
return y + (x - m) * slope;
}
@@ -281,58 +282,58 @@ public:
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- static inline double centercontrast (double x, double b, double m);
+ static inline double centercontrast(double x, double b, double m);
// standard srgb gamma and its inverse
- static inline double gamma2 (double x)
+ static inline double gamma2(double x)
{
return x <= 0.00304 ? x * 12.92310 : 1.055 * exp(log(x) / sRGBGammaCurve) - 0.055;
}
- static inline double igamma2 (double x)
+ static inline double igamma2(double x)
{
return x <= 0.03928 ? x / 12.92310 : exp(log((x + 0.055) / 1.055) * sRGBGammaCurve);
}
- static inline float gamma2 (float x)
+ static inline float gamma2(float x)
{
return x <= 0.00304f ? x * 12.92310f : 1.055f * expf(logf(x) / static_cast(sRGBGammaCurve)) - 0.055f;
}
- static inline float igamma2 (float x)
+ static inline float igamma2(float x)
{
return x <= 0.03928f ? x / 12.92310f : expf(logf((x + 0.055f) / 1.055f) * static_cast(sRGBGammaCurve));
}
// gamma function with adjustable parameters
- static inline double gamma (double x, double gamma, double start, double slope, double mul, double add)
+ static inline double gamma(double x, double gamma, double start, double slope, double mul, double add)
{
return (x <= start ? x*slope : exp(log(x) / gamma) * mul - add);
}
- static inline double igamma (double x, double gamma, double start, double slope, double mul, double add)
+ static inline double igamma(double x, double gamma, double start, double slope, double mul, double add)
{
- return (x <= start * slope ? x / slope : exp(log((x + add) / mul) * gamma) );
+ return (x <= start * slope ? x / slope : exp(log((x + add) / mul) * gamma));
}
- static inline float gamma (float x, float gamma, float start, float slope, float mul, float add)
+ static inline float gamma(float x, float gamma, float start, float slope, float mul, float add)
{
return (x <= start ? x*slope : xexpf(xlogf(x) / gamma) * mul - add);
}
- static inline float igamma (float x, float gamma, float start, float slope, float mul, float add)
+ static inline float igamma(float x, float gamma, float start, float slope, float mul, float add)
{
- return (x <= start * slope ? x / slope : xexpf(xlogf((x + add) / mul) * gamma) );
+ return (x <= start * slope ? x / slope : xexpf(xlogf((x + add) / mul) * gamma));
}
#ifdef __SSE2__
- static inline vfloat igamma (vfloat x, vfloat gamma, vfloat start, vfloat slope, vfloat mul, vfloat add)
+ static inline vfloat igamma(vfloat x, vfloat gamma, vfloat start, vfloat slope, vfloat mul, vfloat add)
{
#if !defined(__clang__)
- return (x <= start * slope ? x / slope : xexpf(xlogf((x + add) / mul) * gamma) );
+ return (x <= start * slope ? x / slope : xexpf(xlogf((x + add) / mul) * gamma));
#else
return vself(vmaskf_le(x, start * slope), x / slope, xexpf(xlogf((x + add) / mul) * gamma));
#endif
}
#endif
- static inline float hlcurve (const float exp_scale, const float comp, const float hlrange, float level)
+ static inline float hlcurve(const float exp_scale, const float comp, const float hlrange, float level)
{
if (comp > 0.f) {
float val = level + (hlrange - 65536.f);
- if(val == 0.0f) { // to avoid division by zero
+ if (val == 0.0f) { // to avoid division by zero
val = 0.000001f;
}
@@ -350,29 +351,49 @@ public:
}
}
+
public:
- static void complexCurve (double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double contr,
- const std::vector& curvePoints, const std::vector& curvePoints2,
- const LUTu & histogram, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, ToneCurve & outToneCurve, ToneCurve & outToneCurve2,
+ static void complexCurve(double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double contr,
+ const std::vector& curvePoints, const std::vector& curvePoints2,
+ const LUTu & histogram, LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, ToneCurve & outToneCurve, ToneCurve & outToneCurve2,
+ int skip = 1);
- int skip = 1);
- static void curveBW (const std::vector& curvePointsbw, const std::vector& curvePointsbw2, const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw,
- ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, int skip);
-
- static void curveCL ( bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, int skip);
-
- static void curveWavContL ( bool & wavcontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve,/* LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip);
- static void curveDehaContL ( bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram);
- static void mapcurve ( bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram);
-
- static void curveToning ( const std::vector& curvePoints, LUTf & ToningCurve, int skip);
-
- static void complexsgnCurve ( bool & autili, bool & butili, bool & ccutili, bool & clcutili, const std::vector& acurvePoints,
- const std::vector& bcurvePoints, const std::vector& cccurvePoints, const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve,
+ static void complexCurvelocal(double ecomp, double black, double hlcompr, double hlcomprthresh, double shcompr, double br, double cont, double lumare,
+ LUTf & hlCurve, LUTf & shCurve, LUTf & outCurve, LUTf & lightCurveloc, float avg,
int skip = 1);
- static void complexLCurve (double br, double contr, const std::vector& curvePoints, const LUTu & histogram, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, int skip, bool & utili);
- static void curveLightBrightColor (
+ static void Curvelocalhl(double ecomp, double hlcompr, double hlcomprthresh, LUTf & hlCurve);
+
+ static void curveBW(const std::vector& curvePointsbw, const std::vector& curvePointsbw2, const LUTu & histogrambw, LUTu & outBeforeCCurveHistogrambw,
+ ToneCurve & customToneCurvebw1, ToneCurve & customToneCurvebw2, int skip);
+
+ static void curveCL(bool & clcutili, const std::vector& clcurvePoints, LUTf & clCurve, int skip);
+
+ static void curveWavContL(bool & wavcontlutili, const std::vector& wavclcurvePoints, LUTf & wavclCurve,/* LUTu & histogramwavcl, LUTu & outBeforeWavCLurveHistogram,*/int skip);
+ static void curveDehaContL(bool & dehacontlutili, const std::vector& dehaclcurvePoints, LUTf & dehaclCurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram);
+ static void mapcurve(bool & mapcontlutili, const std::vector& mapcurvePoints, LUTf & mapcurve, int skip, const LUTu & histogram, LUTu & outBeforeCurveHistogram);
+
+ static void curveToning(const std::vector& curvePoints, LUTf & ToningCurve, int skip);
+
+ static void curveLocal(bool & locallutili, const std::vector& curvePoints, LUTf & LocalLCurve, int skip);
+ static void curveCCLocal(bool & localcutili, const std::vector& curvePoints, LUTf & LocalCCurve, int skip);
+ static void curveskLocal(bool & localskutili, const std::vector& curvePoints, LUTf & LocalskCurve, int skip);
+ static void curveexLocal(bool & localexutili, const std::vector& curvePoints, LUTf & LocalexCurve, int skip);
+ static void curvemaskLocal(bool & localmaskutili, const std::vector& curvePoints, LUTf & LocalmaskCurve, int skip);
+
+ static void complexsgnCurve(bool & autili, bool & butili, bool & ccutili, bool & clcutili, const std::vector& acurvePoints,
+ const std::vector& bcurvePoints, const std::vector& cccurvePoints, const std::vector& lccurvePoints, LUTf & aoutCurve, LUTf & boutCurve, LUTf & satCurve, LUTf & lhskCurve,
+ int skip = 1);
+
+ static void localLCurve(double br, double contr,/* const std::vector& curvePoints,*/ LUTu & histogram, LUTf & outCurve, int skip, bool & utili);
+
+ static void updatechroma(
+ const std::vector& cccurvePoints,
+ LUTu & histogramC, LUTu & outBeforeCCurveHistogramC,//for chroma
+ int skip = 1);
+ static void complexLCurve(double br, double contr, const std::vector& curvePoints, const LUTu & histogram, LUTf & outCurve, LUTu & outBeforeCCurveHistogram, int skip, bool & utili);
+
+ static void curveLightBrightColor(
const std::vector& curvePoints,
const std::vector& curvePoints2,
const std::vector& curvePoints3,
@@ -382,7 +403,7 @@ public:
ColorAppearance & outColCurve2,
ColorAppearance & outColCurve3,
int skip = 1);
- static void RGBCurve (const std::vector& curvePoints, LUTf & outCurve, int skip);
+ static void RGBCurve(const std::vector& curvePoints, LUTf & outCurve, int skip);
};
@@ -420,23 +441,23 @@ protected:
double increment;
int nbr_points;
- static inline double p00 (double x, double prot)
+ static inline double p00(double x, double prot)
{
- return CurveFactory::clower (x, 2.0, prot);
+ return CurveFactory::clower(x, 2.0, prot);
}
- static inline double p11 (double x, double prot)
+ static inline double p11(double x, double prot)
{
- return CurveFactory::cupper (x, 2.0, prot);
+ return CurveFactory::cupper(x, 2.0, prot);
}
- static inline double p01 (double x, double prot)
+ static inline double p01(double x, double prot)
{
- return x <= 0.5 ? CurveFactory::clower (x * 2, 2.0, prot) * 0.5 : 0.5 + CurveFactory::cupper ((x - 0.5) * 2, 2.0, prot) * 0.5;
+ return x <= 0.5 ? CurveFactory::clower(x * 2, 2.0, prot) * 0.5 : 0.5 + CurveFactory::cupper((x - 0.5) * 2, 2.0, prot) * 0.5;
}
- static inline double p10 (double x, double prot)
+ static inline double p10(double x, double prot)
{
- return x <= 0.5 ? CurveFactory::cupper (x * 2, 2.0, prot) * 0.5 : 0.5 + CurveFactory::clower ((x - 0.5) * 2, 2.0, prot) * 0.5;
+ return x <= 0.5 ? CurveFactory::cupper(x * 2, 2.0, prot) * 0.5 : 0.5 + CurveFactory::clower((x - 0.5) * 2, 2.0, prot) * 0.5;
}
- static inline double pfull (double x, double prot, double sh, double hl)
+ static inline double pfull(double x, double prot, double sh, double hl)
{
return (1 - sh) * (1 - hl) * p00(x, prot) + sh * hl * p11(x, prot) + (1 - sh) * hl * p01(x, prot) + sh * (1 - hl) * p10(x, prot);
}
@@ -445,15 +466,15 @@ protected:
void fillDyByDx();
public:
- Curve ();
- virtual ~Curve () {};
- void AddPolygons ();
- int getSize () const; // return the number of control points
+ Curve();
+ virtual ~Curve() {};
+ void AddPolygons();
+ int getSize() const; // return the number of control points
void getControlPoint(int cpNum, double &x, double &y) const;
- virtual double getVal (double t) const = 0;
- virtual void getVal (const std::vector& t, std::vector& res) const = 0;
+ virtual double getVal(double t) const = 0;
+ virtual void getVal(const std::vector& t, std::vector& res) const = 0;
- virtual bool isIdentity () const = 0;
+ virtual bool isIdentity() const = 0;
};
class DiagonalCurve final : public Curve
@@ -462,23 +483,23 @@ class DiagonalCurve final : public Curve
protected:
DiagonalCurveType kind;
- void spline_cubic_set ();
+ void spline_cubic_set();
void catmull_rom_set();
- void NURBS_set ();
+ void NURBS_set();
public:
- explicit DiagonalCurve (const std::vector& points, int ppn = CURVES_MIN_POLY_POINTS);
- ~DiagonalCurve () override;
+ DiagonalCurve(const std::vector& points, int ppn = CURVES_MIN_POLY_POINTS);
+ ~DiagonalCurve() override;
- double getVal (double t) const override;
- void getVal (const std::vector& t, std::vector& res) const override;
- bool isIdentity () const override
+ double getVal(double t) const override;
+ void getVal(const std::vector& t, std::vector& res) const override;
+ bool isIdentity() const override
{
return kind == DCT_Empty;
};
};
-class FlatCurve final : public Curve, public rtengine::NonCopyable
+class FlatCurve final : public Curve
{
private:
@@ -488,17 +509,17 @@ private:
double identityValue;
bool periodic;
- void CtrlPoints_set ();
+ void CtrlPoints_set();
public:
- explicit FlatCurve (const std::vector& points, bool isPeriodic = true, int ppn = CURVES_MIN_POLY_POINTS);
- ~FlatCurve () override;
+ FlatCurve(const std::vector& points, bool isPeriodic = true, int ppn = CURVES_MIN_POLY_POINTS);
+ ~FlatCurve() override;
- double getVal (double t) const override;
- void getVal (const std::vector& t, std::vector& res) const override;
- bool setIdentityValue (double iVal);
- bool isIdentity () const override
+ double getVal(double t) const override;
+ void getVal(const std::vector& t, std::vector& res) const override;
+ bool setIdentityValue(double iVal);
+ bool isIdentity() const override
{
return kind == FCT_Empty;
};
@@ -581,11 +602,11 @@ public:
void Set(const std::vector &curvePoints, bool &opautili);
// TODO: transfer this method to the Color class...
- float blend (float x, float lower, float upper) const
+ float blend(float x, float lower, float upper) const
{
return (upper - lower) * lutOpacityCurve[x * 500.f] + lower;
}
- void blend3f (float x, float lower1, float upper1, float &result1, float lower2, float upper2, float &result2, float lower3, float upper3, float &result3) const
+ void blend3f(float x, float lower1, float upper1, float &result1, float lower2, float upper2, float &result2, float lower3, float upper3, float &result3) const
{
float opacity = lutOpacityCurve[x * 500.f];
result1 = (upper1 - lower1) * opacity + lower1;
@@ -599,6 +620,795 @@ public:
}
};
+class LocLHCurve
+{
+private:
+ LUTf lutLocLHCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocLHCurve() {};
+ LocLHCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool &LHutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocLHCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocLHCurve;
+ }
+};
+
+class LocHHmaskblCurve
+{
+private:
+ LUTf lutLocHHmaskblCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocHHmaskblCurve() {};
+ LocHHmaskblCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & lhmasblutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocHHmaskblCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocHHmaskblCurve;
+ }
+};
+
+class LocCCmaskblCurve
+{
+private:
+ LUTf lutLocCCmaskblCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocCCmaskblCurve() {};
+ LocCCmaskblCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & lcmasblutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocCCmaskblCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocCCmaskblCurve;
+ }
+};
+
+class LocLLmaskblCurve
+{
+private:
+ LUTf lutLocLLmaskblCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocLLmaskblCurve() {};
+ LocLLmaskblCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & llmasblutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocLLmaskblCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocLLmaskblCurve;
+ }
+};
+
+
+
+class LocHHmasktmCurve
+{
+private:
+ LUTf lutLocHHmasktmCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocHHmasktmCurve() {};
+ LocHHmasktmCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & lhmastmutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocHHmasktmCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocHHmasktmCurve;
+ }
+};
+
+
+class LocCCmasktmCurve
+{
+private:
+ LUTf lutLocCCmasktmCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocCCmasktmCurve() {};
+ LocCCmasktmCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & lcmastmutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocCCmasktmCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocCCmasktmCurve;
+ }
+};
+
+class LocLLmasktmCurve
+{
+private:
+ LUTf lutLocLLmasktmCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocLLmasktmCurve() {};
+ LocLLmasktmCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & llmastmutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocLLmasktmCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocLLmasktmCurve;
+ }
+};
+
+
+
+class LocHHmaskretiCurve
+{
+private:
+ LUTf lutLocHHmaskretiCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocHHmaskretiCurve() {};
+ LocHHmaskretiCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & lhmasretiutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocHHmaskretiCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocHHmaskretiCurve;
+ }
+};
+
+
+class LocCCmaskretiCurve
+{
+private:
+ LUTf lutLocCCmaskretiCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocCCmaskretiCurve() {};
+ LocCCmaskretiCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & lcmasretiutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocCCmaskretiCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocCCmaskretiCurve;
+ }
+};
+
+class LocLLmaskretiCurve
+{
+private:
+ LUTf lutLocLLmaskretiCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocLLmaskretiCurve() {};
+ LocLLmaskretiCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & llmasretiutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocLLmaskretiCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocLLmaskretiCurve;
+ }
+};
+
+
+
+
+
+class LocHHmaskcbCurve
+{
+private:
+ LUTf lutLocHHmaskcbCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocHHmaskcbCurve() {};
+ LocHHmaskcbCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & lhmascbutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocHHmaskcbCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocHHmaskcbCurve;
+ }
+};
+
+
+class LocCCmaskcbCurve
+{
+private:
+ LUTf lutLocCCmaskcbCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocCCmaskcbCurve() {};
+ LocCCmaskcbCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & lcmascbutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocCCmaskcbCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocCCmaskcbCurve;
+ }
+};
+
+class LocLLmaskcbCurve
+{
+private:
+ LUTf lutLocLLmaskcbCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocLLmaskcbCurve() {};
+ LocLLmaskcbCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & llmascbutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocLLmaskcbCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocLLmaskcbCurve;
+ }
+};
+
+
+
+
+class LocHHmaskexpCurve
+{
+private:
+ LUTf lutLocHHmaskexpCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocHHmaskexpCurve() {};
+ LocHHmaskexpCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & lhmasexputili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocHHmaskexpCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocHHmaskexpCurve;
+ }
+};
+
+
+class LocCCmaskexpCurve
+{
+private:
+ LUTf lutLocCCmaskexpCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocCCmaskexpCurve() {};
+ LocCCmaskexpCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & lcmasexputili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocCCmaskexpCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocCCmaskexpCurve;
+ }
+};
+
+class LocLLmaskexpCurve
+{
+private:
+ LUTf lutLocLLmaskexpCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocLLmaskexpCurve() {};
+ LocLLmaskexpCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & llmasexputili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocLLmaskexpCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocLLmaskexpCurve;
+ }
+};
+
+
+class LocHHmaskSHCurve
+{
+private:
+ LUTf lutLocHHmaskSHCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocHHmaskSHCurve() {};
+ LocHHmaskSHCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & lhmasSHutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocHHmaskSHCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocHHmaskSHCurve;
+ }
+};
+
+
+class LocCCmaskSHCurve
+{
+private:
+ LUTf lutLocCCmaskSHCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocCCmaskSHCurve() {};
+ LocCCmaskSHCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & lcmasSHutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocCCmaskSHCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocCCmaskSHCurve;
+ }
+};
+
+class LocLLmaskSHCurve
+{
+private:
+ LUTf lutLocLLmaskSHCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocLLmaskSHCurve() {};
+ LocLLmaskSHCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & llmasSHutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocLLmaskSHCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocLLmaskSHCurve;
+ }
+};
+
+
+
+
+class LocHHmaskCurve
+{
+private:
+ LUTf lutLocHHmaskCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocHHmaskCurve() {};
+ LocHHmaskCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & lhmasutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocHHmaskCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocHHmaskCurve;
+ }
+};
+
+
+class LocCCmaskCurve
+{
+private:
+ LUTf lutLocCCmaskCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocCCmaskCurve() {};
+ LocCCmaskCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & lcmasutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocCCmaskCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocCCmaskCurve;
+ }
+};
+
+class LocLLmaskCurve
+{
+private:
+ LUTf lutLocLLmaskCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocLLmaskCurve() {};
+ LocLLmaskCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool & llmasutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocLLmaskCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocLLmaskCurve;
+ }
+};
+
+
+class LocHHCurve
+{
+private:
+ LUTf lutLocHHCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocHHCurve() {};
+ LocHHCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool &HHutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocHHCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocHHCurve;
+ }
+};
+
+class LocretigainCurve
+{
+private:
+ LUTf lutLocretigainCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocretigainCurve() {};
+ LocretigainCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocretigainCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocretigainCurve;
+ }
+};
+
+class LocretitransCurve
+{
+private:
+ LUTf lutLocretitransCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocretitransCurve() {};
+ LocretitransCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocretitransCurve[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocretitransCurve;
+ }
+};
+
+
+class LocwavCurve
+{
+private:
+ LUTf lutLocwavCurve; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocwavCurve() {};
+ LocwavCurve();
+ void Reset();
+ void Set(const std::vector &curvePoints, bool &lcwavutili);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocwavCurve[index];
+ }
+
+#ifdef __SSE2__
+ vfloat operator[](vfloat index) const
+ {
+ return lutLocwavCurve[index];
+ }
+#endif
+
+ operator bool (void) const
+ {
+ return lutLocwavCurve;
+ }
+};
+
+
+class LocretigainCurverab
+{
+private:
+ LUTf lutLocretigainCurverab; // 0xffff range
+ void Set(const Curve &pCurve);
+
+public:
+ float sum;
+
+ virtual ~LocretigainCurverab() {};
+ LocretigainCurverab();
+ void Reset();
+ void Set(const std::vector &curvePoints);
+ float getSum() const
+ {
+ return sum;
+ }
+
+ float operator[](float index) const
+ {
+ return lutLocretigainCurverab[index];
+ }
+ operator bool (void) const
+ {
+ return lutLocretigainCurverab;
+ }
+};
+
+
class WavCurve
{
private:
@@ -673,6 +1483,32 @@ public:
return lutOpacityCurveRG;
}
};
+
+class WavOpacityCurveSH
+{
+private:
+ LUTf lutOpacityCurveSH; // 0xffff range
+ void Set(const Curve &pCurve);
+public:
+ virtual ~WavOpacityCurveSH() {};
+ WavOpacityCurveSH();
+
+ void Reset();
+ // void Set(const std::vector &curvePoints, bool &opautili);
+ void Set(const std::vector &curvePoints);
+ float operator[](float index) const
+ {
+ return lutOpacityCurveSH[index];
+ }
+
+ operator bool (void) const
+ {
+ return lutOpacityCurveSH;
+ }
+};
+
+
+
class WavOpacityCurveBY
{
private:
@@ -824,10 +1660,10 @@ public:
};
//lightness curve
-inline void Lightcurve::Apply (float& Li) const
+inline void Lightcurve::Apply(float& Li) const
{
- assert (lutColCurve);
+ assert(lutColCurve);
curves::setLutVal(lutColCurve, Li);
}
@@ -839,10 +1675,10 @@ public:
};
//brightness curve
-inline void Brightcurve::Apply (float& Br) const
+inline void Brightcurve::Apply(float& Br) const
{
- assert (lutColCurve);
+ assert(lutColCurve);
curves::setLutVal(lutColCurve, Br);
}
@@ -854,10 +1690,10 @@ public:
};
//Chroma curve
-inline void Chromacurve::Apply (float& Cr) const
+inline void Chromacurve::Apply(float& Cr) const
{
- assert (lutColCurve);
+ assert(lutColCurve);
curves::setLutVal(lutColCurve, Cr);
}
@@ -868,10 +1704,10 @@ public:
};
//Saturation curve
-inline void Saturcurve::Apply (float& Sa) const
+inline void Saturcurve::Apply(float& Sa) const
{
- assert (lutColCurve);
+ assert(lutColCurve);
curves::setLutVal(lutColCurve, Sa);
}
@@ -883,10 +1719,10 @@ public:
};
//Colorfullness curve
-inline void Colorfcurve::Apply (float& Cf) const
+inline void Colorfcurve::Apply(float& Cf) const
{
- assert (lutColCurve);
+ assert(lutColCurve);
curves::setLutVal(lutColCurve, Cf);
}
@@ -901,8 +1737,8 @@ public:
// and ending at `r[end]` (and respectively for `b` and `g`). Uses SSE
// and requires that `r`, `g`, and `b` pointers have the same alignment.
void BatchApply(
- const size_t start, const size_t end,
- float *r, float *g, float *b) const;
+ const size_t start, const size_t end,
+ float *r, float *g, float *b) const;
};
class AdobeToneCurve : public ToneCurve
@@ -971,27 +1807,30 @@ public:
};
// Standard tone curve
-inline void StandardToneCurve::Apply (float& r, float& g, float& b) const
+inline void StandardToneCurve::Apply(float& r, float& g, float& b) const
{
- assert (lutToneCurve);
+ assert(lutToneCurve);
curves::setLutVal(lutToneCurve, r, g, b);
}
+
inline void StandardToneCurve::BatchApply(
- const size_t start, const size_t end,
- float *r, float *g, float *b) const {
- assert (lutToneCurve);
- assert (lutToneCurve.getClip() & LUT_CLIP_BELOW);
- assert (lutToneCurve.getClip() & LUT_CLIP_ABOVE);
+ const size_t start, const size_t end,
+ float *r, float *g, float *b) const
+{
+ assert(lutToneCurve);
+ assert(lutToneCurve.getClip() & LUT_CLIP_BELOW);
+ assert(lutToneCurve.getClip() & LUT_CLIP_ABOVE);
// All pointers must have the same alignment for SSE usage. In the loop body below,
// we will only check `r`, assuming that the same result would hold for `g` and `b`.
- assert (reinterpret_cast(r) % 16 == reinterpret_cast(g) % 16);
- assert (reinterpret_cast(g) % 16 == reinterpret_cast(b) % 16);
+ assert(reinterpret_cast(r) % 16 == reinterpret_cast(g) % 16);
+ assert(reinterpret_cast(g) % 16 == reinterpret_cast(b) % 16);
size_t i = start;
+
while (true) {
if (i >= end) {
// If we get to the end before getting to an aligned address, just return.
@@ -1003,11 +1842,13 @@ inline void StandardToneCurve::BatchApply(
break;
#endif
}
+
setUnlessOOG(r[i], g[i], b[i], lutToneCurve[r[i]], lutToneCurve[g[i]], lutToneCurve[b[i]]);
i++;
}
#ifdef __SSE2__
+
for (; i + 3 < end; i += 4) {
vfloat r_val = LVF(r[i]);
vfloat g_val = LVF(g[i]);
@@ -1022,39 +1863,40 @@ inline void StandardToneCurve::BatchApply(
for (; i < end; ++i) {
setUnlessOOG(r[i], g[i], b[i], lutToneCurve[r[i]], lutToneCurve[g[i]], lutToneCurve[b[i]]);
}
+
#endif
}
// Tone curve according to Adobe's reference implementation
// values in 0xffff space
// inlined to make sure there will be no cache flush when used
-inline void AdobeToneCurve::Apply (float& ir, float& ig, float& ib) const
+inline void AdobeToneCurve::Apply(float& ir, float& ig, float& ib) const
{
- assert (lutToneCurve);
+ assert(lutToneCurve);
float r = CLIP(ir);
float g = CLIP(ig);
float b = CLIP(ib);
if (r >= g) {
- if (g > b) {
- RGBTone (r, g, b); // Case 1: r >= g > b
+ if (g > b) {
+ RGBTone(r, g, b); // Case 1: r >= g > b
} else if (b > r) {
- RGBTone (b, r, g); // Case 2: b > r >= g
+ RGBTone(b, r, g); // Case 2: b > r >= g
} else if (b > g) {
- RGBTone (r, b, g); // Case 3: r >= b > g
+ RGBTone(r, b, g); // Case 3: r >= b > g
} else { // Case 4: r == g == b
r = lutToneCurve[r];
g = lutToneCurve[g];
b = g;
}
} else {
- if (r >= b) {
- RGBTone (g, r, b); // Case 5: g > r >= b
+ if (r >= b) {
+ RGBTone(g, r, b); // Case 5: g > r >= b
} else if (b > g) {
- RGBTone (b, g, r); // Case 6: b > g > r
+ RGBTone(b, g, r); // Case 6: b > g > r
} else {
- RGBTone (g, b, r); // Case 7: g >= b > r
+ RGBTone(g, b, r); // Case 7: g >= b > r
}
}
@@ -1146,19 +1988,20 @@ inline void AdobeToneCurve::RGBTone (vfloat& maxval, vfloat& medval, vfloat& min
// Modifying the Luminance channel only
inline void LuminanceToneCurve::Apply(float &ir, float &ig, float &ib) const
{
- assert (lutToneCurve);
+ assert(lutToneCurve);
float r = CLIP(ir);
float g = CLIP(ig);
float b = CLIP(ib);
float currLuminance = r * 0.2126729f + g * 0.7151521f + b * 0.0721750f;
+
const float newLuminance = lutToneCurve[currLuminance];
currLuminance = currLuminance == 0.f ? 0.00001f : currLuminance;
const float coef = newLuminance / currLuminance;
- r = LIM