From 1bbcd038e9f7203b7f6fb795d89751084dda5ac3 Mon Sep 17 00:00:00 2001 From: natureh 510 Date: Sun, 12 May 2013 20:17:01 +0200 Subject: [PATCH] Issue 1858: "Defringe specific colors only" on behalf of J. Desmis --- rtdata/languages/Francais | 30 ++++++-- rtdata/languages/default | 4 ++ rtdata/profiles/BW 1.pp3 | 2 +- rtdata/profiles/BW 2.pp3 | 2 +- rtdata/profiles/BW 3.pp3 | 2 +- rtdata/profiles/BW 4.pp3 | 2 +- rtdata/profiles/Deep Shadows.pp3 | 2 +- rtdata/profiles/Default ISO High.pp3 | 2 +- rtdata/profiles/Default ISO Medium.pp3 | 2 +- rtdata/profiles/Default.pp3 | 4 +- rtdata/profiles/Equilibrated.pp3 | 2 +- rtdata/profiles/Faded Amber 1 TM Bright.pp3 | 2 +- rtdata/profiles/Faded Amber 1 TM.pp3 | 2 +- rtdata/profiles/Faded Amber 1.pp3 | 2 +- rtdata/profiles/Faded Blue 1 TM Bright.pp3 | 2 +- rtdata/profiles/Faded Blue 1 TM.pp3 | 2 +- rtdata/profiles/Faded Blue 1.pp3 | 2 +- rtdata/profiles/Faded Blue Pink TM.pp3 | 2 +- rtdata/profiles/Faded Blue Pink.pp3 | 2 +- .../profiles/Faded Chocolate 1 TM Bright.pp3 | 2 +- .../profiles/Faded Chocolate 2 TM Bright.pp3 | 2 +- rtdata/profiles/Faded Golden 1.pp3 | 2 +- rtdata/profiles/Faded Golden 2.pp3 | 2 +- rtdata/profiles/Faded Green 1 TM Bright.pp3 | 2 +- rtdata/profiles/Faded Green 1 TM.pp3 | 2 +- rtdata/profiles/Faded Green 1.pp3 | 2 +- rtdata/profiles/Faded Green 2.pp3 | 2 +- rtdata/profiles/Faded Green 3.pp3 | 2 +- rtdata/profiles/Faded Neutral TM.pp3 | 2 +- rtdata/profiles/Faded Neutral.pp3 | 2 +- rtdata/profiles/Faded Purple 1 TM Bright.pp3 | 2 +- rtdata/profiles/Faded Purple 1 TM.pp3 | 2 +- rtdata/profiles/Faded Purple 1.pp3 | 2 +- rtdata/profiles/Faded Purple 2 TM.pp3 | 2 +- rtdata/profiles/Faded Purple 2.pp3 | 2 +- .../profiles/Faded Teal Orange TM Bright.pp3 | 2 +- rtdata/profiles/Faded Teal Orange TM.pp3 | 2 +- rtdata/profiles/Faded Teal Orange.pp3 | 2 +- rtdata/profiles/Faded Warm 1 TM Bright.pp3 | 2 +- rtdata/profiles/Faded Warm 1 TM.pp3 | 2 +- rtdata/profiles/Faded Warm 1.pp3 | 2 +- rtdata/profiles/Faded Warm 2.pp3 | 2 +- rtdata/profiles/Faded Warm 3.pp3 | 2 +- rtdata/profiles/High-Key.pp3 | 2 +- rtdata/profiles/Natural 1.pp3 | 2 +- rtdata/profiles/Natural 2.pp3 | 2 +- rtdata/profiles/Neutral.pp3 | 3 +- rtdata/profiles/Pop 1.pp3 | 2 +- rtdata/profiles/Pop 2 L.pp3 | 2 +- rtdata/profiles/Pop 3 Skin.pp3 | 2 +- rtdata/profiles/Pop 4 BW.pp3 | 2 +- rtdata/profiles/Portrait Lejto.pp3 | 2 +- rtdata/profiles/Portrait Smooth.pp3 | 2 +- rtdata/profiles/Punchy 1.pp3 | 2 +- rtdata/profiles/Punchy 2.pp3 | 2 +- rtdata/profiles/Skintones - Natural TM.pp3 | 2 +- rtdata/profiles/Skintones - Natural.pp3 | 2 +- .../profiles/Skintones - Pale TM Bright.pp3 | 2 +- rtdata/profiles/Skintones - Pale TM.pp3 | 2 +- rtdata/profiles/Skintones - Pale.pp3 | 2 +- rtdata/profiles/Skintones - Soft Texture.pp3 | 2 +- .../profiles/Skintones - Strong Texture.pp3 | 2 +- rtdata/profiles/Skintones - Studio TM.pp3 | 2 +- rtdata/profiles/Skintones - Studio.pp3 | 2 +- .../profiles/Skintones - StudioBase 1 TM.pp3 | 2 +- rtdata/profiles/Skintones - StudioBase 1.pp3 | 2 +- rtengine/PF_correct_RT.cc | 42 +++++++++-- rtengine/color.cc | 16 +++++ rtengine/color.h | 1 + rtengine/curves.cc | 7 +- rtengine/curves.h | 2 + rtengine/flatcurves.cc | 40 ++++++++--- rtengine/improcfun.cc | 14 +--- rtengine/procevents.h | 4 +- rtengine/procparams.cc | 39 ++++++++++- rtengine/procparams.h | 59 ++++++++-------- rtengine/refreshmap.cc | 3 +- rtgui/curveeditor.cc | 3 +- rtgui/curveeditor.h | 5 ++ rtgui/curveeditorgroup.cc | 2 +- rtgui/curveeditorgroup.h | 2 +- rtgui/defringe.cc | 69 ++++++++++++++++--- rtgui/defringe.h | 16 ++++- rtgui/diagonalcurveeditorsubgroup.cc | 2 +- rtgui/diagonalcurveeditorsubgroup.h | 2 +- rtgui/flatcurveeditorsubgroup.cc | 4 +- rtgui/flatcurveeditorsubgroup.h | 2 +- rtgui/mycurve.h | 2 +- rtgui/mydiagonalcurve.cc | 2 +- rtgui/mydiagonalcurve.h | 2 +- rtgui/myflatcurve.cc | 8 +-- rtgui/myflatcurve.h | 4 +- rtgui/options.cc | 5 ++ rtgui/options.h | 1 + rtgui/paramsedited.cc | 9 ++- rtgui/paramsedited.h | 1 + rtgui/ppversion.h | 2 +- 97 files changed, 361 insertions(+), 174 deletions(-) diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 5bf947779..7f4fc8391 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -1,4 +1,3 @@ - ABOUT_TAB_BUILD;Version ABOUT_TAB_CREDITS;Crédits ABOUT_TAB_LICENSE;Licence @@ -69,6 +68,7 @@ EXPORT_BYPASS_RAW_DF;Forcer la Trame Noire [raw] EXPORT_BYPASS_RAW_FF;Forcer le Champ Uniforme [raw] EXPORT_BYPASS_RAW_GREENTHRESH;Forcer l'équilibrage du vert [raw] EXPORT_BYPASS_RAW_LINENOISE;Forcer le filtre de bruit de ligne [raw] +EXPORT_BYPASS_RAW_LMMSE_ITERATIONS;Forcer le niveau d'amélioration LMMSE [raw] EXPORT_BYPASS_SHARPENEDGE;Forcer netteté des bords EXPORT_BYPASS_SHARPENING;Forcer la netteté EXPORT_BYPASS_SHARPENMICRO;Forcer netteté des microcontrastes @@ -94,6 +94,7 @@ FILEBROWSER_CACHECLEARFROMFULL;Supprimer du cache (complet) FILEBROWSER_CACHECLEARFROMPARTIAL;Supprimer du cache (partiel) FILEBROWSER_CACHE;Cache FILEBROWSER_CLEARPROFILE;Remettre le profil à zéro +FILEBROWSER_COLORLABEL_TOOLTIP;Label couleur\n\nUtilisez le menu déroulant ou le raccourcis clavier:\nShift-Ctrl-1 Red\nShift-Ctrl-2 Yellow\nShift-Ctrl-3 Green\nShift-Ctrl-4 Blue\nShift-Ctrl-5 Purple FILEBROWSER_COPYPROFILE;Copier le profil FILEBROWSER_CURRENT_NAME;Nom courant: FILEBROWSER_DARKFRAME;Trame Noire @@ -151,7 +152,12 @@ FILEBROWSER_PROCESSINGSETTINGSHINT;Règle le format de fichier et le dossier de FILEBROWSER_PROCESSINGSETTINGS;Réglages FILEBROWSER_QUERYBUTTONHINT;Effacer la recherche FILEBROWSER_QUERYHINT;Taper la partie du nom du fichier à chercher ou une liste spéarée par des virgules.\nEx: 1001.1004.1199\n\nCtrl-F pour placer le curseur dans le champ de saisie.\nEntrée pour lancer la recherche\nEsc pour effacer.\nShift-Esc pour enlever le focus. -FILEBROWSER_QUERYLABEL;Chercher: +FILEBROWSER_QUERYLABEL;Chercher: +FILEBROWSER_RANK1_TOOLTIP;Rang 1 *\nRaccourcis: Shift-1 +FILEBROWSER_RANK2_TOOLTIP;Rang 2 *\nRaccourcis: Shift-2 +FILEBROWSER_RANK3_TOOLTIP;Rang 3 *\nRaccourcis: Shift-3 +FILEBROWSER_RANK4_TOOLTIP;Rang 4 *\nRaccourcis: Shift-4 +FILEBROWSER_RANK5_TOOLTIP;Rang 5 *\nRaccourcis: Shift-5 FILEBROWSER_RENAMEDLGLABEL;Renommage du fichier FILEBROWSER_RENAMEDLGMSG;Renommer le fichier "%1" en: FILEBROWSER_SELECTDARKFRAME;Choisir une image de Trame Noire... @@ -182,6 +188,7 @@ FILEBROWSER_STOPPROCESSINGHINT;Arrête le traitement des images FILEBROWSER_STOPPROCESSING;Arrêter le traitement FILEBROWSER_THUMBSIZE;Taille vign. FILEBROWSER_TOOLTIP_STOPPROCESSING;Démarrer automatiquement le traitement à l'arrivée d'une nouvelle tâche +FILEBROWSER_UNRANK_TOOLTIP;Effacer le rang\nRaccourcis: Shift - ~ FILEBROWSER_USETEMPLATE;Utiliser le modèle: FILEBROWSER_ZOOMINHINT;Augmenter la taille des vignettes.\nRaccourcis: +\n\nRaccourcis dans le mode Éditeur unique: Alt + FILEBROWSER_ZOOMOUTHINT;Diminuer la taille des vignettes.\nRaccourcis: -\n\nRaccourcis dans le mode Éditeur unique: Alt - @@ -432,6 +439,9 @@ HISTORY_MSG_201;Réd. de bruit - Delta chrom. rouge HISTORY_MSG_202;Réd. de bruit - Delta chrom. bleu HISTORY_MSG_203;Réd. de bruit - Méthode HISTORY_MSG_204;Niveau d'amélioration LMMSE +HISTORY_MSG_205;CAM02 pixels chauds/morts +HISTORY_MSG_206;CAT02 - Adapt. auto à la scène +HISTORY_MSG_207;A.C. - Teinte HISTORY_NEWSNAPSHOTAS;Sous... HISTORY_NEWSNAPSHOT;Ajouter HISTORY_NEWSNAPSHOT_TOOLTIP;Raccourcis: Alt-s @@ -925,16 +935,19 @@ TP_COARSETRAF_TOOLTIP_HFLIP;Symétriser / axe vertical TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotation vers la gauche\nRaccourcis: [\n\nRaccourcis en mode Éditeur unique: Alt-[ TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotation vers la droite\nRaccourcis: ]\n\nRaccourcis en mode Éditeur unique: Alt-] TP_COARSETRAF_TOOLTIP_VFLIP;Symétriser / axe horizontal -TP_COLORAPP_ADAPTSCENE;Luminosité d'adaptation (cd/m2) -TP_COLORAPP_ADAPTSCENE_TOOLTIP;Luminance absolue de l'environnement de la scène\n(souvent 2000cd/m2) -TP_COLORAPP_ADAPTVIEWING;Luminosité d'adaptation (cd/m2) -TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Luminance absolue de l'environnement de visionnage\n(souvent 16cd/m2) +TP_COLORAPP_ADAP_AUTO_TOOLTIP;Si la case est cochée (recommendé), une valeur optimum est calculée à partir des données Exif.\nPour régler la valeur manuellement, décochez d'abord la case +TP_COLORAPP_ADAPTSCENE;Luminosité d'adaptation +TP_COLORAPP_ADAPTSCENE_TOOLTIP;Luminance absolue de l'environnement de la scène(cd/m²).\n1)Calculé à partir des données Exif:\nVitess d'obturation - val. ISO - ouverture F - Correction d'expos. du boitier.\n2)Calculé aussi à partir du Point Blanc Raw et de la compensation d'Exposition de RawTherapee +TP_COLORAPP_ADAPTVIEWING;Luminosité d'adaptation (cd/m²) +TP_COLORAPP_ADAPTVIEWING_TOOLTIP;Luminance absolue de l'environnement de visionnage\n(souvent 16cd/m²) TP_COLORAPP_ALGO;Algorithme TP_COLORAPP_ALGO_ALL;Tout TP_COLORAPP_ALGO_JC;Luminosité + Chroma (JC) TP_COLORAPP_ALGO_JS;Luminosité + Saturation (JS) TP_COLORAPP_ALGO_QM;Brillance + Niveau de couleur (QM) TP_COLORAPP_ALGO_TOOLTIP;Permet de choisir entre des jeux réduits de paramètre ou tout les paramètres +TP_COLORAPP_BADPIXSL;Filtrer les pixels chauds/morts +TP_COLORAPP_BADPIXSL_TOOLTIP;Suppression des pixels chauds/morts (colorés de manière intense).\n0=Aucun effet 1=Médian 2=Gaussien.\n\nCes artefacts sont dues aux limitations de CIECAM02. Vous pouvez également adjuster l'image afin d'éviter les ombres très sombres. TP_COLORAPP_BRIGHT;Brillance (Q) TP_COLORAPP_BRIGHT_TOOLTIP;Brillance dans CIECAM02 est différent de Lab et RVB, prend en compte la luminosité du blanc TP_COLORAPP_CHROMA;Chroma (C) @@ -1019,6 +1032,8 @@ TP_DARKFRAME_LABEL;Trame Noire TP_DEFRINGE_LABEL;Aberration chromatique (lab / ciecam02) TP_DEFRINGE_RADIUS;Rayon TP_DEFRINGE_THRESHOLD;Seuil +TP_PFCURVE_CURVEEDITOR_CH;Teinte +TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controle la force du défrangeage en fonction de la couleur. En haut = action maxi, en bas = pas d'action sur la couleur. TP_DIRPYRDENOISE_BLUE;Delta chrominance Bleu TP_DIRPYRDENOISE_CHROMA;Chrominance (Maître) TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Peut être utilisé sur les images raw et non-raw.\n\nPour les images non-raw, la réduction de bruit de luminance dépend du gamma du profile couleur d'entée. Un gamma sRGB est supposé, c'est pourquoi si l'image a un profile couleur d'un gamma différent, la réduction de bruit de luminance variera. @@ -1134,7 +1149,7 @@ TP_ICM_SAVEREFERENCE;Utiliser l'image comme profil de référence TP_ICM_TONECURVE;Utiliser la courbe tonale du profil DCP TP_ICM_TONECURVE_TOOLTIP;Permet d'utiliser la courbe tonale contenue dans le profile DCP, si elle existe TP_ICM_WORKINGPROFILE;Profil de Travail -TP_IMPULSEDENOISE_LABEL;Réduction du bruit d'impulsion +TP_IMPULSEDENOISE_LABEL;Réduction du bruit d'impulsion (Lab/CIECAM02) TP_IMPULSEDENOISE_THRESH;Seuil TP_LABCURVE_AVOIDCOLORSHIFT;Éviter les dérives de teinte TP_LABCURVE_AVOIDCOLORSHIFT_TOOLTIP;Ramènes les données dans le gamut de l'espace couleur de travail\npuis applique la correction de Munsell @@ -1186,6 +1201,7 @@ TP_PERSPECTIVE_LABEL;Perspective TP_PERSPECTIVE_VERTICAL;Verticale TP_PREPROCESS_GREENEQUIL;Équilibrage du vert TP_PREPROCESS_HOTDEADPIXFILT;Filtrer les pixels chauds/morts +TP_PREPROCESS_HOTDEADPIXFILT_TOOLTIP;Essai de supprimer les pixels chauds/morts TP_PREPROCESS_HOTDEADPIXTHRESH;Seuil de détection des pixels morts TP_PREPROCESS_LABEL;Traitement pre-dématriçage TP_PREPROCESS_LINEDENOISE;Filtre de bruit de ligne diff --git a/rtdata/languages/default b/rtdata/languages/default index 57de48285..f44d85835 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -441,6 +441,7 @@ HISTORY_MSG_203;NR - Method HISTORY_MSG_204;LMMSE Enhancement Steps HISTORY_MSG_205;CAM02 hot/bad pixels HISTORY_MSG_206;CAT02 - Adapt scene auto +HISTORY_MSG_207;Defringing Hue curve HISTORY_NEWSNAPSHOTAS;As... HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s @@ -1024,6 +1025,9 @@ TP_DARKFRAME_LABEL;Dark Frame TP_DEFRINGE_LABEL;Defringe (Lab/CIECAM02) TP_DEFRINGE_RADIUS;Radius TP_DEFRINGE_THRESHOLD;Threshold +TP_PFCURVE_CURVEEDITOR_CH;Hue +TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Controls defringe strength by color. Higher = more, lower = less. +TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP;Modulates the action depending on the color and radius. Lower values ​​reduce the action, the higher values ​​increase action, with reference to the radius TP_DIRPYRDENOISE_BLUE;Delta chrominance Blue TP_DIRPYRDENOISE_CHROMA;Chrominance (Master) TP_DIRPYRDENOISE_ENABLED_TOOLTIP;Can be used on raw and non-raw images.\n\nFor non-raw images noise reduction of luminance depends on gamma of the input color profile. Gamma of sRGB is assumed, thus if input image is in color profile of a different gamma, luminance noise reduction will vary. diff --git a/rtdata/profiles/BW 1.pp3 b/rtdata/profiles/BW 1.pp3 index ea2386655..318aeb80d 100644 --- a/rtdata/profiles/BW 1.pp3 +++ b/rtdata/profiles/BW 1.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=true diff --git a/rtdata/profiles/BW 2.pp3 b/rtdata/profiles/BW 2.pp3 index 2de32ec82..e69aac294 100644 --- a/rtdata/profiles/BW 2.pp3 +++ b/rtdata/profiles/BW 2.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=true diff --git a/rtdata/profiles/BW 3.pp3 b/rtdata/profiles/BW 3.pp3 index 8f03ecf64..deb2dfae4 100644 --- a/rtdata/profiles/BW 3.pp3 +++ b/rtdata/profiles/BW 3.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=true diff --git a/rtdata/profiles/BW 4.pp3 b/rtdata/profiles/BW 4.pp3 index 8a833243c..88f11f09f 100644 --- a/rtdata/profiles/BW 4.pp3 +++ b/rtdata/profiles/BW 4.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=true diff --git a/rtdata/profiles/Deep Shadows.pp3 b/rtdata/profiles/Deep Shadows.pp3 index 54d136f8e..0eabb491d 100644 --- a/rtdata/profiles/Deep Shadows.pp3 +++ b/rtdata/profiles/Deep Shadows.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Default ISO High.pp3 b/rtdata/profiles/Default ISO High.pp3 index 776e435fb..b4ebf964a 100644 --- a/rtdata/profiles/Default ISO High.pp3 +++ b/rtdata/profiles/Default ISO High.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=true diff --git a/rtdata/profiles/Default ISO Medium.pp3 b/rtdata/profiles/Default ISO Medium.pp3 index f78972dad..45058afcf 100644 --- a/rtdata/profiles/Default ISO Medium.pp3 +++ b/rtdata/profiles/Default ISO Medium.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=true diff --git a/rtdata/profiles/Default.pp3 b/rtdata/profiles/Default.pp3 index d3c855651..afa142023 100644 --- a/rtdata/profiles/Default.pp3 +++ b/rtdata/profiles/Default.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=true @@ -119,6 +119,8 @@ Threshold=50 Enabled=false Radius=2.0 Threshold=25 +HueCurve=1;0.166666667;0;0.35;0.35;0.347;0;0.35;0.35;0.513667426;0;0.35;0.35;0.668944571;0;0.35;0.35;0.8287775246;0.97835991;0.35;0.35;0.9908883827;0;0.35;0.35; + [Directional Pyramid Denoising] Enabled=false diff --git a/rtdata/profiles/Equilibrated.pp3 b/rtdata/profiles/Equilibrated.pp3 index 98b710c4f..d3dd41abe 100644 --- a/rtdata/profiles/Equilibrated.pp3 +++ b/rtdata/profiles/Equilibrated.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Amber 1 TM Bright.pp3 b/rtdata/profiles/Faded Amber 1 TM Bright.pp3 index b4f0f5580..e03e47ff3 100644 --- a/rtdata/profiles/Faded Amber 1 TM Bright.pp3 +++ b/rtdata/profiles/Faded Amber 1 TM Bright.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Amber 1 TM.pp3 b/rtdata/profiles/Faded Amber 1 TM.pp3 index 86887f43f..7e8344359 100644 --- a/rtdata/profiles/Faded Amber 1 TM.pp3 +++ b/rtdata/profiles/Faded Amber 1 TM.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Amber 1.pp3 b/rtdata/profiles/Faded Amber 1.pp3 index 199e1d386..ebacd9816 100644 --- a/rtdata/profiles/Faded Amber 1.pp3 +++ b/rtdata/profiles/Faded Amber 1.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Blue 1 TM Bright.pp3 b/rtdata/profiles/Faded Blue 1 TM Bright.pp3 index 1b72923be..847a1c9a5 100644 --- a/rtdata/profiles/Faded Blue 1 TM Bright.pp3 +++ b/rtdata/profiles/Faded Blue 1 TM Bright.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Blue 1 TM.pp3 b/rtdata/profiles/Faded Blue 1 TM.pp3 index fc0f92672..906180954 100644 --- a/rtdata/profiles/Faded Blue 1 TM.pp3 +++ b/rtdata/profiles/Faded Blue 1 TM.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Blue 1.pp3 b/rtdata/profiles/Faded Blue 1.pp3 index 3ea8a709f..0530bc4e0 100644 --- a/rtdata/profiles/Faded Blue 1.pp3 +++ b/rtdata/profiles/Faded Blue 1.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Blue Pink TM.pp3 b/rtdata/profiles/Faded Blue Pink TM.pp3 index 14447f3ba..e4c60bf1c 100644 --- a/rtdata/profiles/Faded Blue Pink TM.pp3 +++ b/rtdata/profiles/Faded Blue Pink TM.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Blue Pink.pp3 b/rtdata/profiles/Faded Blue Pink.pp3 index 120dcb889..caa74dc46 100644 --- a/rtdata/profiles/Faded Blue Pink.pp3 +++ b/rtdata/profiles/Faded Blue Pink.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Chocolate 1 TM Bright.pp3 b/rtdata/profiles/Faded Chocolate 1 TM Bright.pp3 index 7c114e804..c2884d3cb 100644 --- a/rtdata/profiles/Faded Chocolate 1 TM Bright.pp3 +++ b/rtdata/profiles/Faded Chocolate 1 TM Bright.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Chocolate 2 TM Bright.pp3 b/rtdata/profiles/Faded Chocolate 2 TM Bright.pp3 index 0fef120e8..4f8331658 100644 --- a/rtdata/profiles/Faded Chocolate 2 TM Bright.pp3 +++ b/rtdata/profiles/Faded Chocolate 2 TM Bright.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Golden 1.pp3 b/rtdata/profiles/Faded Golden 1.pp3 index 38cfcf7f0..5f0dcf358 100644 --- a/rtdata/profiles/Faded Golden 1.pp3 +++ b/rtdata/profiles/Faded Golden 1.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Golden 2.pp3 b/rtdata/profiles/Faded Golden 2.pp3 index db7bb306a..39c2c15b0 100644 --- a/rtdata/profiles/Faded Golden 2.pp3 +++ b/rtdata/profiles/Faded Golden 2.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Green 1 TM Bright.pp3 b/rtdata/profiles/Faded Green 1 TM Bright.pp3 index 422552e10..a76170d70 100644 --- a/rtdata/profiles/Faded Green 1 TM Bright.pp3 +++ b/rtdata/profiles/Faded Green 1 TM Bright.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Green 1 TM.pp3 b/rtdata/profiles/Faded Green 1 TM.pp3 index 6670b82da..adc4dfed3 100644 --- a/rtdata/profiles/Faded Green 1 TM.pp3 +++ b/rtdata/profiles/Faded Green 1 TM.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Green 1.pp3 b/rtdata/profiles/Faded Green 1.pp3 index 51743481e..cc94b290e 100644 --- a/rtdata/profiles/Faded Green 1.pp3 +++ b/rtdata/profiles/Faded Green 1.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Green 2.pp3 b/rtdata/profiles/Faded Green 2.pp3 index 488f3434a..5a7924bde 100644 --- a/rtdata/profiles/Faded Green 2.pp3 +++ b/rtdata/profiles/Faded Green 2.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Green 3.pp3 b/rtdata/profiles/Faded Green 3.pp3 index 7be4be4c9..5d295db81 100644 --- a/rtdata/profiles/Faded Green 3.pp3 +++ b/rtdata/profiles/Faded Green 3.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Neutral TM.pp3 b/rtdata/profiles/Faded Neutral TM.pp3 index 86c631d19..4a9d6e3cd 100644 --- a/rtdata/profiles/Faded Neutral TM.pp3 +++ b/rtdata/profiles/Faded Neutral TM.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Neutral.pp3 b/rtdata/profiles/Faded Neutral.pp3 index 8f4f890a7..49957f63c 100644 --- a/rtdata/profiles/Faded Neutral.pp3 +++ b/rtdata/profiles/Faded Neutral.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Purple 1 TM Bright.pp3 b/rtdata/profiles/Faded Purple 1 TM Bright.pp3 index 9274fc332..68fdcf4dd 100644 --- a/rtdata/profiles/Faded Purple 1 TM Bright.pp3 +++ b/rtdata/profiles/Faded Purple 1 TM Bright.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Purple 1 TM.pp3 b/rtdata/profiles/Faded Purple 1 TM.pp3 index 1afc3fbc1..bbc953aee 100644 --- a/rtdata/profiles/Faded Purple 1 TM.pp3 +++ b/rtdata/profiles/Faded Purple 1 TM.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Purple 1.pp3 b/rtdata/profiles/Faded Purple 1.pp3 index 36f3d3956..d424fae7d 100644 --- a/rtdata/profiles/Faded Purple 1.pp3 +++ b/rtdata/profiles/Faded Purple 1.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Purple 2 TM.pp3 b/rtdata/profiles/Faded Purple 2 TM.pp3 index 6a42d3e91..ca2ae2bc1 100644 --- a/rtdata/profiles/Faded Purple 2 TM.pp3 +++ b/rtdata/profiles/Faded Purple 2 TM.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Purple 2.pp3 b/rtdata/profiles/Faded Purple 2.pp3 index 179a3c694..bd57019f0 100644 --- a/rtdata/profiles/Faded Purple 2.pp3 +++ b/rtdata/profiles/Faded Purple 2.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Teal Orange TM Bright.pp3 b/rtdata/profiles/Faded Teal Orange TM Bright.pp3 index a6b947855..b8b6278d2 100644 --- a/rtdata/profiles/Faded Teal Orange TM Bright.pp3 +++ b/rtdata/profiles/Faded Teal Orange TM Bright.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Teal Orange TM.pp3 b/rtdata/profiles/Faded Teal Orange TM.pp3 index d1d1f2778..001b751b2 100644 --- a/rtdata/profiles/Faded Teal Orange TM.pp3 +++ b/rtdata/profiles/Faded Teal Orange TM.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Teal Orange.pp3 b/rtdata/profiles/Faded Teal Orange.pp3 index 09f322f2e..2827a6762 100644 --- a/rtdata/profiles/Faded Teal Orange.pp3 +++ b/rtdata/profiles/Faded Teal Orange.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Warm 1 TM Bright.pp3 b/rtdata/profiles/Faded Warm 1 TM Bright.pp3 index 72f897e6c..597114727 100644 --- a/rtdata/profiles/Faded Warm 1 TM Bright.pp3 +++ b/rtdata/profiles/Faded Warm 1 TM Bright.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Warm 1 TM.pp3 b/rtdata/profiles/Faded Warm 1 TM.pp3 index f2c1ef4f4..fa78027ea 100644 --- a/rtdata/profiles/Faded Warm 1 TM.pp3 +++ b/rtdata/profiles/Faded Warm 1 TM.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Warm 1.pp3 b/rtdata/profiles/Faded Warm 1.pp3 index 9f26555a8..bf69f1e17 100644 --- a/rtdata/profiles/Faded Warm 1.pp3 +++ b/rtdata/profiles/Faded Warm 1.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Warm 2.pp3 b/rtdata/profiles/Faded Warm 2.pp3 index 84519e254..a544fc6dd 100644 --- a/rtdata/profiles/Faded Warm 2.pp3 +++ b/rtdata/profiles/Faded Warm 2.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Faded Warm 3.pp3 b/rtdata/profiles/Faded Warm 3.pp3 index 843204ee4..f59b513be 100644 --- a/rtdata/profiles/Faded Warm 3.pp3 +++ b/rtdata/profiles/Faded Warm 3.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/High-Key.pp3 b/rtdata/profiles/High-Key.pp3 index 1a873fd4c..a2408943e 100644 --- a/rtdata/profiles/High-Key.pp3 +++ b/rtdata/profiles/High-Key.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=true diff --git a/rtdata/profiles/Natural 1.pp3 b/rtdata/profiles/Natural 1.pp3 index 272ed71f2..1eeb9809b 100644 --- a/rtdata/profiles/Natural 1.pp3 +++ b/rtdata/profiles/Natural 1.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=true diff --git a/rtdata/profiles/Natural 2.pp3 b/rtdata/profiles/Natural 2.pp3 index 5db2dd764..c24b50dc1 100644 --- a/rtdata/profiles/Natural 2.pp3 +++ b/rtdata/profiles/Natural 2.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=true diff --git a/rtdata/profiles/Neutral.pp3 b/rtdata/profiles/Neutral.pp3 index c8915ae4d..446ce95e3 100644 --- a/rtdata/profiles/Neutral.pp3 +++ b/rtdata/profiles/Neutral.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=false @@ -118,6 +118,7 @@ Threshold=50 Enabled=false Radius=2.0 Threshold=25 +HueCurve=1;0.166666667;0;0.35;0.35;0.347;0;0.35;0.35;0.513667426;0;0.35;0.35;0.668944571;0;0.35;0.35;0.8287775246;0.97835991;0.35;0.35;0.9908883827;0;0.35;0.35; [Directional Pyramid Denoising] Enabled=false diff --git a/rtdata/profiles/Pop 1.pp3 b/rtdata/profiles/Pop 1.pp3 index 7b5397773..140fbfb31 100644 --- a/rtdata/profiles/Pop 1.pp3 +++ b/rtdata/profiles/Pop 1.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Pop 2 L.pp3 b/rtdata/profiles/Pop 2 L.pp3 index 82bc98a7b..d39bf2a86 100644 --- a/rtdata/profiles/Pop 2 L.pp3 +++ b/rtdata/profiles/Pop 2 L.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Pop 3 Skin.pp3 b/rtdata/profiles/Pop 3 Skin.pp3 index 0f62b4fe1..d199f3859 100644 --- a/rtdata/profiles/Pop 3 Skin.pp3 +++ b/rtdata/profiles/Pop 3 Skin.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Pop 4 BW.pp3 b/rtdata/profiles/Pop 4 BW.pp3 index 166c91c85..37423489a 100644 --- a/rtdata/profiles/Pop 4 BW.pp3 +++ b/rtdata/profiles/Pop 4 BW.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Portrait Lejto.pp3 b/rtdata/profiles/Portrait Lejto.pp3 index dd8e81654..bf29ea391 100644 --- a/rtdata/profiles/Portrait Lejto.pp3 +++ b/rtdata/profiles/Portrait Lejto.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Portrait Smooth.pp3 b/rtdata/profiles/Portrait Smooth.pp3 index 09ec40671..6609f4fee 100644 --- a/rtdata/profiles/Portrait Smooth.pp3 +++ b/rtdata/profiles/Portrait Smooth.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=false diff --git a/rtdata/profiles/Punchy 1.pp3 b/rtdata/profiles/Punchy 1.pp3 index 30c6f031c..20aba7f4e 100644 --- a/rtdata/profiles/Punchy 1.pp3 +++ b/rtdata/profiles/Punchy 1.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=true diff --git a/rtdata/profiles/Punchy 2.pp3 b/rtdata/profiles/Punchy 2.pp3 index 4b3416c8a..cbe47ae8a 100644 --- a/rtdata/profiles/Punchy 2.pp3 +++ b/rtdata/profiles/Punchy 2.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [Exposure] Auto=true diff --git a/rtdata/profiles/Skintones - Natural TM.pp3 b/rtdata/profiles/Skintones - Natural TM.pp3 index dea5e7e84..6a9f3bd74 100644 --- a/rtdata/profiles/Skintones - Natural TM.pp3 +++ b/rtdata/profiles/Skintones - Natural TM.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [General] Rank=0 diff --git a/rtdata/profiles/Skintones - Natural.pp3 b/rtdata/profiles/Skintones - Natural.pp3 index 0268aceeb..b5d3fe42e 100644 --- a/rtdata/profiles/Skintones - Natural.pp3 +++ b/rtdata/profiles/Skintones - Natural.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [General] Rank=0 diff --git a/rtdata/profiles/Skintones - Pale TM Bright.pp3 b/rtdata/profiles/Skintones - Pale TM Bright.pp3 index 4ce228ca6..143105fb3 100644 --- a/rtdata/profiles/Skintones - Pale TM Bright.pp3 +++ b/rtdata/profiles/Skintones - Pale TM Bright.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [General] Rank=0 diff --git a/rtdata/profiles/Skintones - Pale TM.pp3 b/rtdata/profiles/Skintones - Pale TM.pp3 index 8f32be23e..e3429773a 100644 --- a/rtdata/profiles/Skintones - Pale TM.pp3 +++ b/rtdata/profiles/Skintones - Pale TM.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [General] Rank=0 diff --git a/rtdata/profiles/Skintones - Pale.pp3 b/rtdata/profiles/Skintones - Pale.pp3 index 877ecbec1..33939c9af 100644 --- a/rtdata/profiles/Skintones - Pale.pp3 +++ b/rtdata/profiles/Skintones - Pale.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [General] Rank=0 diff --git a/rtdata/profiles/Skintones - Soft Texture.pp3 b/rtdata/profiles/Skintones - Soft Texture.pp3 index 863b98fc0..3785e9080 100644 --- a/rtdata/profiles/Skintones - Soft Texture.pp3 +++ b/rtdata/profiles/Skintones - Soft Texture.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [RGB Curves] LumaMode=true diff --git a/rtdata/profiles/Skintones - Strong Texture.pp3 b/rtdata/profiles/Skintones - Strong Texture.pp3 index 1345138cd..c80ecd6b9 100644 --- a/rtdata/profiles/Skintones - Strong Texture.pp3 +++ b/rtdata/profiles/Skintones - Strong Texture.pp3 @@ -1,6 +1,6 @@ [Version] AppVersion=4.0.11.0 -Version=307 +Version=308 [RGB Curves] LumaMode=true diff --git a/rtdata/profiles/Skintones - Studio TM.pp3 b/rtdata/profiles/Skintones - Studio TM.pp3 index 1a41fc204..bf78bab1e 100644 --- a/rtdata/profiles/Skintones - Studio TM.pp3 +++ b/rtdata/profiles/Skintones - Studio TM.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [General] Rank=0 diff --git a/rtdata/profiles/Skintones - Studio.pp3 b/rtdata/profiles/Skintones - Studio.pp3 index 88829638e..fa15ef54d 100644 --- a/rtdata/profiles/Skintones - Studio.pp3 +++ b/rtdata/profiles/Skintones - Studio.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [General] Rank=0 diff --git a/rtdata/profiles/Skintones - StudioBase 1 TM.pp3 b/rtdata/profiles/Skintones - StudioBase 1 TM.pp3 index 8413176e3..20363639d 100644 --- a/rtdata/profiles/Skintones - StudioBase 1 TM.pp3 +++ b/rtdata/profiles/Skintones - StudioBase 1 TM.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [General] Rank=0 diff --git a/rtdata/profiles/Skintones - StudioBase 1.pp3 b/rtdata/profiles/Skintones - StudioBase 1.pp3 index 962a9fa8f..4085448d2 100644 --- a/rtdata/profiles/Skintones - StudioBase 1.pp3 +++ b/rtdata/profiles/Skintones - StudioBase 1.pp3 @@ -1,7 +1,7 @@ [Version] AppVersion=4.0.11 -Version=307 +Version=308 [General] Rank=0 diff --git a/rtengine/PF_correct_RT.cc b/rtengine/PF_correct_RT.cc index 59902ed81..398ad8561 100644 --- a/rtengine/PF_correct_RT.cc +++ b/rtengine/PF_correct_RT.cc @@ -29,6 +29,7 @@ #include "improcfun.h" #include "sleef.c" #include "mytime.h" +#include "../rtgui/myflatcurve.h" #ifdef _OPENMP #include @@ -58,6 +59,10 @@ void ImProcFunctions::PF_correct_RT(LabImage * src, LabImage * dst, double radiu #include "rt_math.h" + FlatCurve* chCurve = NULL; + if (params->defringe.huecurve.size() && FlatCurveType(params->defringe.huecurve.at(0)) > FCT_Linear) + chCurve = new FlatCurve(params->defringe.huecurve); + // local variables int width=src->W, height=src->H; //temporary array to store chromaticity @@ -88,7 +93,16 @@ float chromave=0; #endif for(int i = 0; i < height; i++ ) { for(int j = 0; j < width; j++) { - float chroma = SQR(src->a[i][j]-tmp1->a[i][j])+SQR(src->b[i][j]-tmp1->b[i][j]); + float HH=xatan2f(src->b[i][j],src->a[i][j]); + double hr; + float chromaChfactor=1.0f; + if (chCurve) { + Color::huelab_to_huehsv (HH, hr); + float chparam = float((chCurve->getVal(hr)-0.5f) * 2.0f);//get C=f(H) + if(chparam > 0.f) chparam /=2.f; // reduced action if chparam > 0 + chromaChfactor=1.0f+chparam; + } + float chroma = SQR(chromaChfactor*(src->a[i][j]-tmp1->a[i][j]))+SQR(chromaChfactor*(src->b[i][j]-tmp1->b[i][j]));//modulate chroma function hue chromave += chroma; fringe[i*width+j]=chroma; } @@ -144,12 +158,17 @@ float chromave=0; } delete tmp1; + if(chCurve) delete chCurve; free(fringe); } + void ImProcFunctions::PF_correct_RTcam(CieImage * src, CieImage * dst, double radius, int thresh) { int halfwin = ceil(2*radius)+1; #include "rt_math.h" + FlatCurve* chCurve = NULL; + if (params->defringe.huecurve.size() && FlatCurveType(params->defringe.huecurve.at(0)) > FCT_Linear) + chCurve = new FlatCurve(params->defringe.huecurve); // local variables int width=src->W, height=src->H; @@ -223,7 +242,20 @@ float chromave=0; #endif for(int i = 0; i < height; i++ ) { for(int j = 0; j < width; j++) { - float chroma =SQR(sraa[i][j]-tmaa[i][j])+SQR(srbb[i][j]-tmbb[i][j]); + float HH=xatan2f(srbb[i][j],sraa[i][j]); //piid*src->h_p[i][j]; + float chromaChfactor=1.0f; + double hr; + if (chCurve) { + Color::huelab_to_huehsv (HH, hr); //approximation Cam / Lab + float chparam = float((chCurve->getVal(hr)-0.5f) * 2.0f);//get C=f(H) + if(chparam > 0.f) chparam /=2.f; // reduced action if chparam > 0 + chromaChfactor=1.0f+chparam; + } + float chroma = SQR(chromaChfactor*(sraa[i][j]-tmaa[i][j]))+SQR(chromaChfactor*(srbb[i][j]-tmbb[i][j]));//modulate chroma function hue + + + + // float chroma =SQR(sraa[i][j]-tmaa[i][j])+SQR(srbb[i][j]-tmbb[i][j]); chromave += chroma; fringe[i*width+j]=chroma; } @@ -297,8 +329,10 @@ float chromave=0; /* for (int i=0; ihr # 0.33 ==> 0.33 0.42 + else if (HH<-2.1f) hr=0.266666667*double(HH)+1.14; //Lab cyan =>hr # 0.50 ==> 0.42 0.58 + else if (HH<-0.9f) hr=0.141666 *double(HH)+0.8775; //Lab blue =>hr # 0.67 ==> 0.58 0.75 + else if (HH<-0.1f) hr=0.2125 *double(HH)+0.94125; //Lab magenta (purple) =>hr # 0.83 ==> 0.75 0.92 + else if (HH< 1.3f) hr=0.12142857 *double(HH)+0.932142857; //Lab red and skin =>hr # 0 ==> 0.92 1.09 + else if (HH< 2.2f) hr=0.1666667 *double(HH)-0.1266667; //Lab yellow and green yellow =>hr # 0.16 ==> 0.09 0.24 + else hr=0.0955828 *double(HH)+0.02971784; //Lab green =>hr # 0.33 ==> 0.24 0.33 + //allways put h between 0 and 1 + if (hr<0.0) hr += 1.0; + else if(hr>1.0) hr -= 1.0; + } + double Color::f2xyz(double f) { const double epsilonExpInv3 = 6.0/29.0; const double kappaInv = 27.0/24389.0; // inverse of kappa diff --git a/rtengine/color.h b/rtengine/color.h index ffbc7f8c0..81c449dfb 100644 --- a/rtengine/color.h +++ b/rtengine/color.h @@ -135,6 +135,7 @@ public: static void Yuv2Lab(float Y, float u, float v, float &L, float &a, float &b, double wp[3][3]); static double f2xyz(double f); static void calcGamma (double pwr, double ts, int mode, int imax, double &gamma0, double &gamma1, double &gamma2, double &gamma3, double &gamma4,double &gamma5); + static void huelab_to_huehsv (float HH, double &hr); // standard srgb gamma and its inverse static inline double gamma2 (double x) { diff --git a/rtengine/curves.cc b/rtengine/curves.cc index 183f8c989..0239b45a3 100644 --- a/rtengine/curves.cc +++ b/rtengine/curves.cc @@ -37,12 +37,7 @@ using namespace std; namespace rtengine { - Curve::Curve () { - x = 0; - y = 0; - ypp = 0; - hashSize = 1000; // has to be initialized to the maximum value - } + Curve::Curve () : N(0), x(NULL), y(NULL), ypp(NULL), hashSize(1000 /* has to be initialized to the maximum value */ ) {} void Curve::AddPolygons () { diff --git a/rtengine/curves.h b/rtengine/curves.h index 8cea03043..27cd9366c 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -278,6 +278,7 @@ class FlatCurve : public Curve { FlatCurveType kind; double* leftTangent; double* rightTangent; + double identityValue; bool periodic; void CtrlPoints_set (); @@ -289,6 +290,7 @@ class FlatCurve : public Curve { double getVal (double t) const; void getVal (const std::vector& t, std::vector& res) const; + bool setIdentityValue (double iVal); bool isIdentity () const { return kind==FCT_Empty; }; }; diff --git a/rtengine/flatcurves.cc b/rtengine/flatcurves.cc index 77243f1e5..3236b57d1 100644 --- a/rtengine/flatcurves.cc +++ b/rtengine/flatcurves.cc @@ -29,15 +29,12 @@ namespace rtengine { -FlatCurve::FlatCurve (const std::vector& p, bool isPeriodic, int poly_pn) : leftTangent(NULL), rightTangent(NULL) { +FlatCurve::FlatCurve (const std::vector& p, bool isPeriodic, int poly_pn) : kind(FCT_Empty), leftTangent(NULL), rightTangent(NULL), identityValue(0.5), periodic(isPeriodic) { ppn = poly_pn > 65500 ? 65500 : poly_pn; poly_x.clear(); poly_y.clear(); - kind = FCT_Empty; - periodic = isPeriodic; - bool identity = true; if (p.size()>4) { @@ -55,8 +52,8 @@ FlatCurve::FlatCurve (const std::vector& p, bool isPeriodic, int poly_pn y[i] = p[ix++]; leftTangent[i] = p[ix++]; rightTangent[i] = p[ix++]; - if (y[i] != 0.5f) - identity = false; + if (y[i] >= identityValue+1.e-7 || y[i] <= identityValue-1.e-7) + identity = false; } // The first point is copied to the end of the point list, to handle the curve periodicity if (periodic) { @@ -91,6 +88,31 @@ FlatCurve::~FlatCurve () { poly_y.clear(); } +/* + * The nominal (identity) curve may not be 0.5, use this method to set it to whatever value in the 0.-1. range you want + * Return true if the curve is nominal + */ +bool FlatCurve::setIdentityValue (double iVal) { + + if (identityValue == iVal) + return kind==FCT_Empty; + + identityValue = iVal; + bool identity = true; + for (int i=0; i= identityValue+1.e-7 || y[i] <= identityValue-1.e-7) { + identity = false; + break; + } + } + if (identity) + kind = FCT_Empty; + else + kind = FCT_MinMaxCPoints; + + return kind==FCT_Empty; +} + void FlatCurve::CtrlPoints_set () { int nbSubCurvesPoints = N*6; @@ -274,7 +296,7 @@ void FlatCurve::CtrlPoints_set () { poly_x.push_back(sc_x[j]); poly_y.push_back(sc_y[j++]); } - else { + else { nbr_points = (int)(((double)(ppn) * sc_length[i] )/ total_length); if (nbr_points<0){ for(size_t it=0;it < sc_x.size(); it+=3) printf("sc_length[%zd/3]=%f \n",it,sc_length[it/3]); @@ -287,7 +309,7 @@ void FlatCurve::CtrlPoints_set () { x2 = sc_x[j]; y2 = sc_y[j++]; x3 = sc_x[j]; y3 = sc_y[j++]; AddPolygons (); - } + } } // adding the final horizontal segment, always (see under) @@ -344,7 +366,7 @@ double FlatCurve::getVal (double t) const { case FCT_Empty : case FCT_Linear : // Linear doesn't exist yet and is then considered as identity default: - return 0.5; + return identityValue; } } diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 38d0d8644..40ee4b847 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -2553,19 +2553,7 @@ void ImProcFunctions::chromiLuminanceCurve (int pW, LabImage* lold, LabImage* ln // calculate C=f(H) if (chutili) { double hr; - //hr=translate Hue Lab value (-Pi +Pi) in approximative hr (hsv values) (0 1) [red 1/6 yellow 1/6 green 1/6 cyan 1/6 blue 1/6 magenta 1/6 ] - // with multi linear correspondances (I expect there is no error !!) - if (HH<-2.7f) hr=0.020380804*double(HH)+0.970281708; //Lab green =>hr # 0.33 ==> 0.33 0.42 - else if (HH<-2.1f) hr=0.266666667*double(HH)+1.14; //Lab cyan =>hr # 0.50 ==> 0.42 0.58 - else if (HH<-0.9f) hr=0.141666 *double(HH)+0.8775; //Lab blue =>hr # 0.67 ==> 0.58 0.75 - else if (HH<-0.1f) hr=0.2125 *double(HH)+0.94125; //Lab magenta (purple) =>hr # 0.83 ==> 0.75 0.92 - else if (HH< 1.3f) hr=0.12142857 *double(HH)+0.932142857; //Lab red and skin =>hr # 0 ==> 0.92 1.09 - else if (HH< 2.2f) hr=0.1666667 *double(HH)-0.1266667; //Lab yellow and green yellow =>hr # 0.16 ==> 0.09 0.24 - else hr=0.0955828 *double(HH)+0.02971784; //Lab green =>hr # 0.33 ==> 0.24 0.33 - - //allways put h between 0 and 1 - if (hr<0.0) hr += 1.0; - else if(hr>1.0) hr -= 1.0; + Color::huelab_to_huehsv (HH, hr); float chparam = float((chCurve->getVal(hr)-0.5f) * 2.0f);//get C=f(H) chromaChfactor=1.0f+chparam; } diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 68408eaaa..501e9a4e8 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -229,8 +229,8 @@ enum ProcEvent { EvDemosaicLMMSEIter=203, EvCATbadpix=204, EvCATAutoAdap=205, - - NUMOFEVENTS=206 + EvPFCurve=206, + NUMOFEVENTS=207 }; } #endif diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index f44c48702..48e96d045 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -239,13 +239,13 @@ void ProcParams::setDefaults () { colorappearance.tonecie = false; // colorappearance.sharpcie = false; colorappearance.curve.clear (); - colorappearance.curve.push_back(DCT_Linear); + colorappearance.curve.push_back(DCT_Linear); colorappearance.curve2.clear (); - colorappearance.curve2.push_back(DCT_Linear); + colorappearance.curve2.push_back(DCT_Linear); colorappearance.curveMode =ColorAppearanceParams::TC_MODE_LIGHT; colorappearance.curveMode2 = ColorAppearanceParams::TC_MODE_LIGHT; colorappearance.curve3.clear (); - colorappearance.curve3.push_back(DCT_Linear); + colorappearance.curve3.push_back(DCT_Linear); colorappearance.curveMode3 = ColorAppearanceParams::TC_MODE_CHROMA; impulseDenoise.enabled = false; @@ -254,6 +254,32 @@ void ProcParams::setDefaults () { defringe.enabled = false; defringe.radius = 2.0; defringe.threshold = 25; + defringe.huecurve.resize (25); + defringe.huecurve.at(0) = FCT_MinMaxCPoints; + defringe.huecurve.at(1) = 0.166666667; + defringe.huecurve.at(2) = 0.; + defringe.huecurve.at(3) = 0.35; + defringe.huecurve.at(4) = 0.35; + defringe.huecurve.at(5) = 0.347; + defringe.huecurve.at(6) = 0.; + defringe.huecurve.at(7) = 0.35; + defringe.huecurve.at(8) = 0.35; + defringe.huecurve.at(9) = 0.513667426; + defringe.huecurve.at(10) = 0; + defringe.huecurve.at(11) = 0.35; + defringe.huecurve.at(12) = 0.35; + defringe.huecurve.at(13) = 0.668944571; + defringe.huecurve.at(14) = 0.; + defringe.huecurve.at(15) = 0.35; + defringe.huecurve.at(16) = 0.35; + defringe.huecurve.at(17) = 0.8287775246; + defringe.huecurve.at(18) = 0.97835991; + defringe.huecurve.at(19) = 0.35; + defringe.huecurve.at(20) = 0.35; + defringe.huecurve.at(21) = 0.9908883827; + defringe.huecurve.at(22) = 0.; + defringe.huecurve.at(23) = 0.35; + defringe.huecurve.at(24) = 0.35; dirpyrDenoise.enabled = false; // dirpyrDenoise.perform = false; @@ -674,6 +700,10 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, ParamsEdited* p if (!pedited || pedited->defringe.enabled) keyFile.set_boolean ("Defringing", "Enabled", defringe.enabled); if (!pedited || pedited->defringe.radius) keyFile.set_double ("Defringing", "Radius", defringe.radius); if (!pedited || pedited->defringe.threshold) keyFile.set_integer ("Defringing", "Threshold", defringe.threshold); + if (!pedited || pedited->defringe.huecurve) { + Glib::ArrayHandle huecurve = defringe.huecurve; + keyFile.set_double_list("Defringing", "HueCurve", huecurve); + } // save dirpyrDenoise if (!pedited || pedited->dirpyrDenoise.enabled) keyFile.set_boolean ("Directional Pyramid Denoising", "Enabled", dirpyrDenoise.enabled); @@ -1118,6 +1148,7 @@ if (keyFile.has_group ("Defringing")) { if (keyFile.has_key ("Defringing", "Enabled")) { defringe.enabled = keyFile.get_boolean ("Defringing", "Enabled"); if (pedited) pedited->defringe.enabled = true; } if (keyFile.has_key ("Defringing", "Radius")) { defringe.radius = keyFile.get_double ("Defringing", "Radius"); if (pedited) pedited->defringe.radius = true; } if (keyFile.has_key ("Defringing", "Threshold")) { defringe.threshold = keyFile.get_integer ("Defringing", "Threshold"); if (pedited) pedited->defringe.threshold = true; } + if (keyFile.has_key ("Defringing", "HueCurve")) { defringe.huecurve = keyFile.get_double_list ("Defringing", "HueCurve"); if (pedited) pedited->defringe.huecurve = true; } } // load colorappearance if (keyFile.has_group ("Color appearance")) { @@ -1584,6 +1615,8 @@ bool ProcParams::operator== (const ProcParams& other) { && defringe.enabled == other.defringe.enabled && defringe.radius == other.defringe.radius && defringe.threshold == other.defringe.threshold + && defringe.huecurve == other.defringe.huecurve + //&& lumaDenoise.enabled == other.lumaDenoise.enabled //&& lumaDenoise.radius == other.lumaDenoise.radius //&& lumaDenoise.edgetolerance == other.lumaDenoise.edgetolerance diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 5a3e9a484..1e9a38ae7 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -376,9 +376,9 @@ class WBParams { Glib::ustring surround; double adapscen; bool autoadapscen; - + double adaplum; - int badpixsl; + int badpixsl; Glib::ustring wbmodel; Glib::ustring algo; double contrast; @@ -396,7 +396,6 @@ class WBParams { bool datacie; bool tonecie; // bool sharpcie; - }; /** @@ -432,54 +431,54 @@ class WBParams { int amount; };*/ - /** - * Parameters of defringing - */ - class DefringeParams { +/** + * Parameters of defringing + */ +class DefringeParams { public: bool enabled; double radius; int threshold; - }; + std::vector huecurve; +}; - /** - * Parameters of impulse denoising - */ - class ImpulseDenoiseParams { +/** + * Parameters of impulse denoising + */ +class ImpulseDenoiseParams { public: bool enabled; int thresh; - }; +}; - /** - * Parameters of the directional pyramid denoising - */ - class DirPyrDenoiseParams { +/** + * Parameters of the directional pyramid denoising + */ +class DirPyrDenoiseParams { public: bool enabled; bool perform; - double luma; - double Ldetail; + double luma; + double Ldetail; double chroma; - double redchro; - double bluechro; - double gamma; + double redchro; + double bluechro; + double gamma; Glib::ustring dmethod; - - }; +}; //EPD related parameters. class EPDParams{ -public: - bool enabled; - double Strength; - double EdgeStopping; - double Scale; - int ReweightingIterates; + public: + bool enabled; + double Strength; + double EdgeStopping; + double Scale; + int ReweightingIterates; }; /** diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 2ba94b635..85099a9ea 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -225,7 +225,8 @@ ALLNORAW, // EvDPDNperform ALLNORAW, //EvDPDNmet DEMOSAIC, // EvDemosaicLMMSEIter LUMINANCECURVE, // EvCATbadpix -LUMINANCECURVE // EvCATAutoadap +LUMINANCECURVE, // EvCATAutoadap +DEFRINGE // EvPFCurve, //LUMINANCECURVE // EvCATsharpcie diff --git a/rtgui/curveeditor.cc b/rtgui/curveeditor.cc index 05ba0dd2c..7d8b9cf11 100644 --- a/rtgui/curveeditor.cc +++ b/rtgui/curveeditor.cc @@ -97,7 +97,8 @@ void DiagonalCurveEditor::getRangeDefaultMilestones(double &m1, double &m2, doub FlatCurveEditor::FlatCurveEditor (Glib::ustring text, CurveEditorGroup* ceGroup, CurveEditorSubGroup* ceSubGroup, bool isPeriodic) : CurveEditor::CurveEditor(text, static_cast(ceGroup), ceSubGroup) { - periodic = isPeriodic; + periodic = isPeriodic; + identityValue = 0.5; // Order set in the same order than "enum FlatCurveType". Shouldn't change, for compatibility reason curveType->addEntry("curveType-flatLinear.png", M("CURVEEDITOR_LINEAR")); // 0 Linear diff --git a/rtgui/curveeditor.h b/rtgui/curveeditor.h index 6167fa8ec..129d5b83b 100644 --- a/rtgui/curveeditor.h +++ b/rtgui/curveeditor.h @@ -107,6 +107,8 @@ class CurveEditor { bool openIfNonlinear(); // Open up the curve if it has modifications and it's not already opened void setCurve (const std::vector& p); + virtual void setIdentityValue (const double iValue=0.5) {}; + virtual double getIdentityValue () { return 0.5; }; virtual std::vector getCurve () = 0; void setTooltip(Glib::ustring ttip); @@ -157,9 +159,12 @@ class FlatCurveEditor : public CurveEditor { // reflects the buttonType active selection ; used as a pre-'selectionChange' reminder value std::vector controlPointsCurveEd; bool periodic; + double identityValue; public: FlatCurveEditor (Glib::ustring text, CurveEditorGroup* ceGroup, CurveEditorSubGroup* ceSubGroup, bool isPeriodic = true); + virtual void setIdentityValue (const double iValue=0.5) { identityValue = iValue; } + virtual double getIdentityValue () { return identityValue; }; std::vector getCurve (); }; diff --git a/rtgui/curveeditorgroup.cc b/rtgui/curveeditorgroup.cc index b03676cbe..da795b26f 100644 --- a/rtgui/curveeditorgroup.cc +++ b/rtgui/curveeditorgroup.cc @@ -280,7 +280,7 @@ void CurveEditorGroup::curveChanged () { */ void CurveEditorGroup::curveResetPressed () { if (displayedCurve) { - if (displayedCurve->subGroup->curveReset(displayedCurve->selected)) { + if (displayedCurve->subGroup->curveReset(displayedCurve->selected, displayedCurve->getIdentityValue())) { curveChanged(); } } diff --git a/rtgui/curveeditorgroup.h b/rtgui/curveeditorgroup.h index 76c5d484d..a14f2d28f 100644 --- a/rtgui/curveeditorgroup.h +++ b/rtgui/curveeditorgroup.h @@ -129,7 +129,7 @@ protected: Glib::ustring outputFile (); Glib::ustring inputFile (); - virtual bool curveReset (int cType) = 0; // Reset a curve editor, return TRUE if successful (curve changed) + virtual bool curveReset (int cType, double iValue) = 0; // Reset a curve editor, return TRUE if successful (curve changed) virtual void storeCurveValues (CurveEditor* ce, const std::vector& p) = 0; virtual void storeDisplayedCurve () = 0; virtual void restoreDisplayedHistogram() {}; diff --git a/rtgui/defringe.cc b/rtgui/defringe.cc index 3fc98d497..a99dd0f18 100644 --- a/rtgui/defringe.cc +++ b/rtgui/defringe.cc @@ -26,6 +26,13 @@ using namespace rtengine::procparams; Defringe::Defringe () : Gtk::VBox(), FoldableToolPanel(this) { set_border_width(4); + std::vector bottomMilestones; + float R, G, B; + for (int i=0; i<7; i++) { + float x = float(i)*(1.0f/6.0); + Color::hsv2rgb01(x, 0.5f, 0.5f, R, G, B); + bottomMilestones.push_back( GradientMilestone(double(x), double(R), double(G), double(B)) ); + } enabled = Gtk::manage (new Gtk::CheckButton (M("GENERAL_ENABLED"))); enabled->set_active (false); @@ -38,6 +45,14 @@ Defringe::Defringe () : Gtk::VBox(), FoldableToolPanel(this) { hsep1->show (); pack_start (*hsep1); + curveEditorPF = new CurveEditorGroup (options.lastPFCurvesDir); + curveEditorPF->setCurveListener (this); + chshape = static_cast(curveEditorPF->addCurve(CT_Flat, M("TP_PFCURVE_CURVEEDITOR_CH"))); + chshape->setTooltip(M("TP_PFCURVE_CURVEEDITOR_CH_TOOLTIP")); + chshape->setIdentityValue(0.); + chshape->setBottomBarBgGradient(bottomMilestones); + chshape->setCurveColorProvider(this, 1); + enaConn = enabled->signal_toggled().connect( sigc::mem_fun(*this, &Defringe::enabledChanged) ); //edgConn = enabled->signal_toggled().connect( sigc::mem_fun(*this, &Defringe::edgeChanged) ); @@ -50,6 +65,24 @@ Defringe::Defringe () : Gtk::VBox(), FoldableToolPanel(this) { pack_start (*radius); pack_start (*threshold); + curveEditorPF->curveListComplete(); + + pack_start (*curveEditorPF, Gtk::PACK_SHRINK, 4); +} + +Defringe::~Defringe () { + delete curveEditorPF; +} + +void Defringe::colorForValue (double valX, double valY, int callerId, ColorCaller *caller) { + + float R, G, B; + if (callerId == 1) { // ch + Color::hsv2rgb01(float(valX), float(valY), 0.5f, R, G, B); + } + caller->ccRed = double(R); + caller->ccGreen = double(G); + caller->ccBlue = double(B); } void Defringe::read (const ProcParams* pp, const ParamsEdited* pedited) { @@ -57,33 +90,43 @@ void Defringe::read (const ProcParams* pp, const ParamsEdited* pedited) { disableListener (); if (pedited) { - radius->setEditedState (pedited->defringe.radius ? Edited : UnEdited); - threshold->setEditedState (pedited->defringe.threshold ? Edited : UnEdited); + radius->setEditedState ( pedited->defringe.radius ? Edited : UnEdited); + threshold->setEditedState ( pedited->defringe.threshold ? Edited : UnEdited); enabled->set_inconsistent (!pedited->defringe.enabled); + chshape->setUnChanged (!pedited->defringe.huecurve); } enaConn.block (true); enabled->set_active (pp->defringe.enabled); enaConn.block (false); - + lastEnabled = pp->defringe.enabled; radius->setValue (pp->defringe.radius); - threshold->setValue (pp->defringe.threshold); + threshold->setValue (pp->defringe.threshold); + chshape->setCurve (pp->defringe.huecurve); enableListener (); } + +void Defringe::autoOpenCurve () { + // WARNING: The following line won't work, since linear is a flat curve at 0. + chshape->openIfNonlinear(); +} + void Defringe::write (ProcParams* pp, ParamsEdited* pedited) { - pp->defringe.radius = radius->getValue (); + pp->defringe.radius = radius->getValue (); pp->defringe.threshold = (int)threshold->getValue (); - pp->defringe.enabled = enabled->get_active(); + pp->defringe.enabled = enabled->get_active(); + pp->defringe.huecurve = chshape->getCurve (); if (pedited) { - pedited->defringe.radius = radius->getEditedState (); + pedited->defringe.radius = radius->getEditedState (); pedited->defringe.threshold = threshold->getEditedState (); - pedited->defringe.enabled = !enabled->get_inconsistent(); + pedited->defringe.enabled = !enabled->get_inconsistent(); + pedited->defringe.huecurve = !chshape->isUnChanged (); } } @@ -94,13 +137,17 @@ void Defringe::setDefaults (const ProcParams* defParams, const ParamsEdited* ped if (pedited) { radius->setDefaultEditedState (pedited->defringe.radius ? Edited : UnEdited); - threshold->setDefaultEditedState (pedited->defringe.threshold ? Edited : UnEdited); - } + threshold->setDefaultEditedState (pedited->defringe.threshold ? Edited : UnEdited); + } else { radius->setDefaultEditedState (Irrelevant); - threshold->setDefaultEditedState (Irrelevant); + threshold->setDefaultEditedState (Irrelevant); } } +void Defringe::curveChanged () { + + if (listener && enabled->get_active()) listener->panelChanged (EvPFCurve, M("HISTORY_CUSTOMCURVE")); +} void Defringe::adjusterChanged (Adjuster* a, double newval) { diff --git a/rtgui/defringe.h b/rtgui/defringe.h index 0030cc064..9edbe644c 100644 --- a/rtgui/defringe.h +++ b/rtgui/defringe.h @@ -22,10 +22,17 @@ #include #include "adjuster.h" #include "toolpanel.h" +#include "guiutils.h" +#include "curveeditor.h" +#include "curveeditorgroup.h" +#include "colorprovider.h" -class Defringe : public Gtk::VBox, public AdjusterListener, public FoldableToolPanel { +class Defringe : public Gtk::VBox, public AdjusterListener, public FoldableToolPanel, public CurveListener, public ColorProvider{ protected: + CurveEditorGroup* curveEditorPF; + FlatCurveEditor* chshape; + Adjuster* radius; Adjuster* threshold; Gtk::CheckButton* enabled; @@ -36,14 +43,17 @@ class Defringe : public Gtk::VBox, public AdjusterListener, public FoldableToolP public: Defringe (); - + ~Defringe (); void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited=NULL); void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited=NULL); void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited=NULL); void setBatchMode (bool batchMode); + void autoOpenCurve (); + void curveChanged (); void adjusterChanged (Adjuster* a, double newval); - void enabledChanged (); + void enabledChanged (); + virtual void colorForValue (double valX, double valY, int callerId, ColorCaller* caller); }; diff --git a/rtgui/diagonalcurveeditorsubgroup.cc b/rtgui/diagonalcurveeditorsubgroup.cc index d4193fdfa..12a822a1c 100644 --- a/rtgui/diagonalcurveeditorsubgroup.cc +++ b/rtgui/diagonalcurveeditorsubgroup.cc @@ -634,7 +634,7 @@ void DiagonalCurveEditorSubGroup::removeEditor () { removeIfThere (parent, NURBSCurveBox, false); } -bool DiagonalCurveEditorSubGroup::curveReset(int cType) { +bool DiagonalCurveEditorSubGroup::curveReset(int cType, double iValue) { switch ((DiagonalCurveType) cType) { case (DCT_NURBS) : // = Control cage NURBSCurve->reset (); diff --git a/rtgui/diagonalcurveeditorsubgroup.h b/rtgui/diagonalcurveeditorsubgroup.h index d4fac0949..71a46e959 100644 --- a/rtgui/diagonalcurveeditorsubgroup.h +++ b/rtgui/diagonalcurveeditorsubgroup.h @@ -75,7 +75,7 @@ protected: void loadPressed (); void copyPressed (); void pastePressed (); - bool curveReset (int cType); + bool curveReset (int cType, double iValue); void removeEditor (); const std::vector getCurveFromGUI (int type); void shcChanged (); diff --git a/rtgui/flatcurveeditorsubgroup.cc b/rtgui/flatcurveeditorsubgroup.cc index 926d1ab8e..a453b7bdb 100644 --- a/rtgui/flatcurveeditorsubgroup.cc +++ b/rtgui/flatcurveeditorsubgroup.cc @@ -357,10 +357,10 @@ void FlatCurveEditorSubGroup::removeEditor () { removeIfThere (parent, CPointsCurveBox, false); } -bool FlatCurveEditorSubGroup::curveReset(int cType) { +bool FlatCurveEditorSubGroup::curveReset(int cType, double iValue) { switch ((FlatCurveType) cType) { case (FCT_MinMaxCPoints) : // = Control cage - CPointsCurve->reset (); + CPointsCurve->reset (iValue); return true; break; /*case (FCT_Parametric) : diff --git a/rtgui/flatcurveeditorsubgroup.h b/rtgui/flatcurveeditorsubgroup.h index 3a584006b..95eb90b4b 100644 --- a/rtgui/flatcurveeditorsubgroup.h +++ b/rtgui/flatcurveeditorsubgroup.h @@ -55,7 +55,7 @@ protected: void loadPressed (); void copyPressed (); void pastePressed (); - bool curveReset (int cType); + bool curveReset (int cType, double iValue); void removeEditor (); const std::vector getCurveFromGUI (int type); }; diff --git a/rtgui/mycurve.h b/rtgui/mycurve.h index 4d33e21c5..e14b58d1d 100644 --- a/rtgui/mycurve.h +++ b/rtgui/mycurve.h @@ -113,7 +113,7 @@ class MyCurve : public Gtk::DrawingArea, public BackBuffer, public ColorCaller { virtual std::vector getPoints () = 0; virtual void setPoints (const std::vector& p) = 0; virtual bool handleEvents (GdkEvent* event) = 0; - virtual void reset () = 0; + virtual void reset (double identityValue=0.5) = 0; static int getBarWidth() { return options.slimUI ? CBAR_WIDTH_SLIM : CBAR_WIDTH_STD; } }; diff --git a/rtgui/mydiagonalcurve.cc b/rtgui/mydiagonalcurve.cc index 9456142e7..9399e9e86 100644 --- a/rtgui/mydiagonalcurve.cc +++ b/rtgui/mydiagonalcurve.cc @@ -810,7 +810,7 @@ void MyDiagonalCurve::updateBackgroundHistogram (LUTu & hist) { } -void MyDiagonalCurve::reset() { +void MyDiagonalCurve::reset(double identityValue) { switch (curve.type) { case DCT_Spline : diff --git a/rtgui/mydiagonalcurve.h b/rtgui/mydiagonalcurve.h index 5ab2ed35a..aebd01b08 100644 --- a/rtgui/mydiagonalcurve.h +++ b/rtgui/mydiagonalcurve.h @@ -77,7 +77,7 @@ class MyDiagonalCurve : public MyCurve { void setType (DiagonalCurveType t); bool handleEvents (GdkEvent* event); void setActiveParam (int ac); - void reset (); + void reset (double identityValue=0.5); void updateBackgroundHistogram (LUTu & hist); }; diff --git a/rtgui/myflatcurve.cc b/rtgui/myflatcurve.cc index 9687d9350..8ef935673 100644 --- a/rtgui/myflatcurve.cc +++ b/rtgui/myflatcurve.cc @@ -1238,12 +1238,12 @@ void MyFlatCurve::setType (FlatCurveType t) { setDirty(true); } -void MyFlatCurve::reset() { +void MyFlatCurve::reset(double identityValue) { calcDimensions(); switch (curve.type) { case FCT_MinMaxCPoints : - defaultCurve(); + defaultCurve(identityValue); lit_point = -1; curveIsDirty = true; break; @@ -1256,7 +1256,7 @@ void MyFlatCurve::reset() { draw(); } -void MyFlatCurve::defaultCurve () { +void MyFlatCurve::defaultCurve (double iVal) { curve.x.resize(6); curve.y.resize(6); @@ -1266,7 +1266,7 @@ void MyFlatCurve::defaultCurve () { // Point for RGBCMY colors for (int i=0; i<6; i++) { curve.x.at(i) = (1./6.)*i; - curve.y.at(i) = 0.5; + curve.y.at(i) = iVal; curve.leftTangent.at(i) = 0.35; curve.rightTangent.at(i) = 0.35; } diff --git a/rtgui/myflatcurve.h b/rtgui/myflatcurve.h index dc6a2c8b8..7f9db613f 100644 --- a/rtgui/myflatcurve.h +++ b/rtgui/myflatcurve.h @@ -103,7 +103,7 @@ class MyFlatCurve : public MyCurve { void draw (); void movePoint(bool moveX, bool moveY); - void defaultCurve (); + void defaultCurve (double iVal=0.5); void interpolate (); void getCursorPosition(GdkEvent* event); void getMouseOverArea (); @@ -118,7 +118,7 @@ class MyFlatCurve : public MyCurve { void setPoints (const std::vector& p); void setType (FlatCurveType t); bool handleEvents (GdkEvent* event); - void reset (); + void reset (double identityValue=0.5); //void updateBackgroundHistogram (unsigned int* hist); }; diff --git a/rtgui/options.cc b/rtgui/options.cc index c9a108700..ca9aa2abf 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -149,6 +149,8 @@ void Options::updatePaths() { lastRgbCurvesDir = preferredPath; if (lastLabCurvesDir.empty() || !safe_file_test (lastLabCurvesDir, Glib::FILE_TEST_EXISTS) || !safe_file_test (lastLabCurvesDir, Glib::FILE_TEST_IS_DIR)) lastLabCurvesDir = preferredPath; + if (lastPFCurvesDir.empty() || !safe_file_test (lastPFCurvesDir, Glib::FILE_TEST_EXISTS) || !safe_file_test (lastPFCurvesDir, Glib::FILE_TEST_IS_DIR)) + lastPFCurvesDir = preferredPath; if (lastHsvCurvesDir.empty() || !safe_file_test (lastHsvCurvesDir, Glib::FILE_TEST_EXISTS) || !safe_file_test (lastHsvCurvesDir, Glib::FILE_TEST_IS_DIR)) lastHsvCurvesDir = preferredPath; if (lastToneCurvesDir.empty() || !safe_file_test (lastToneCurvesDir, Glib::FILE_TEST_EXISTS) || !safe_file_test (lastToneCurvesDir, Glib::FILE_TEST_IS_DIR)) @@ -472,6 +474,7 @@ void Options::setDefaults () { // at the end of the "updatePaths" method. lastRgbCurvesDir = ""; lastLabCurvesDir = ""; + lastPFCurvesDir = ""; lastHsvCurvesDir = ""; lastToneCurvesDir = ""; lastVibranceCurvesDir = ""; @@ -750,6 +753,7 @@ if (keyFile.has_group ("Dialogs")) { safeDirGet(keyFile, "Dialogs", "LastFlatfieldDir", lastFlatfieldDir); safeDirGet(keyFile, "Dialogs", "LastRgbCurvesDir", lastRgbCurvesDir); safeDirGet(keyFile, "Dialogs", "LastLabCurvesDir", lastLabCurvesDir); + safeDirGet(keyFile, "Dialogs", "LastPFCurvesDir", lastPFCurvesDir); safeDirGet(keyFile, "Dialogs", "LastHsvCurvesDir", lastHsvCurvesDir); safeDirGet(keyFile, "Dialogs", "LastToneCurvesDir", lastToneCurvesDir); safeDirGet(keyFile, "Dialogs", "LastVibranceCurvesDir", lastVibranceCurvesDir); @@ -998,6 +1002,7 @@ int Options::saveToFile (Glib::ustring fname) { keyFile.set_string ("Dialogs", "LastFlatfieldDir", lastFlatfieldDir); keyFile.set_string ("Dialogs", "LastRgbCurvesDir", lastRgbCurvesDir); keyFile.set_string ("Dialogs", "LastLabCurvesDir", lastLabCurvesDir); + keyFile.set_string ("Dialogs", "LastPFCurvesDir", lastPFCurvesDir); keyFile.set_string ("Dialogs", "LastHsvCurvesDir", lastHsvCurvesDir); keyFile.set_string ("Dialogs", "LastToneCurvesDir", lastToneCurvesDir); keyFile.set_string ("Dialogs", "LastVibranceCurvesDir", lastVibranceCurvesDir); diff --git a/rtgui/options.h b/rtgui/options.h index 57f32778e..bf4bbc49a 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -245,6 +245,7 @@ class Options { Glib::ustring lastFlatfieldDir; Glib::ustring lastRgbCurvesDir; Glib::ustring lastLabCurvesDir; + Glib::ustring lastPFCurvesDir; Glib::ustring lastHsvCurvesDir; Glib::ustring lastToneCurvesDir; Glib::ustring lastVibranceCurvesDir; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index fe8729e69..261a61fcd 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -143,6 +143,7 @@ void ParamsEdited::set (bool v) { defringe.enabled = v; defringe.radius = v; defringe.threshold = v; + defringe.huecurve = v; impulseDenoise.enabled = v; impulseDenoise.thresh = v; dirpyrDenoise.enabled = v; @@ -385,6 +386,7 @@ void ParamsEdited::initFrom (const std::vector defringe.enabled = defringe.enabled && p.defringe.enabled == other.defringe.enabled; defringe.radius = defringe.radius && p.defringe.radius == other.defringe.radius; defringe.threshold = defringe.threshold && p.defringe.threshold == other.defringe.threshold; + defringe.huecurve = defringe.huecurve && p.defringe.huecurve == other.defringe.huecurve; impulseDenoise.enabled = impulseDenoise.enabled && p.impulseDenoise.enabled == other.impulseDenoise.enabled; impulseDenoise.thresh = impulseDenoise.thresh && p.impulseDenoise.thresh == other.impulseDenoise.thresh; @@ -601,9 +603,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten //if (colorDenoise.enabled) toEdit.colorDenoise.enabled = mods.colorDenoise.enabled; //if (colorDenoise.amount) toEdit.colorDenoise.amount = mods.colorDenoise.amount; - if (defringe.enabled) toEdit.defringe.enabled = mods.defringe.enabled; - if (defringe.radius) toEdit.defringe.radius = mods.defringe.radius; - if (defringe.threshold) toEdit.defringe.threshold = mods.defringe.threshold; + if (defringe.enabled) toEdit.defringe.enabled = mods.defringe.enabled; + if (defringe.radius) toEdit.defringe.radius = mods.defringe.radius; + if (defringe.threshold) toEdit.defringe.threshold = mods.defringe.threshold; + if (defringe.huecurve) toEdit.defringe.huecurve = mods.defringe.huecurve; if (colorappearance.curve) toEdit.colorappearance.curve = mods.colorappearance.curve; if (colorappearance.curve2) toEdit.colorappearance.curve2 = mods.colorappearance.curve2; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 7232f97f7..5c2514877 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -173,6 +173,7 @@ public: bool enabled; bool radius; bool threshold; + bool huecurve; }; class ImpulseDenoiseParamsEdited { diff --git a/rtgui/ppversion.h b/rtgui/ppversion.h index 8f40bda20..737016de3 100644 --- a/rtgui/ppversion.h +++ b/rtgui/ppversion.h @@ -2,7 +2,7 @@ #define _PPVERSION_ // This number have to be incremented whenever the PP3 file format is modified -#define PPVERSION 307 +#define PPVERSION 308 #define PPVERSION_AEXP 301 //value of PPVERSION when auto exposure algorithm was modified /* Log of version changes