diff --git a/rtdata/languages/default b/rtdata/languages/default
index 1137f34cd..1ac0e40aa 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -479,7 +479,9 @@ HISTORY_MSG_242;Vignette Filter - Roundness
HISTORY_MSG_243;Vignetting - Rayon
HISTORY_MSG_244;Vignetting - Strength
HISTORY_MSG_245;Vignetting - Center
-HISTORY_MSG_246;CL curve
+HISTORY_MSG_246;"CL" curve
+HISTORY_MSG_247;"LH" curve
+HISTORY_MSG_248;"HH" curve
HISTORY_NEWSNAPSHOTAS;As...
HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
@@ -1287,6 +1289,10 @@ TP_LABCURVE_CURVEEDITOR_CL_TOOLTIP;Chromaticity according to luminance C=f(L)
TP_LABCURVE_CURVEEDITOR_LC;LC
TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP;Luminance according to chromaticity L=f(C)
TP_LABCURVE_CURVEEDITOR_LL_TOOLTIP;Luminance according to luminance L=f(L)
+TP_LABCURVE_CURVEEDITOR_LH;LH
+TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP;Luminance according to hue L=f(H)
+TP_LABCURVE_CURVEEDITOR_HH;HH
+TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP;Hue according to hue H=f(H)
TP_LABCURVE_LABEL;Lab Adjustments
TP_LABCURVE_LCREDSK;Restrict LC to red and skin tones
TP_LABCURVE_LCREDSK_TIP;If enabled, LC Curve (Luminance According to Chromaticity) is limited to red and skin tones\nIf disabled, applies to all tones
diff --git a/rtdata/profiles/BW/BW 1.pp3 b/rtdata/profiles/BW/BW 1.pp3
index ce1ec5a8e..e2202b475 100644
--- a/rtdata/profiles/BW/BW 1.pp3
+++ b/rtdata/profiles/BW/BW 1.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=true
@@ -61,6 +61,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=true
diff --git a/rtdata/profiles/BW/BW 2.pp3 b/rtdata/profiles/BW/BW 2.pp3
index 0739bc577..00b6ce9e1 100644
--- a/rtdata/profiles/BW/BW 2.pp3
+++ b/rtdata/profiles/BW/BW 2.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=true
@@ -61,6 +61,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=true
diff --git a/rtdata/profiles/BW/BW 3.pp3 b/rtdata/profiles/BW/BW 3.pp3
index f1ae6a7a3..a18421bfa 100644
--- a/rtdata/profiles/BW/BW 3.pp3
+++ b/rtdata/profiles/BW/BW 3.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=true
@@ -61,6 +61,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=true
diff --git a/rtdata/profiles/BW/BW 4.pp3 b/rtdata/profiles/BW/BW 4.pp3
index 28a729f64..e4b9ce075 100644
--- a/rtdata/profiles/BW/BW 4.pp3
+++ b/rtdata/profiles/BW/BW 4.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=true
@@ -61,6 +61,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=true
diff --git a/rtdata/profiles/Contrasty/Deep Shadows.pp3 b/rtdata/profiles/Contrasty/Deep Shadows.pp3
index 6bba39d85..72b60cbd2 100644
--- a/rtdata/profiles/Contrasty/Deep Shadows.pp3
+++ b/rtdata/profiles/Contrasty/Deep Shadows.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -40,6 +40,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=true
diff --git a/rtdata/profiles/Contrasty/Punchy 1.pp3 b/rtdata/profiles/Contrasty/Punchy 1.pp3
index f038e9201..dae53d794 100644
--- a/rtdata/profiles/Contrasty/Punchy 1.pp3
+++ b/rtdata/profiles/Contrasty/Punchy 1.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=true
@@ -40,6 +40,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=true
diff --git a/rtdata/profiles/Contrasty/Punchy 2.pp3 b/rtdata/profiles/Contrasty/Punchy 2.pp3
index 0296f3379..99efc9742 100644
--- a/rtdata/profiles/Contrasty/Punchy 2.pp3
+++ b/rtdata/profiles/Contrasty/Punchy 2.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=true
@@ -40,6 +40,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=false
diff --git a/rtdata/profiles/Default ISO High.pp3 b/rtdata/profiles/Default ISO High.pp3
index 185667360..7fdee4ee9 100644
--- a/rtdata/profiles/Default ISO High.pp3
+++ b/rtdata/profiles/Default ISO High.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=true
@@ -40,6 +40,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=false
diff --git a/rtdata/profiles/Default ISO Medium.pp3 b/rtdata/profiles/Default ISO Medium.pp3
index ccb613538..0078a0a1a 100644
--- a/rtdata/profiles/Default ISO Medium.pp3
+++ b/rtdata/profiles/Default ISO Medium.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=true
@@ -40,6 +40,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=true
diff --git a/rtdata/profiles/Default.pp3 b/rtdata/profiles/Default.pp3
index 81c77190c..b1ecad1f4 100644
--- a/rtdata/profiles/Default.pp3
+++ b/rtdata/profiles/Default.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=true
@@ -40,6 +40,9 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
+
[Sharpening]
Enabled=true
diff --git a/rtdata/profiles/Equilibrated.pp3 b/rtdata/profiles/Equilibrated.pp3
index 9ed3c619a..204b63467 100644
--- a/rtdata/profiles/Equilibrated.pp3
+++ b/rtdata/profiles/Equilibrated.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -40,6 +40,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Amber/Faded Amber 1 TM Bright.pp3 b/rtdata/profiles/Faded/Amber/Faded Amber 1 TM Bright.pp3
index cab6e9f52..80661fecc 100644
--- a/rtdata/profiles/Faded/Amber/Faded Amber 1 TM Bright.pp3
+++ b/rtdata/profiles/Faded/Amber/Faded Amber 1 TM Bright.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Amber/Faded Amber 1 TM.pp3 b/rtdata/profiles/Faded/Amber/Faded Amber 1 TM.pp3
index 15a94bd5d..4fdc27987 100644
--- a/rtdata/profiles/Faded/Amber/Faded Amber 1 TM.pp3
+++ b/rtdata/profiles/Faded/Amber/Faded Amber 1 TM.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Amber/Faded Amber 1.pp3 b/rtdata/profiles/Faded/Amber/Faded Amber 1.pp3
index 4dee517bc..ffe54bef9 100644
--- a/rtdata/profiles/Faded/Amber/Faded Amber 1.pp3
+++ b/rtdata/profiles/Faded/Amber/Faded Amber 1.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Blue/Faded Blue 1 TM Bright.pp3 b/rtdata/profiles/Faded/Blue/Faded Blue 1 TM Bright.pp3
index 5788442d7..87f295c37 100644
--- a/rtdata/profiles/Faded/Blue/Faded Blue 1 TM Bright.pp3
+++ b/rtdata/profiles/Faded/Blue/Faded Blue 1 TM Bright.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Blue/Faded Blue 1 TM.pp3 b/rtdata/profiles/Faded/Blue/Faded Blue 1 TM.pp3
index 212d12566..18de7f77c 100644
--- a/rtdata/profiles/Faded/Blue/Faded Blue 1 TM.pp3
+++ b/rtdata/profiles/Faded/Blue/Faded Blue 1 TM.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Blue/Faded Blue 1.pp3 b/rtdata/profiles/Faded/Blue/Faded Blue 1.pp3
index b2ebee8a7..f9f66a333 100644
--- a/rtdata/profiles/Faded/Blue/Faded Blue 1.pp3
+++ b/rtdata/profiles/Faded/Blue/Faded Blue 1.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Blue/Faded Blue Pink TM.pp3 b/rtdata/profiles/Faded/Blue/Faded Blue Pink TM.pp3
index 75ecc3a07..69ee5da0b 100644
--- a/rtdata/profiles/Faded/Blue/Faded Blue Pink TM.pp3
+++ b/rtdata/profiles/Faded/Blue/Faded Blue Pink TM.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Blue/Faded Blue Pink.pp3 b/rtdata/profiles/Faded/Blue/Faded Blue Pink.pp3
index db1580f9f..1584fbfc4 100644
--- a/rtdata/profiles/Faded/Blue/Faded Blue Pink.pp3
+++ b/rtdata/profiles/Faded/Blue/Faded Blue Pink.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Chocolate/Faded Chocolate 1 TM Bright.pp3 b/rtdata/profiles/Faded/Chocolate/Faded Chocolate 1 TM Bright.pp3
index d5a1bb484..0a8d70249 100644
--- a/rtdata/profiles/Faded/Chocolate/Faded Chocolate 1 TM Bright.pp3
+++ b/rtdata/profiles/Faded/Chocolate/Faded Chocolate 1 TM Bright.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Chocolate/Faded Chocolate 2 TM Bright.pp3 b/rtdata/profiles/Faded/Chocolate/Faded Chocolate 2 TM Bright.pp3
index e06cd8073..7704534db 100644
--- a/rtdata/profiles/Faded/Chocolate/Faded Chocolate 2 TM Bright.pp3
+++ b/rtdata/profiles/Faded/Chocolate/Faded Chocolate 2 TM Bright.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Golden/Faded Golden 1.pp3 b/rtdata/profiles/Faded/Golden/Faded Golden 1.pp3
index 6b4019df1..c6666be6b 100644
--- a/rtdata/profiles/Faded/Golden/Faded Golden 1.pp3
+++ b/rtdata/profiles/Faded/Golden/Faded Golden 1.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Golden/Faded Golden 2.pp3 b/rtdata/profiles/Faded/Golden/Faded Golden 2.pp3
index 0f6c286f8..423a0ad05 100644
--- a/rtdata/profiles/Faded/Golden/Faded Golden 2.pp3
+++ b/rtdata/profiles/Faded/Golden/Faded Golden 2.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Green/Faded Green 1 TM Bright.pp3 b/rtdata/profiles/Faded/Green/Faded Green 1 TM Bright.pp3
index f48019d29..7dcbefe6e 100644
--- a/rtdata/profiles/Faded/Green/Faded Green 1 TM Bright.pp3
+++ b/rtdata/profiles/Faded/Green/Faded Green 1 TM Bright.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Green/Faded Green 1 TM.pp3 b/rtdata/profiles/Faded/Green/Faded Green 1 TM.pp3
index 9321e73b5..bf1c7c4da 100644
--- a/rtdata/profiles/Faded/Green/Faded Green 1 TM.pp3
+++ b/rtdata/profiles/Faded/Green/Faded Green 1 TM.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Green/Faded Green 1.pp3 b/rtdata/profiles/Faded/Green/Faded Green 1.pp3
index 9e4be0e2d..80cd6843f 100644
--- a/rtdata/profiles/Faded/Green/Faded Green 1.pp3
+++ b/rtdata/profiles/Faded/Green/Faded Green 1.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Green/Faded Green 2.pp3 b/rtdata/profiles/Faded/Green/Faded Green 2.pp3
index b49034667..f6be21ba0 100644
--- a/rtdata/profiles/Faded/Green/Faded Green 2.pp3
+++ b/rtdata/profiles/Faded/Green/Faded Green 2.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Green/Faded Green 3.pp3 b/rtdata/profiles/Faded/Green/Faded Green 3.pp3
index b92a82ac1..fd6c241a9 100644
--- a/rtdata/profiles/Faded/Green/Faded Green 3.pp3
+++ b/rtdata/profiles/Faded/Green/Faded Green 3.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Neutral/Faded Neutral TM.pp3 b/rtdata/profiles/Faded/Neutral/Faded Neutral TM.pp3
index 810206c35..8d1cd3649 100644
--- a/rtdata/profiles/Faded/Neutral/Faded Neutral TM.pp3
+++ b/rtdata/profiles/Faded/Neutral/Faded Neutral TM.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Neutral/Faded Neutral.pp3 b/rtdata/profiles/Faded/Neutral/Faded Neutral.pp3
index 6419870b1..3b47cf69b 100644
--- a/rtdata/profiles/Faded/Neutral/Faded Neutral.pp3
+++ b/rtdata/profiles/Faded/Neutral/Faded Neutral.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Purple/Faded Purple 1 TM Bright.pp3 b/rtdata/profiles/Faded/Purple/Faded Purple 1 TM Bright.pp3
index e77a6ead1..048332144 100644
--- a/rtdata/profiles/Faded/Purple/Faded Purple 1 TM Bright.pp3
+++ b/rtdata/profiles/Faded/Purple/Faded Purple 1 TM Bright.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Purple/Faded Purple 1 TM.pp3 b/rtdata/profiles/Faded/Purple/Faded Purple 1 TM.pp3
index a38af5445..5856f03d1 100644
--- a/rtdata/profiles/Faded/Purple/Faded Purple 1 TM.pp3
+++ b/rtdata/profiles/Faded/Purple/Faded Purple 1 TM.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Purple/Faded Purple 1.pp3 b/rtdata/profiles/Faded/Purple/Faded Purple 1.pp3
index 5767c5b77..8c08d1fb7 100644
--- a/rtdata/profiles/Faded/Purple/Faded Purple 1.pp3
+++ b/rtdata/profiles/Faded/Purple/Faded Purple 1.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Purple/Faded Purple 2 TM.pp3 b/rtdata/profiles/Faded/Purple/Faded Purple 2 TM.pp3
index 6845070e4..e9a0a3d1b 100644
--- a/rtdata/profiles/Faded/Purple/Faded Purple 2 TM.pp3
+++ b/rtdata/profiles/Faded/Purple/Faded Purple 2 TM.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Purple/Faded Purple 2.pp3 b/rtdata/profiles/Faded/Purple/Faded Purple 2.pp3
index 98032ae6e..fd48cc929 100644
--- a/rtdata/profiles/Faded/Purple/Faded Purple 2.pp3
+++ b/rtdata/profiles/Faded/Purple/Faded Purple 2.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Teal/Faded Teal Orange TM Bright.pp3 b/rtdata/profiles/Faded/Teal/Faded Teal Orange TM Bright.pp3
index 0039f160e..19267210a 100644
--- a/rtdata/profiles/Faded/Teal/Faded Teal Orange TM Bright.pp3
+++ b/rtdata/profiles/Faded/Teal/Faded Teal Orange TM Bright.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Teal/Faded Teal Orange TM.pp3 b/rtdata/profiles/Faded/Teal/Faded Teal Orange TM.pp3
index 5d73fb03e..2f5ab145e 100644
--- a/rtdata/profiles/Faded/Teal/Faded Teal Orange TM.pp3
+++ b/rtdata/profiles/Faded/Teal/Faded Teal Orange TM.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Teal/Faded Teal Orange.pp3 b/rtdata/profiles/Faded/Teal/Faded Teal Orange.pp3
index a9e611b0b..de0c56994 100644
--- a/rtdata/profiles/Faded/Teal/Faded Teal Orange.pp3
+++ b/rtdata/profiles/Faded/Teal/Faded Teal Orange.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Warm/Faded Warm 1 TM Bright.pp3 b/rtdata/profiles/Faded/Warm/Faded Warm 1 TM Bright.pp3
index 7939e8ce7..0ff52813f 100644
--- a/rtdata/profiles/Faded/Warm/Faded Warm 1 TM Bright.pp3
+++ b/rtdata/profiles/Faded/Warm/Faded Warm 1 TM Bright.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Warm/Faded Warm 1 TM.pp3 b/rtdata/profiles/Faded/Warm/Faded Warm 1 TM.pp3
index 5812af95c..19b5b222c 100644
--- a/rtdata/profiles/Faded/Warm/Faded Warm 1 TM.pp3
+++ b/rtdata/profiles/Faded/Warm/Faded Warm 1 TM.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Warm/Faded Warm 1.pp3 b/rtdata/profiles/Faded/Warm/Faded Warm 1.pp3
index bff449544..f7fe7d94d 100644
--- a/rtdata/profiles/Faded/Warm/Faded Warm 1.pp3
+++ b/rtdata/profiles/Faded/Warm/Faded Warm 1.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Warm/Faded Warm 2.pp3 b/rtdata/profiles/Faded/Warm/Faded Warm 2.pp3
index 16effce39..fb3c165b9 100644
--- a/rtdata/profiles/Faded/Warm/Faded Warm 2.pp3
+++ b/rtdata/profiles/Faded/Warm/Faded Warm 2.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/Faded/Warm/Faded Warm 3.pp3 b/rtdata/profiles/Faded/Warm/Faded Warm 3.pp3
index 62b296084..fbd9d2eed 100644
--- a/rtdata/profiles/Faded/Warm/Faded Warm 3.pp3
+++ b/rtdata/profiles/Faded/Warm/Faded Warm 3.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Vibrance]
Enabled=false
diff --git a/rtdata/profiles/High-Key.pp3 b/rtdata/profiles/High-Key.pp3
index 5b59f47c2..b4fede8ae 100644
--- a/rtdata/profiles/High-Key.pp3
+++ b/rtdata/profiles/High-Key.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=true
@@ -40,6 +40,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=true
diff --git a/rtdata/profiles/Natural 1.pp3 b/rtdata/profiles/Natural 1.pp3
index a16e1bee6..41099e668 100644
--- a/rtdata/profiles/Natural 1.pp3
+++ b/rtdata/profiles/Natural 1.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=true
@@ -40,6 +40,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=true
diff --git a/rtdata/profiles/Natural 2.pp3 b/rtdata/profiles/Natural 2.pp3
index 5d75796fa..cddfec31b 100644
--- a/rtdata/profiles/Natural 2.pp3
+++ b/rtdata/profiles/Natural 2.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=true
@@ -40,6 +40,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=true
diff --git a/rtdata/profiles/Pop/Pop 1.pp3 b/rtdata/profiles/Pop/Pop 1.pp3
index 917003afb..48b4730d8 100644
--- a/rtdata/profiles/Pop/Pop 1.pp3
+++ b/rtdata/profiles/Pop/Pop 1.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -40,6 +40,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=true
diff --git a/rtdata/profiles/Pop/Pop 2 L.pp3 b/rtdata/profiles/Pop/Pop 2 L.pp3
index acfaac89c..c6b6570bb 100644
--- a/rtdata/profiles/Pop/Pop 2 L.pp3
+++ b/rtdata/profiles/Pop/Pop 2 L.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -40,6 +40,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=true
diff --git a/rtdata/profiles/Pop/Pop 3 Skin.pp3 b/rtdata/profiles/Pop/Pop 3 Skin.pp3
index b5261d827..aa7e8a85d 100644
--- a/rtdata/profiles/Pop/Pop 3 Skin.pp3
+++ b/rtdata/profiles/Pop/Pop 3 Skin.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -40,6 +40,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=true
diff --git a/rtdata/profiles/Pop/Pop 4 BW.pp3 b/rtdata/profiles/Pop/Pop 4 BW.pp3
index 494dce111..86295ed56 100644
--- a/rtdata/profiles/Pop/Pop 4 BW.pp3
+++ b/rtdata/profiles/Pop/Pop 4 BW.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -61,6 +61,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=true
diff --git a/rtdata/profiles/Portrait/Portrait Lejto.pp3 b/rtdata/profiles/Portrait/Portrait Lejto.pp3
index 0354e2b9c..58ee3a9dd 100644
--- a/rtdata/profiles/Portrait/Portrait Lejto.pp3
+++ b/rtdata/profiles/Portrait/Portrait Lejto.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -35,6 +35,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=true
diff --git a/rtdata/profiles/Portrait/Portrait Smooth.pp3 b/rtdata/profiles/Portrait/Portrait Smooth.pp3
index 91b8a58f6..606a99894 100644
--- a/rtdata/profiles/Portrait/Portrait Smooth.pp3
+++ b/rtdata/profiles/Portrait/Portrait Smooth.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -40,6 +40,8 @@ ccCurve=1;0;0;0.254;0.300;1;1;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=true
diff --git a/rtdata/profiles/Skintones/Skintones - Natural TM.pp3 b/rtdata/profiles/Skintones/Skintones - Natural TM.pp3
index 02df2bc1d..84828307a 100644
--- a/rtdata/profiles/Skintones/Skintones - Natural TM.pp3
+++ b/rtdata/profiles/Skintones/Skintones - Natural TM.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=false
diff --git a/rtdata/profiles/Skintones/Skintones - Natural.pp3 b/rtdata/profiles/Skintones/Skintones - Natural.pp3
index db318fef1..33e6cbff0 100644
--- a/rtdata/profiles/Skintones/Skintones - Natural.pp3
+++ b/rtdata/profiles/Skintones/Skintones - Natural.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=false
diff --git a/rtdata/profiles/Skintones/Skintones - Pale TM Bright.pp3 b/rtdata/profiles/Skintones/Skintones - Pale TM Bright.pp3
index d5ff79eaa..8fccfb869 100644
--- a/rtdata/profiles/Skintones/Skintones - Pale TM Bright.pp3
+++ b/rtdata/profiles/Skintones/Skintones - Pale TM Bright.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=false
diff --git a/rtdata/profiles/Skintones/Skintones - Pale TM.pp3 b/rtdata/profiles/Skintones/Skintones - Pale TM.pp3
index f857e0ed6..d5eb6f0b7 100644
--- a/rtdata/profiles/Skintones/Skintones - Pale TM.pp3
+++ b/rtdata/profiles/Skintones/Skintones - Pale TM.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=false
diff --git a/rtdata/profiles/Skintones/Skintones - Pale.pp3 b/rtdata/profiles/Skintones/Skintones - Pale.pp3
index 603265705..f69b6d44b 100644
--- a/rtdata/profiles/Skintones/Skintones - Pale.pp3
+++ b/rtdata/profiles/Skintones/Skintones - Pale.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=false
diff --git a/rtdata/profiles/Skintones/Skintones - Soft Texture.pp3 b/rtdata/profiles/Skintones/Skintones - Soft Texture.pp3
index a1a8967d8..b9358b156 100644
--- a/rtdata/profiles/Skintones/Skintones - Soft Texture.pp3
+++ b/rtdata/profiles/Skintones/Skintones - Soft Texture.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[RGB Curves]
LumaMode=true
diff --git a/rtdata/profiles/Skintones/Skintones - Strong Texture.pp3 b/rtdata/profiles/Skintones/Skintones - Strong Texture.pp3
index 15ed11042..c1aa08a8c 100644
--- a/rtdata/profiles/Skintones/Skintones - Strong Texture.pp3
+++ b/rtdata/profiles/Skintones/Skintones - Strong Texture.pp3
@@ -1,6 +1,6 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[RGB Curves]
LumaMode=true
diff --git a/rtdata/profiles/Skintones/Skintones - Studio TM.pp3 b/rtdata/profiles/Skintones/Skintones - Studio TM.pp3
index f16d65a0e..8c9433b40 100644
--- a/rtdata/profiles/Skintones/Skintones - Studio TM.pp3
+++ b/rtdata/profiles/Skintones/Skintones - Studio TM.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -36,6 +36,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=false
diff --git a/rtdata/profiles/Skintones/Skintones - Studio.pp3 b/rtdata/profiles/Skintones/Skintones - Studio.pp3
index eb3adb725..32c2e8303 100644
--- a/rtdata/profiles/Skintones/Skintones - Studio.pp3
+++ b/rtdata/profiles/Skintones/Skintones - Studio.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.11.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -41,6 +41,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=false
diff --git a/rtdata/profiles/Skintones/Skintones - StudioBase 1 TM.pp3 b/rtdata/profiles/Skintones/Skintones - StudioBase 1 TM.pp3
index cab03bb2c..a31a9abee 100644
--- a/rtdata/profiles/Skintones/Skintones - StudioBase 1 TM.pp3
+++ b/rtdata/profiles/Skintones/Skintones - StudioBase 1 TM.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -36,6 +36,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=false
diff --git a/rtdata/profiles/Skintones/Skintones - StudioBase 1.pp3 b/rtdata/profiles/Skintones/Skintones - StudioBase 1.pp3
index 96ffddb33..2d98e8574 100644
--- a/rtdata/profiles/Skintones/Skintones - StudioBase 1.pp3
+++ b/rtdata/profiles/Skintones/Skintones - StudioBase 1.pp3
@@ -1,7 +1,7 @@
[Version]
AppVersion=4.0.161
-Version=314
+Version=315
[Exposure]
Auto=false
@@ -36,6 +36,8 @@ ccCurve=0;
chCurve=0;
LcCurve=0;
ClCurve=0;
+lhCurve=0;
+hhCurve=0;
[Sharpening]
Enabled=false
diff --git a/rtengine/PF_correct_RT.cc b/rtengine/PF_correct_RT.cc
index eef63463e..9e438b349 100644
--- a/rtengine/PF_correct_RT.cc
+++ b/rtengine/PF_correct_RT.cc
@@ -118,8 +118,7 @@ float chromave=0.0f;
float HH=xatan2f(src->b[i][j],src->a[i][j]);
#endif
double hr;
- Color::huelab_to_huehsv (HH, hr);
- float chparam = float((chCurve->getVal(hr)-0.5f) * 2.0f);//get C=f(H)
+ float chparam = float((chCurve->getVal((hr=Color::huelab_to_huehsv2(HH)))-0.5f) * 2.0f);//get C=f(H)
if(chparam > 0.f) chparam /=2.f; // reduced action if chparam > 0
chromaChfactor=1.0f+chparam;
}
@@ -398,8 +397,7 @@ if( chCurve ) {
float HH=xatan2f(srbb[i][j],sraa[i][j]);
#endif
double hr;
- Color::huelab_to_huehsv (HH, hr); //approximation Cam / Lab
- float chparam = float((chCurve->getVal(hr)-0.5f) * 2.0f);//get C=f(H)
+ float chparam = float((chCurve->getVal((hr=Color::huelab_to_huehsv2(HH)))-0.5f) * 2.0f);//get C=f(H)
if(chparam > 0.f) chparam /=2.f; // reduced action if chparam > 0
chromaChfactor=1.0f+chparam;
}
diff --git a/rtengine/color.cc b/rtengine/color.cc
index d51108679..6fadd1236 100644
--- a/rtengine/color.cc
+++ b/rtengine/color.cc
@@ -661,22 +661,6 @@ namespace rtengine {
a = (500.0 * (fx - fy) );
b = (200.0 * (fy - fz) );
}
-
- void Color::huelab_to_huehsv (float HH, 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;
- }
double Color::f2xyz(double f) {
const double epsilonExpInv3 = 6.0/29.0;
diff --git a/rtengine/color.h b/rtengine/color.h
index 53923eca8..15cf6f72b 100644
--- a/rtengine/color.h
+++ b/rtengine/color.h
@@ -140,7 +140,6 @@ public:
float &mixerBlue, float mixerOrange, float mixerYellow, float mixerCyan, float mixerPurple, float mixerMagenta,
bool autoc, bool complement, float &kcorec, double &rrm, double &ggm, double &bbm);
- static void huelab_to_huehsv (float HH, double &hr);
// standard srgb gamma and its inverse
static inline double gamma2 (double x) {
@@ -219,6 +218,28 @@ public:
//void gamutmap(LabImage* );
static void gamutmap(float &X, float &Y, float &Z, const double p[3][3]);
+ static inline double huelab_to_huehsv2 (float HH){
+ //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 !!)
+ double hr;
+ //allways put h between 0 and 1
+
+ if (HH>=0.f && HH < 0.6f) hr=0.11666*(double) HH + 0.93; //hr 0.93 1. full red
+ else if (HH>=0.6f && HH < 1.4f) hr=0.1125*double(HH) - 0.0675; //hr 0.0 0.09 red yellow orange
+ else if (HH>=1.4f && HH < 2.f) hr=0.2666*double(HH) - 0.2833; //hr 0.09 0.25 orange yellow
+ else if (HH>=2.f && HH < 3.14159f) hr=0.1489*double(HH) - 0.04785; //hr 0.25 0.42 yellow green green
+ else if (HH>=-3.14159f && HH < -2.8f) hr=0.23419*double(HH) +1.1557; //hr 0.42 0.5 green
+ else if (HH>=-2.8f && HH < -2.3f) hr=0.16*double(HH) + 0.948; //hr 0.5 0.58 cyan
+ else if (HH>=-2.3f && HH < -0.9f) hr=0.12143*double(HH)+ 0.85928; //hr 0.58 0.75 blue blue-sky
+ else if (HH>=-0.9f && HH < -0.1f) hr=0.2125*double(HH) + 0.94125; //hr 0.75 0.92 purple magenta
+ else if (HH>=-0.1f && HH < 0.f) hr=0.1*double(HH) + 0.93; //hr 0.92 0.93 red
+ // in case of !
+ if (hr<0.0) hr += 1.0;
+ else if(hr>1.0) hr -= 1.0;
+ return (hr);
+ }
+
+
static inline float f2xyz(float f) {
const float epsilonExpInv3 = 6.0/29.0;
const float kappaInv = 27.0/24389.0; // inverse of kappa
diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc
index 07e7e846a..8bea8519e 100644
--- a/rtengine/improcfun.cc
+++ b/rtengine/improcfun.cc
@@ -46,6 +46,20 @@
#endif
#undef CLIPD
#define CLIPD(a) ((a)>0.0f?((a)<1.0f?(a):1.0f):0.0f)
+#define PIX_SORT(a,b) { if ((a)>(b)) {temp=(a);(a)=(b);(b)=temp;} }
+
+#define med3(a0,a1,a2,a3,a4,a5,a6,a7,a8,median) { \
+pp[0]=a0; pp[1]=a1; pp[2]=a2; pp[3]=a3; pp[4]=a4; pp[5]=a5; pp[6]=a6; pp[7]=a7; pp[8]=a8; \
+PIX_SORT(pp[1],pp[2]); PIX_SORT(pp[4],pp[5]); PIX_SORT(pp[7],pp[8]); \
+PIX_SORT(pp[0],pp[1]); PIX_SORT(pp[3],pp[4]); PIX_SORT(pp[6],pp[7]); \
+PIX_SORT(pp[1],pp[2]); PIX_SORT(pp[4],pp[5]); PIX_SORT(pp[7],pp[8]); \
+PIX_SORT(pp[0],pp[3]); PIX_SORT(pp[5],pp[8]); PIX_SORT(pp[4],pp[7]); \
+PIX_SORT(pp[3],pp[6]); PIX_SORT(pp[1],pp[4]); PIX_SORT(pp[2],pp[5]); \
+PIX_SORT(pp[4],pp[7]); PIX_SORT(pp[4],pp[2]); PIX_SORT(pp[6],pp[4]); \
+PIX_SORT(pp[4],pp[2]); median=pp[4];} //pp4 = median
+
+
+
namespace rtengine {
@@ -2547,13 +2561,12 @@ if(blackwhite){
l_r = L/32768.f;
if (bwlCurveEnabled) {
double hr;
- Color::huelab_to_huehsv (HH, hr);//correspondance H lab ==> h hsv
- float valparam = float((bwlCurve->getVal(hr)-0.5f) * 2.0f);//get l_r=f(H)
+ float valparam = float((bwlCurve->getVal((hr=Color::huelab_to_huehsv2(HH)))-0.5f) * 2.0f);//get l_r=f(H)
float kcc=(CC/70.f);//take Chroma into account...70 "middle" of chromaticity (arbitrary and simple), one can imagine other algorithme
//reduct action for low chroma and increase action for high chroma
valparam *= kcc;
if(valparam > 0.f) { l_r = (1.f-valparam)*l_r+ valparam*(1.f-SQR(SQR(SQR(SQR(1.f-min(l_r,1.0f))))));}// SQR (SQR((SQR) to increase action in low light
- else l_r *= (1.f + 2.f*valparam);//for negative
+ else l_r *= (1.f + valparam);//for negative
}
L=l_r*32768.f;
float RR,GG,BB;
@@ -2855,7 +2868,7 @@ void ImProcFunctions::chromiLuminanceCurve (int pW, LabImage* lold, LabImage* ln
int H = lold->H;
// lhskcurve.dump("lh_curve");
//init Flatcurve for C=f(H)
- FlatCurve* chCurve = NULL;
+ FlatCurve* chCurve = NULL;// curve C=f(H)
bool chutili = false;
if (params->labCurve.chromaticity > -100) {
chCurve = new FlatCurve(params->labCurve.chcurve);
@@ -2863,6 +2876,24 @@ void ImProcFunctions::chromiLuminanceCurve (int pW, LabImage* lold, LabImage* ln
chutili=true;
}//do not use "Munsell" if Chcurve not used
}
+ FlatCurve* lhCurve = NULL;//curve L=f(H)
+ bool lhutili = false;
+ if (params->labCurve.chromaticity > -100) {
+ lhCurve = new FlatCurve(params->labCurve.lhcurve);
+ if (lhCurve && !lhCurve->isIdentity()) {
+ lhutili=true;
+ }
+ }
+
+ FlatCurve* hhCurve = NULL;//curve H=f(H)
+ bool hhutili = false;
+ if (params->labCurve.chromaticity > -100) {
+ hhCurve = new FlatCurve(params->labCurve.hhcurve);
+ if (hhCurve && !hhCurve->isIdentity()) {
+ hhutili=true;
+ }
+ }
+
LUTf dCcurve(65536,0);
LUTf dLcurve(65536,0);
@@ -2940,14 +2971,14 @@ void ImProcFunctions::chromiLuminanceCurve (int pW, LabImage* lold, LabImage* ln
bool clut = clcutili;
double rstprotection = 100.-params->labCurve.rstprotection; // Red and Skin Tones Protection
// avoid color shift is disabled when bwToning is activated and enabled if gamut is true in colorappearanace
-// bool avoidColorShift = (params->labCurve.avoidcolorshift || params->colorappearance.gamut )&& !bwToning ;
bool avoidColorShift = (params->labCurve.avoidcolorshift || (params->colorappearance.gamut && params->colorappearance.enabled)) && !bwToning ;
int protectRed = settings->protectred;
double protectRedH = settings->protectredh;
bool gamutLch = settings->gamutLch;
+ float amountchroma = (float) settings->amchroma;
// only if user activate Lab adjustements
if (avoidColorShift) {
- if(autili || butili || ccutili || cclutili || chutili || clcutili || utili || chromaticity)
+ if(autili || butili || ccutili || cclutili || chutili || lhutili || hhutili || clcutili || utili || chromaticity)
Color::LabGamutMunsell(lold, Lold, Cold, /*corMunsell*/true, /*lumaMuns*/false, params->hlrecovery.enabled, /*gamut*/true, params->icm.working, multiThread);
}
@@ -2976,8 +3007,7 @@ void ImProcFunctions::chromiLuminanceCurve (int pW, LabImage* lold, LabImage* ln
{wprof[1][0],wprof[1][1],wprof[1][2]},
{wprof[2][0],wprof[2][1],wprof[2][2]}};
-
-#pragma omp for schedule(dynamic, 10)
+ #pragma omp for schedule(dynamic, 10)
for (int i=0; iL[i][j]/327.68f;
@@ -2993,17 +3023,83 @@ void ImProcFunctions::chromiLuminanceCurve (int pW, LabImage* lold, LabImage* ln
float chromaChfactor=1.0f;
float atmp = acurve[lold->a[i][j]+32768.0f]-32768.0f;// curves Lab a
float btmp = bcurve[lold->b[i][j]+32768.0f]-32768.0f;// curves Lab b
+ float Chprov2=Chprov1;
int poscc,posp,posl;
+ bool inRGB;
+ const float ClipLevel = 65535.0f;
+ if (lhutili) { // L=f(H)
+ float l_r;//Luminance Lab in 0..1
+ l_r = Lprov1/100.f;
+ {
+ double lr;
+ float khue=1.9f;//in reserve in case of!
+ float valparam = float((lhCurve->getVal(lr=Color::huelab_to_huehsv2(HH))-0.5f));//get l_r=f(H)
+ float valparamneg;
+ valparamneg=valparam;
+ float kcc=(CC/amountchroma);//take Chroma into account...40 "middle low" of chromaticity (arbitrary and simple), one can imagine other algorithme
+ //reduct action for low chroma and increase action for high chroma
+ valparam *= 2.f*kcc;
+ valparamneg*= kcc;//slightly different for negative
+ if(valparam > 0.f) { l_r = (1.f-valparam)*l_r+ valparam*(1.f-SQR(((SQR(1.f-min(l_r,1.0f))))));}
+ else {l_r *= (1.f+khue*valparamneg);}//for negative
+ }
+
+ Lprov1=l_r*100.f;
+
+ Chprov2 = sqrt(SQR(atmp/327.68f)+SQR(btmp/327.68f));
+ //Gamut control especialy fot negative values slightly different of gamutlchonly
+ do {
+ inRGB=true;
+ float2 sincosval = xsincosf(HH);
+ float aprov1=Chprov2*sincosval.y;
+ float bprov1=Chprov2*sincosval.x;
+
+ float fy = (0.00862069f *Lprov1 )+ 0.137932f;
+ float fx = (0.002f * aprov1) + fy;
+ float fz = fy - (0.005f * bprov1);
+
+ float x_ = 65535.0f * Color::f2xyz(fx)*Color::D50x;
+ float z_ = 65535.0f * Color::f2xyz(fz)*Color::D50z;
+ float y_=(Lprov1>Color::epskap) ? 65535.0*fy*fy*fy : 65535.0*Lprov1/Color::kappa;
+ float R,G,B;
+ Color::xyz2rgb(x_,y_,z_,R,G,B,wip);
+ if (R<0.0f || G<0.0f || B<0.0f) {
+ if(Lprov1 < 0.1f) Lprov1=0.1f;
+ Chprov2*=0.95f;
+ inRGB=false;
+ }
+ else
+ if (!highlight && (R>ClipLevel || G>ClipLevel || B>ClipLevel)) {
+ if (Lprov1 > 99.999f) Lprov1 = 99.98f;
+ Chprov2 *= 0.95f;
+ inRGB = false;
+ }
+ }
+ while (!inRGB) ;
+
+ float2 sincosval = xsincosf(HH);
+ atmp=327.68f*Chprov2*sincosval.y;
+ btmp=327.68f*Chprov2*sincosval.x;
+
+ }
// calculate C=f(H)
if (chutili) {
double hr;
- Color::huelab_to_huehsv (HH, hr);
- float chparam = float((chCurve->getVal(hr)-0.5f) * 2.0f);//get C=f(H)
+ float chparam = float((chCurve->getVal((hr=Color::huelab_to_huehsv2(HH)))-0.5f) * 2.0f);//get C=f(H)
chromaChfactor=1.0f+chparam;
}
+
atmp *= chromaChfactor;//apply C=f(H)
btmp *= chromaChfactor;
+
+ if (hhutili) { // H=f(H)
+ //hue Lab in -PI +PI
+ double hr;
+ float valparam = float((hhCurve->getVal(hr=Color::huelab_to_huehsv2(HH))-0.5f) * 1.7f) +HH;//get H=f(H) 1.7 optimisation !
+ HH= valparam;
+ }
+
//simulate very approximative gamut f(L) : with pyramid transition
float dred=55.0f;//C red value limit
if (Lprov1<25.0f) dred = 40.0f;
@@ -3215,7 +3311,7 @@ void ImProcFunctions::chromiLuminanceCurve (int pW, LabImage* lold, LabImage* ln
Color::Yuv2Lab(Y,u,v,lnew->L[i][j],lnew->a[i][j],lnew->b[i][j], wp);
}
- if (utili || autili || butili || ccut || clut || cclutili || chutili || clcutili || chromaticity) {
+ if (utili || autili || butili || ccut || clut || cclutili || chutili || lhutili || hhutili || clcutili || chromaticity) {
float correctionHue=0.0f; // Munsell's correction
float correctlum=0.0f;
@@ -3245,10 +3341,12 @@ void ImProcFunctions::chromiLuminanceCurve (int pW, LabImage* lold, LabImage* ln
// if(Lprov1 > maxlp) maxlp=Lprov1;
// if(Lprov1 < minlp) minlp=Lprov1;
lnew->L[i][j]=Lprov1*327.68f;
+ lnew->a[i][j]=327.68f*Chprov1*cos(HH);
+ lnew->b[i][j]=327.68f*Chprov1*sin(HH);
//Luv limiter only
- lnew->a[i][j] = atmp;
- lnew->b[i][j] = btmp;
+ //lnew->a[i][j] = atmp;
+ //lnew->b[i][j] = btmp;
}
}
} // end of parallelization
@@ -3288,6 +3386,9 @@ void ImProcFunctions::chromiLuminanceCurve (int pW, LabImage* lold, LabImage* ln
delete [] Cold;
if (chCurve) delete chCurve;
+ if (lhCurve) delete lhCurve;
+ if (hhCurve) delete hhCurve;
+
}
@@ -3830,3 +3931,5 @@ fclose(f);*/
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
}
+#undef PIX_SORT
+#undef med3x3
diff --git a/rtengine/procevents.h b/rtengine/procevents.h
index 0f19b04e3..05ca9c958 100644
--- a/rtengine/procevents.h
+++ b/rtengine/procevents.h
@@ -269,7 +269,10 @@ enum ProcEvent {
EvVignettingStrenght=243,
EvVignettingCenter=244,
EvLCLCurve=245,
- NUMOFEVENTS=246
+ EvLLHCurve=246,
+ EvLHHCurve=247,
+
+ NUMOFEVENTS=248
};
}
#endif
diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc
index 3d2875386..a7507da69 100644
--- a/rtengine/procparams.cc
+++ b/rtengine/procparams.cc
@@ -163,6 +163,11 @@ void ProcParams::setDefaults () {
labCurve.cccurve.push_back(DCT_Linear);
labCurve.chcurve.clear ();
labCurve.chcurve.push_back(FCT_Linear);
+ labCurve.lhcurve.clear ();
+ labCurve.lhcurve.push_back(FCT_Linear);
+ labCurve.hhcurve.clear ();
+ labCurve.hhcurve.push_back(FCT_Linear);
+
labCurve.lccurve.clear ();
labCurve.lccurve.push_back(DCT_Linear);
labCurve.clcurve.clear ();
@@ -679,6 +684,14 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol
Glib::ArrayHandle chcurve = labCurve.chcurve;
keyFile.set_double_list("Luminance Curve", "chCurve", chcurve);
}
+ if (!pedited || pedited->labCurve.lhcurve) {
+ Glib::ArrayHandle lhcurve = labCurve.lhcurve;
+ keyFile.set_double_list("Luminance Curve", "lhCurve", lhcurve);
+ }
+ if (!pedited || pedited->labCurve.hhcurve) {
+ Glib::ArrayHandle hhcurve = labCurve.hhcurve;
+ keyFile.set_double_list("Luminance Curve", "hhCurve", hhcurve);
+ }
if (!pedited || pedited->labCurve.lccurve) {
Glib::ArrayHandle lccurve = labCurve.lccurve;
@@ -1259,6 +1272,8 @@ if (keyFile.has_group ("Luminance Curve")) {
if (keyFile.has_key ("Luminance Curve", "bCurve")) { labCurve.bcurve = keyFile.get_double_list ("Luminance Curve", "bCurve"); if (pedited) pedited->labCurve.bcurve = true; }
if (keyFile.has_key ("Luminance Curve", "ccCurve")) { labCurve.cccurve = keyFile.get_double_list ("Luminance Curve", "ccCurve"); if (pedited) pedited->labCurve.cccurve = true; }
if (keyFile.has_key ("Luminance Curve", "chCurve")) { labCurve.chcurve = keyFile.get_double_list ("Luminance Curve", "chCurve"); if (pedited) pedited->labCurve.chcurve = true; }
+ if (keyFile.has_key ("Luminance Curve", "lhCurve")) { labCurve.lhcurve = keyFile.get_double_list ("Luminance Curve", "lhCurve"); if (pedited) pedited->labCurve.lhcurve = true; }
+ if (keyFile.has_key ("Luminance Curve", "hhCurve")) { labCurve.hhcurve = keyFile.get_double_list ("Luminance Curve", "hhCurve"); if (pedited) pedited->labCurve.hhcurve = true; }
if (keyFile.has_key ("Luminance Curve", "LcCurve")) { labCurve.lccurve = keyFile.get_double_list ("Luminance Curve", "LcCurve"); if (pedited) pedited->labCurve.lccurve = true; }
if (keyFile.has_key ("Luminance Curve", "ClCurve")) { labCurve.clcurve = keyFile.get_double_list ("Luminance Curve", "ClCurve"); if (pedited) pedited->labCurve.clcurve = true; }
@@ -1763,6 +1778,8 @@ bool ProcParams::operator== (const ProcParams& other) {
&& labCurve.bcurve == other.labCurve.bcurve
&& labCurve.cccurve == other.labCurve.cccurve
&& labCurve.chcurve == other.labCurve.chcurve
+ && labCurve.lhcurve == other.labCurve.lhcurve
+ && labCurve.hhcurve == other.labCurve.hhcurve
&& labCurve.lccurve == other.labCurve.lccurve
&& labCurve.clcurve == other.labCurve.clcurve
&& labCurve.brightness == other.labCurve.brightness
diff --git a/rtengine/procparams.h b/rtengine/procparams.h
index 48dbac3b9..bb87a6d7e 100644
--- a/rtengine/procparams.h
+++ b/rtengine/procparams.h
@@ -215,6 +215,8 @@ class LCurveParams {
std::vector bcurve;
std::vector cccurve;
std::vector chcurve;
+ std::vector lhcurve;
+ std::vector hhcurve;
std::vector lccurve;
std::vector clcurve;
int brightness;
diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc
index 0ed352176..c7f1fd4e5 100644
--- a/rtengine/refreshmap.cc
+++ b/rtengine/refreshmap.cc
@@ -265,7 +265,9 @@ TRANSFORM, // EvPCVignetteRoundness
TRANSFORM, // EvVignettingRadius,
TRANSFORM, // EvVignettingStrength
TRANSFORM, // EvVignettingCenter
-LUMINANCECURVE // EvLCLCurve
+LUMINANCECURVE, // EvLCLCurve
+LUMINANCECURVE, // EvLLHCurve
+LUMINANCECURVE // EvLHHCurve
//LUMINANCECURVE // EvCATsharpcie
diff --git a/rtengine/settings.h b/rtengine/settings.h
index 532981e91..8b30fad42 100644
--- a/rtengine/settings.h
+++ b/rtengine/settings.h
@@ -50,6 +50,7 @@ namespace rtengine {
bool gamutICC;
bool gamutLch;
bool ciecamfloat;
+ int amchroma;
int protectred;
double protectredh;
bool ciebadpixgauss;
diff --git a/rtgui/labcurve.cc b/rtgui/labcurve.cc
index 6b24af21c..4d96ef310 100644
--- a/rtgui/labcurve.cc
+++ b/rtgui/labcurve.cc
@@ -108,6 +108,22 @@ LCurve::LCurve () : Gtk::VBox(), FoldableToolPanel(this) {
milestones.clear();
curveEditorG->newLine(); // ------------------------------------------------ second line
+
+ lhshape = static_cast(curveEditorG->addCurve(CT_Flat, M("TP_LABCURVE_CURVEEDITOR_LH")));
+ lhshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_LH_TOOLTIP"));
+ lhshape->setCurveColorProvider(this, 4);
+
+
+ chshape = static_cast(curveEditorG->addCurve(CT_Flat, M("TP_LABCURVE_CURVEEDITOR_CH")));
+ chshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP"));
+ chshape->setCurveColorProvider(this, 1);
+
+
+ hhshape = static_cast(curveEditorG->addCurve(CT_Flat, M("TP_LABCURVE_CURVEEDITOR_HH")));
+ hhshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_HH_TOOLTIP"));
+ hhshape->setCurveColorProvider(this, 5);
+
+ curveEditorG->newLine(); // ------------------------------------------------ 3rd line
ccshape = static_cast(curveEditorG->addCurve(CT_Diagonal, M("TP_LABCURVE_CURVEEDITOR_CC")));
ccshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_CC_TOOLTIP"));
@@ -115,15 +131,10 @@ LCurve::LCurve () : Gtk::VBox(), FoldableToolPanel(this) {
M("TP_LABCURVE_CURVEEDITOR_CC_RANGE1"), M("TP_LABCURVE_CURVEEDITOR_CC_RANGE2"),
M("TP_LABCURVE_CURVEEDITOR_CC_RANGE3"), M("TP_LABCURVE_CURVEEDITOR_CC_RANGE4")
);
+
ccshape->setBottomBarColorProvider(this, 2);
ccshape->setLeftBarColorProvider(this, 2);
ccshape->setRangeDefaultMilestones(0.05, 0.2, 0.58);
-
- chshape = static_cast(curveEditorG->addCurve(CT_Flat, M("TP_LABCURVE_CURVEEDITOR_CH")));
- chshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_CH_TOOLTIP"));
- chshape->setCurveColorProvider(this, 1);
-
- curveEditorG->newLine(); // ------------------------------------------------ 3rd line
lcshape = static_cast(curveEditorG->addCurve(CT_Diagonal, M("TP_LABCURVE_CURVEEDITOR_LC")));
lcshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_LC_TOOLTIP"));
@@ -171,6 +182,8 @@ LCurve::LCurve () : Gtk::VBox(), FoldableToolPanel(this) {
milestones.push_back( GradientMilestone(double(x), double(R), double(G), double(B)) );
}
chshape->setBottomBarBgGradient(milestones);
+ lhshape->setBottomBarBgGradient(milestones);
+ hhshape->setBottomBarBgGradient(milestones);
// This will add the reset button at the end of the curveType buttons
@@ -187,8 +200,6 @@ LCurve::~LCurve () {
void LCurve::read (const ProcParams* pp, const ParamsEdited* pedited) {
disableListener ();
- // if(!pp->labCurve.cccurve.empty()) printf("plein"); else printf("vide");
- // if(pp->labCurve.cccurve[0] !=0) printf(" pp %i\n,pp->labCurve.cccurve[0] ");
if (pedited) {
brightness->setEditedState (pedited->labCurve.brightness ? Edited : UnEdited);
@@ -207,6 +218,8 @@ void LCurve::read (const ProcParams* pp, const ParamsEdited* pedited) {
bshape->setUnChanged (!pedited->labCurve.bcurve);
ccshape->setUnChanged (!pedited->labCurve.cccurve);
chshape->setUnChanged (!pedited->labCurve.chcurve);
+ lhshape->setUnChanged (!pedited->labCurve.lhcurve);
+ hhshape->setUnChanged (!pedited->labCurve.hhcurve);
lcshape->setUnChanged (!pedited->labCurve.lccurve);
clshape->setUnChanged (!pedited->labCurve.clcurve);
}
@@ -238,6 +251,8 @@ void LCurve::read (const ProcParams* pp, const ParamsEdited* pedited) {
bshape->setCurve (pp->labCurve.bcurve);
ccshape->setCurve (pp->labCurve.cccurve);
chshape->setCurve (pp->labCurve.chcurve);
+ lhshape->setCurve (pp->labCurve.lhcurve);
+ hhshape->setCurve (pp->labCurve.hhcurve);
lcshape->setCurve (pp->labCurve.lccurve);
clshape->setCurve (pp->labCurve.clcurve);
@@ -253,6 +268,8 @@ void LCurve::autoOpenCurve () {
if (!active) bshape->openIfNonlinear();
if (!active) ccshape->openIfNonlinear();
if (!active) chshape->openIfNonlinear();
+ if (!active) lhshape->openIfNonlinear();
+ if (!active) hhshape->openIfNonlinear();
if (!active) lcshape->openIfNonlinear();
if (!active) clshape->openIfNonlinear();
}
@@ -275,6 +292,8 @@ void LCurve::write (ProcParams* pp, ParamsEdited* pedited) {
pp->labCurve.bcurve = bshape->getCurve ();
pp->labCurve.cccurve = ccshape->getCurve ();
pp->labCurve.chcurve = chshape->getCurve ();
+ pp->labCurve.lhcurve = lhshape->getCurve ();
+ pp->labCurve.hhcurve = hhshape->getCurve ();
pp->labCurve.lccurve = lcshape->getCurve ();
pp->labCurve.clcurve = clshape->getCurve ();
@@ -295,6 +314,8 @@ void LCurve::write (ProcParams* pp, ParamsEdited* pedited) {
pedited->labCurve.bcurve = !bshape->isUnChanged ();
pedited->labCurve.cccurve = !ccshape->isUnChanged ();
pedited->labCurve.chcurve = !chshape->isUnChanged ();
+ pedited->labCurve.lhcurve = !lhshape->isUnChanged ();
+ pedited->labCurve.hhcurve = !hhshape->isUnChanged ();
pedited->labCurve.lccurve = !lcshape->isUnChanged ();
pedited->labCurve.clcurve = !clshape->isUnChanged ();
}
@@ -394,6 +415,10 @@ void LCurve::curveChanged (CurveEditor* ce) {
listener->panelChanged (EvLCCCurve, M("HISTORY_CUSTOMCURVE"));
if (ce == chshape)
listener->panelChanged (EvLCHCurve, M("HISTORY_CUSTOMCURVE"));
+ if (ce == lhshape)
+ listener->panelChanged (EvLLHCurve, M("HISTORY_CUSTOMCURVE"));
+ if (ce == hhshape)
+ listener->panelChanged (EvLHHCurve, M("HISTORY_CUSTOMCURVE"));
if (ce == lcshape)
listener->panelChanged (EvLLCCurve, M("HISTORY_CUSTOMCURVE"));
if (ce == clshape)
@@ -426,20 +451,12 @@ void LCurve::adjusterChanged (Adjuster* a, double newval) {
rstprotection->set_sensitive( true );
avoidcolorshift->set_sensitive( true );
lcredsk->set_sensitive( true );
-
- //std::vector milestones;
- //lcshape->setBottomBarBgGradient(milestones);
- //lcshape->refresh();
}
else {
//if chromaticity==-100 (lowest value), we enter the B&W mode and avoid color shift and rstprotection has no effect
rstprotection->set_sensitive( int(newval)> -100 );//no reason for grey rstprotection
avoidcolorshift->set_sensitive( int(newval)> -100 );
lcredsk->set_sensitive( int(newval)> -100 );
-
- //std::vector milestones;
- //lcshape->setBottomBarBgGradient(milestones);
- //lcshape->refresh();
}
if (listener) listener->panelChanged (EvLSaturation, costr);
}
@@ -477,6 +494,17 @@ void LCurve::colorForValue (double valX, double valY, int callerId, ColorCaller
Color::hsv2rgb01(float(valY), float(valX), value, R, G, B);
}
}
+ else if (callerId == 4) { // LH - bottom bar
+ Color::hsv2rgb01(float(valX), 0.5f, float(valY), R, G, B);
+ }
+ else if (callerId == 5) { // HH - bottom bar
+ float h = float((valY - 0.5) * 0.3 + valX);
+ if (h > 1.0f)
+ h -= 1.0f;
+ else if (h < 0.0f)
+ h += 1.0f;
+ Color::hsv2rgb01(h, 0.5f, 0.5f, R, G, B);
+ }
caller->ccRed = double(R);
caller->ccGreen = double(G);
caller->ccBlue = double(B);
diff --git a/rtgui/labcurve.h b/rtgui/labcurve.h
index 7506ca9ce..fa24f4eec 100644
--- a/rtgui/labcurve.h
+++ b/rtgui/labcurve.h
@@ -39,6 +39,9 @@ class LCurve : public Gtk::VBox, public AdjusterListener, public FoldableToolPan
DiagonalCurveEditor* ccshape;
DiagonalCurveEditor* lcshape;
FlatCurveEditor* chshape;
+ FlatCurveEditor* lhshape;
+ FlatCurveEditor* hhshape;
+
DiagonalCurveEditor* clshape;
//%%%%%%%%%%%%%%%%
diff --git a/rtgui/options.cc b/rtgui/options.cc
index a06d8696d..e62b308e5 100644
--- a/rtgui/options.cc
+++ b/rtgui/options.cc
@@ -499,6 +499,8 @@ void Options::setDefaults () {
rtSettings.verbose = false;
rtSettings.gamutICC = true;
rtSettings.gamutLch = true;
+ rtSettings.amchroma = 40;//between 20 and 140 low values increase effect..and also artefacts, high values reduces
+
rtSettings.ciecamfloat = true;
rtSettings.protectred = 60;
rtSettings.protectredh = 0.3;
@@ -743,6 +745,7 @@ if (keyFile.has_group ("Color Management")) {
if( keyFile.has_key ("Color Management", "GamutLch")) rtSettings.gamutLch = keyFile.get_boolean("Color Management", "GamutLch");
if( keyFile.has_key ("Color Management", "ProtectRed")) rtSettings.protectred = keyFile.get_integer("Color Management", "ProtectRed");
if( keyFile.has_key ("Color Management", "ProtectRedH")) rtSettings.protectredh = keyFile.get_double("Color Management", "ProtectRedH");
+ if( keyFile.has_key ("Color Management", "Amountchroma")) rtSettings.amchroma = keyFile.get_integer("Color Management", "Amountchroma");
// if( keyFile.has_key ("Color Management", "Ciebadpixgauss")) rtSettings.ciebadpixgauss = keyFile.get_boolean("Color Management", "Ciebadpixgauss");
}
@@ -1019,6 +1022,7 @@ int Options::saveToFile (Glib::ustring fname) {
keyFile.set_boolean ("Color Management", "Ciecamfloat", rtSettings.ciecamfloat);
keyFile.set_boolean ("Color Management", "GamutLch", rtSettings.gamutLch);
keyFile.set_integer ("Color Management", "ProtectRed", rtSettings.protectred);
+ keyFile.set_integer ("Color Management", "Amountchroma", rtSettings.amchroma);
keyFile.set_double ("Color Management", "ProtectRedH", rtSettings.protectredh);
keyFile.set_integer ("Color Management", "CRI", rtSettings.CRI_color);
// keyFile.set_boolean ("Color Management", "Ciebadpixgauss", rtSettings.ciebadpixgauss);
diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc
index 6e76cff63..e47132da2 100644
--- a/rtgui/paramsedited.cc
+++ b/rtgui/paramsedited.cc
@@ -51,6 +51,8 @@ void ParamsEdited::set (bool v) {
labCurve.bcurve = v;
labCurve.cccurve = v;
labCurve.chcurve = v;
+ labCurve.lhcurve = v;
+ labCurve.hhcurve = v;
labCurve.lccurve = v;
labCurve.clcurve = v;
labCurve.brightness = v;
@@ -328,6 +330,8 @@ void ParamsEdited::initFrom (const std::vector
labCurve.bcurve = labCurve.bcurve && p.labCurve.bcurve == other.labCurve.bcurve;
labCurve.cccurve = labCurve.cccurve && p.labCurve.cccurve == other.labCurve.cccurve;
labCurve.chcurve = labCurve.chcurve && p.labCurve.chcurve == other.labCurve.chcurve;
+ labCurve.lhcurve = labCurve.lhcurve && p.labCurve.lhcurve == other.labCurve.lhcurve;
+ labCurve.hhcurve = labCurve.hhcurve && p.labCurve.hhcurve == other.labCurve.hhcurve;
labCurve.lccurve = labCurve.lccurve && p.labCurve.lccurve == other.labCurve.lccurve;
labCurve.clcurve = labCurve.clcurve && p.labCurve.clcurve == other.labCurve.clcurve;
labCurve.brightness = labCurve.brightness && p.labCurve.brightness == other.labCurve.brightness;
@@ -602,6 +606,8 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
if (labCurve.bcurve) toEdit.labCurve.bcurve = mods.labCurve.bcurve;
if (labCurve.cccurve) toEdit.labCurve.cccurve = mods.labCurve.cccurve;
if (labCurve.chcurve) toEdit.labCurve.chcurve = mods.labCurve.chcurve;
+ if (labCurve.lhcurve) toEdit.labCurve.lhcurve = mods.labCurve.lhcurve;
+ if (labCurve.hhcurve) toEdit.labCurve.hhcurve = mods.labCurve.hhcurve;
if (labCurve.lccurve) toEdit.labCurve.lccurve = mods.labCurve.lccurve;
if (labCurve.clcurve) toEdit.labCurve.clcurve = mods.labCurve.clcurve;
if (labCurve.brightness) toEdit.labCurve.brightness = dontforceSet && options.baBehav[ADDSET_LC_BRIGHTNESS] ? toEdit.labCurve.brightness + mods.labCurve.brightness : mods.labCurve.brightness;
diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h
index 1c422acee..6dd02af9e 100644
--- a/rtgui/paramsedited.h
+++ b/rtgui/paramsedited.h
@@ -65,6 +65,8 @@ class LCurveParamsEdited {
bool lcredsk;
bool cccurve;
bool chcurve;
+ bool lhcurve;
+ bool hhcurve;
bool lccurve;
bool clcurve;
};
diff --git a/rtgui/ppversion.h b/rtgui/ppversion.h
index 3bb4a79d9..486138555 100644
--- a/rtgui/ppversion.h
+++ b/rtgui/ppversion.h
@@ -2,11 +2,13 @@
#define _PPVERSION_
// This number have to be incremented whenever the PP3 file format is modified
-#define PPVERSION 314
+#define PPVERSION 315
#define PPVERSION_AEXP 301 //value of PPVERSION when auto exposure algorithm was modified
/*
Log of version changes
+ 315 2013-12-12
+ add LH et HH curve to lab mode
313 2013-11-19
addd CL curve to lab mode
312 2013-11-08