B&W + channel mixer + color filter = maximum brightness too low, whites turn gray issue2583
This commit is contained in:
parent
77177deb61
commit
c381db2f1f
@ -479,14 +479,13 @@ namespace rtengine {
|
|||||||
* @param setting BlackWhite::setting
|
* @param setting BlackWhite::setting
|
||||||
* @param setting BlackWhite::filter
|
* @param setting BlackWhite::filter
|
||||||
*/
|
*/
|
||||||
void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::ustring &filter, const Glib::ustring &algo, float &mixerRed, float &mixerGreen,
|
void Color::computeBWMixerConstants (const Glib::ustring &setting, const Glib::ustring &filter, const Glib::ustring &algo, float &filcor, float &mixerRed, float &mixerGreen,
|
||||||
float &mixerBlue, float mixerOrange, float mixerYellow, float mixerCyan, float mixerPurple, float mixerMagenta,
|
float &mixerBlue, float mixerOrange, float mixerYellow, float mixerCyan, float mixerPurple, float mixerMagenta,
|
||||||
bool autoc, bool complement, float &kcorec, double &rrm, double &ggm, double &bbm)
|
bool autoc, bool complement, float &kcorec, double &rrm, double &ggm, double &bbm)
|
||||||
{
|
{
|
||||||
float somm;
|
float somm;
|
||||||
float som = mixerRed+mixerGreen+mixerBlue;
|
float som = mixerRed+mixerGreen+mixerBlue;
|
||||||
// rM = mixerRed, gM = mixerGreen, bM = mixerBlue !
|
// rM = mixerRed, gM = mixerGreen, bM = mixerBlue !
|
||||||
|
|
||||||
//presets
|
//presets
|
||||||
if (setting=="RGB-Abs" || setting=="ROYGCBPM-Abs")
|
if (setting=="RGB-Abs" || setting=="ROYGCBPM-Abs")
|
||||||
kcorec=som/100.f;
|
kcorec=som/100.f;
|
||||||
@ -609,25 +608,24 @@ namespace rtengine {
|
|||||||
kcorec = koymcp+som/100.f;
|
kcorec = koymcp+som/100.f;
|
||||||
//Color filters
|
//Color filters
|
||||||
float filred,filgreen,filblue;
|
float filred,filgreen,filblue;
|
||||||
filred=1.f;filgreen=1.f;filblue=1.f;
|
filred=1.f;filgreen=1.f;filblue=1.f;filcor=1.f;
|
||||||
if (filter=="None") {filred=1.f; filgreen=1.f; filblue=1.f;}
|
if (filter=="None") {filred=1.f; filgreen=1.f; filblue=1.f; filcor=1.f;}
|
||||||
else if (filter=="Red") {filred=1.f; filgreen=0.05f;filblue=0.f;}
|
else if (filter=="Red") {filred=1.f; filgreen=0.05f;filblue=0.f; filcor=1.08f;}
|
||||||
else if (filter=="Orange") {filred=1.f; filgreen=0.6f; filblue=0.f;}
|
else if (filter=="Orange") {filred=1.f; filgreen=0.6f; filblue=0.f; filcor=1.35f;}
|
||||||
else if (filter=="Yellow") {filred=1.f; filgreen=1.f; filblue=0.05f;}
|
else if (filter=="Yellow") {filred=1.f; filgreen=1.f; filblue=0.05f;filcor=1.23f;}
|
||||||
else if (filter=="YellowGreen") {filred=0.6f; filgreen=1.f; filblue=0.3f;}
|
else if (filter=="YellowGreen") {filred=0.6f; filgreen=1.f; filblue=0.3f;filcor=1.32f;}
|
||||||
else if (filter=="Green") {filred=0.2f; filgreen=1.f; filblue=0.3f;}
|
else if (filter=="Green") {filred=0.2f; filgreen=1.f; filblue=0.3f;filcor=1.41f;}
|
||||||
else if (filter=="Cyan") {filred=0.05f;filgreen=1.f; filblue=1.f;}
|
else if (filter=="Cyan") {filred=0.05f;filgreen=1.f; filblue=1.f; filcor=1.23f;}
|
||||||
else if (filter=="Blue") {filred=0.f; filgreen=0.05f;filblue=1.f;}
|
else if (filter=="Blue") {filred=0.f; filgreen=0.05f;filblue=1.f; filcor=1.20f;}
|
||||||
else if (filter=="Purple") {filred=1.f; filgreen=0.05f;filblue=1.f;}
|
else if (filter=="Purple") {filred=1.f; filgreen=0.05f;filblue=1.f; filcor=1.23f;}
|
||||||
|
mixerRed = mixerRed * filred;
|
||||||
|
|
||||||
mixerRed = mixerRed * filred;
|
|
||||||
mixerGreen = mixerGreen * filgreen;
|
mixerGreen = mixerGreen * filgreen;
|
||||||
mixerBlue = mixerBlue * filblue;
|
mixerBlue = mixerBlue * filblue;
|
||||||
|
|
||||||
mixerRed = mixerRed / (mixerRed + mixerGreen + mixerBlue);
|
mixerRed = filcor*mixerRed / (mixerRed + mixerGreen + mixerBlue);
|
||||||
mixerGreen = mixerGreen / (mixerRed + mixerGreen + mixerBlue);
|
mixerGreen = filcor*mixerGreen / (mixerRed + mixerGreen + mixerBlue);
|
||||||
mixerBlue = mixerBlue / (mixerRed + mixerGreen + mixerBlue);
|
mixerBlue = filcor*mixerBlue / (mixerRed + mixerGreen + mixerBlue);
|
||||||
|
|
||||||
if(filter!="None") {
|
if(filter!="None") {
|
||||||
som = mixerRed+mixerGreen+mixerBlue;
|
som = mixerRed+mixerGreen+mixerBlue;
|
||||||
if(setting=="RGB-Abs" || setting=="ROYGCBPM-Abs") kcorec = kcorec*som;
|
if(setting=="RGB-Abs" || setting=="ROYGCBPM-Abs") kcorec = kcorec*som;
|
||||||
@ -1174,9 +1172,9 @@ namespace rtengine {
|
|||||||
bool correctL;
|
bool correctL;
|
||||||
if(CC >= 6.0 && CC < 140) { //if C > 140 we say C=140 (only in Prophoto ...with very large saturation)
|
if(CC >= 6.0 && CC < 140) { //if C > 140 we say C=140 (only in Prophoto ...with very large saturation)
|
||||||
static const float huelimit[8]={-2.48,-0.55,0.44,1.52,1.87,3.09,-0.27,0.44};//limits hue of blue-purple, red-yellow, green-yellow, red-purple
|
static const float huelimit[8]={-2.48,-0.55,0.44,1.52,1.87,3.09,-0.27,0.44};//limits hue of blue-purple, red-yellow, green-yellow, red-purple
|
||||||
if (Chprov1 > 140.f)
|
if (Chprov1 > 140.f)
|
||||||
Chprov1=139.f; //limits of LUTf
|
Chprov1=139.f; //limits of LUTf
|
||||||
if (Chprov1 < 6.f)
|
if (Chprov1 < 6.f)
|
||||||
Chprov1=6.f;
|
Chprov1=6.f;
|
||||||
for(int zo=1;zo<=4;zo++) {
|
for(int zo=1;zo<=4;zo++) {
|
||||||
if(HH>huelimit[2*zo-2] && HH<huelimit[2*zo-1]) {
|
if(HH>huelimit[2*zo-2] && HH<huelimit[2*zo-1]) {
|
||||||
@ -1198,7 +1196,7 @@ munsDbgInfo->maxdhue[idx] = MAX(munsDbgInfo->maxdhue[idx], absCorrectionHue);
|
|||||||
munsDbgInfo->depass++; //verify if no bug in calculation
|
munsDbgInfo->depass++; //verify if no bug in calculation
|
||||||
#endif
|
#endif
|
||||||
correctionHuechroma=correctionHue; //preserve
|
correctionHuechroma=correctionHue; //preserve
|
||||||
if(lumaMuns) {
|
if(lumaMuns) {
|
||||||
float correctlumprov=0.f;
|
float correctlumprov=0.f;
|
||||||
float correctlumprov2=0.f;
|
float correctlumprov2=0.f;
|
||||||
if(correctL) {
|
if(correctL) {
|
||||||
@ -1335,7 +1333,7 @@ munsDbgInfo->maxdhue[idx] = MAX(munsDbgInfo->maxdhue[idx], absCorrectionHue);
|
|||||||
while (!inGamut);
|
while (!inGamut);
|
||||||
//end first gamut control
|
//end first gamut control
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GamutLchonly correction
|
* GamutLchonly correction
|
||||||
* Copyright (c)2012 Jacques Desmis <jdesmis@gmail.com> and Jean-Christophe Frisch <natureh@free.fr>
|
* Copyright (c)2012 Jacques Desmis <jdesmis@gmail.com> and Jean-Christophe Frisch <natureh@free.fr>
|
||||||
@ -1343,7 +1341,7 @@ munsDbgInfo->maxdhue[idx] = MAX(munsDbgInfo->maxdhue[idx], absCorrectionHue);
|
|||||||
* This function puts the data (Lab) in the gamut of "working profile":
|
* This function puts the data (Lab) in the gamut of "working profile":
|
||||||
* it returns the corrected values of the chromaticity and luminance
|
* it returns the corrected values of the chromaticity and luminance
|
||||||
*
|
*
|
||||||
* float HH : hue
|
* float HH : hue
|
||||||
* float2 sincosval : sin and cos of HH
|
* float2 sincosval : sin and cos of HH
|
||||||
* float Lprov1 : input luminance value, sent back corrected
|
* float Lprov1 : input luminance value, sent back corrected
|
||||||
* float Chprov1: input chroma value, sent back corrected
|
* float Chprov1: input chroma value, sent back corrected
|
||||||
@ -1420,7 +1418,7 @@ munsDbgInfo->maxdhue[idx] = MAX(munsDbgInfo->maxdhue[idx], absCorrectionHue);
|
|||||||
while (!inGamut);
|
while (!inGamut);
|
||||||
//end first gamut control
|
//end first gamut control
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const float wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef, bool &neg, bool &more_rgb)
|
void Color::gamutLchonly (float2 sincosval, float &Lprov1, float &Chprov1, const float wip[3][3], const bool isHLEnabled, const float lowerCoef, const float higherCoef, bool &neg, bool &more_rgb)
|
||||||
@ -1897,55 +1895,55 @@ munsDbgInfo->maxdhue[idx] = MAX(munsDbgInfo->maxdhue[idx], absCorrectionHue);
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void Color::SkinSat (float lum, float hue, float chrom, float &satreduc) {
|
void Color::SkinSat (float lum, float hue, float chrom, float &satreduc) {
|
||||||
|
|
||||||
// to be adapted...by tests
|
// to be adapted...by tests
|
||||||
float reduction=0.3f; // use "reduction" for "real" skin color : take into account a slightly usage of contrast and saturation in RT if option "skin" = 1
|
float reduction=0.3f; // use "reduction" for "real" skin color : take into account a slightly usage of contrast and saturation in RT if option "skin" = 1
|
||||||
float extendedreduction=0.4f; // use "extendedreduction" for wide area skin color, useful if not accurate colorimetry or if the user has changed hue and saturation
|
float extendedreduction=0.4f; // use "extendedreduction" for wide area skin color, useful if not accurate colorimetry or if the user has changed hue and saturation
|
||||||
float extendedreduction2=0.6f; // use "extendedreduction2" for wide area for transition
|
float extendedreduction2=0.6f; // use "extendedreduction2" for wide area for transition
|
||||||
|
|
||||||
float C9=8.0, C8=15.0, C7=12.0, C4=7.0, C3=5.0, C2=5.0, C1=5.0;
|
float C9=8.0, C8=15.0, C7=12.0, C4=7.0, C3=5.0, C2=5.0, C1=5.0;
|
||||||
float H9=0.05, H8=0.25, H7=0.1, H4=0.02, H3=0.02, H2=0.1, H1=0.1, H10=-0.2,H11=-0.2; //H10 and H11 are curious...H11=-0.8 ??
|
float H9=0.05, H8=0.25, H7=0.1, H4=0.02, H3=0.02, H2=0.1, H1=0.1, H10=-0.2,H11=-0.2; //H10 and H11 are curious...H11=-0.8 ??
|
||||||
|
|
||||||
if (lum >= 85.f) {
|
if (lum >= 85.f) {
|
||||||
if((hue > (0.78f-H9) && hue < (1.18f+H9)) && (chrom > 8.f && chrom < (14.f+C9))) satreduc=reduction;
|
if((hue > (0.78f-H9) && hue < (1.18f+H9)) && (chrom > 8.f && chrom < (14.f+C9))) satreduc=reduction;
|
||||||
else if (lum >= 92.f) {
|
else if (lum >= 92.f) {
|
||||||
if((hue > 0.8f && hue < 1.65f) && (chrom > 7.f && chrom < (15.f))) satreduc=extendedreduction;
|
if((hue > 0.8f && hue < 1.65f) && (chrom > 7.f && chrom < (15.f))) satreduc=extendedreduction;
|
||||||
else if ((hue > -0.1f && hue < 1.65f) && (chrom > 7.f && chrom < (18.f))) satreduc=extendedreduction2;
|
else if ((hue > -0.1f && hue < 1.65f) && (chrom > 7.f && chrom < (18.f))) satreduc=extendedreduction2;
|
||||||
}
|
}
|
||||||
else if ((hue > 0.7f && hue < 1.4f) && (chrom > 7.f && chrom < (26.f+C9))) satreduc=extendedreduction;
|
else if ((hue > 0.7f && hue < 1.4f) && (chrom > 7.f && chrom < (26.f+C9))) satreduc=extendedreduction;
|
||||||
else if (lum < 92.f && (hue > 0.f && hue < 1.65f) && (chrom > 7.f && chrom < (35.f+C9))) satreduc=extendedreduction2;
|
else if (lum < 92.f && (hue > 0.f && hue < 1.65f) && (chrom > 7.f && chrom < (35.f+C9))) satreduc=extendedreduction2;
|
||||||
}
|
}
|
||||||
else if (lum >= 70.f) {
|
else if (lum >= 70.f) {
|
||||||
if((hue > 0.4f && hue < (1.04f+H8)) && (chrom > 8.f && chrom < (35.f+C8))) satreduc=reduction;
|
if((hue > 0.4f && hue < (1.04f+H8)) && (chrom > 8.f && chrom < (35.f+C8))) satreduc=reduction;
|
||||||
else if ((hue > (0.02f + H11) && hue < 1.5f) && (chrom > 7.0f && chrom < (48.f+C9) )) satreduc=extendedreduction;
|
else if ((hue > (0.02f + H11) && hue < 1.5f) && (chrom > 7.0f && chrom < (48.f+C9) )) satreduc=extendedreduction;
|
||||||
else if ((hue > (0.02f + H11) && hue < 1.65f) && (chrom > 7.f && chrom < (55.f+C9) )) satreduc=extendedreduction2;
|
else if ((hue > (0.02f + H11) && hue < 1.65f) && (chrom > 7.f && chrom < (55.f+C9) )) satreduc=extendedreduction2;
|
||||||
}
|
}
|
||||||
else if (lum >= 52.f) {
|
else if (lum >= 52.f) {
|
||||||
if((hue > 0.3f && hue < (1.27f+H7)) && (chrom > 11.f && chrom < (35.f+C7))) satreduc=reduction;
|
if((hue > 0.3f && hue < (1.27f+H7)) && (chrom > 11.f && chrom < (35.f+C7))) satreduc=reduction;
|
||||||
else if ((hue > (0.02f + H11) && hue < 1.5f) && (chrom > 7.0f && chrom < (48.f+C9) )) satreduc=extendedreduction;
|
else if ((hue > (0.02f + H11) && hue < 1.5f) && (chrom > 7.0f && chrom < (48.f+C9) )) satreduc=extendedreduction;
|
||||||
else if ((hue > (0.02f + H11) && hue < 1.65f) && (chrom > 7.f && chrom < (55.f+C9) )) satreduc=extendedreduction2;
|
else if ((hue > (0.02f + H11) && hue < 1.65f) && (chrom > 7.f && chrom < (55.f+C9) )) satreduc=extendedreduction2;
|
||||||
}
|
}
|
||||||
else if (lum >= 35.f) {
|
else if (lum >= 35.f) {
|
||||||
if((hue > 0.3f && hue < (1.25f+H4)) && (chrom > 13.f && chrom < (37.f+C4))) satreduc=reduction;
|
if((hue > 0.3f && hue < (1.25f+H4)) && (chrom > 13.f && chrom < (37.f+C4))) satreduc=reduction;
|
||||||
else if ((hue > (0.02f + H11) && hue < 1.5f) && (chrom > 7.0f && chrom < (48.f+C9) )) satreduc=extendedreduction;
|
else if ((hue > (0.02f + H11) && hue < 1.5f) && (chrom > 7.0f && chrom < (48.f+C9) )) satreduc=extendedreduction;
|
||||||
else if ((hue > (0.02f + H11) && hue < 1.65f) && (chrom > 7.f && chrom < (55.f+C9) )) satreduc=extendedreduction2;
|
else if ((hue > (0.02f + H11) && hue < 1.65f) && (chrom > 7.f && chrom < (55.f+C9) )) satreduc=extendedreduction2;
|
||||||
}
|
}
|
||||||
else if (lum >= 20.f) {
|
else if (lum >= 20.f) {
|
||||||
if((hue > 0.3f && hue < (1.2f+H3)) && (chrom > 7.f && chrom <(35.f+C3) )) satreduc=reduction;
|
if((hue > 0.3f && hue < (1.2f+H3)) && (chrom > 7.f && chrom <(35.f+C3) )) satreduc=reduction;
|
||||||
else if ((hue > (0.02f + H11) && hue < 1.5f) && (chrom > 7.0f && chrom < (48.f+C9) )) satreduc=extendedreduction;
|
else if ((hue > (0.02f + H11) && hue < 1.5f) && (chrom > 7.0f && chrom < (48.f+C9) )) satreduc=extendedreduction;
|
||||||
else if ((hue > (0.02f + H11) && hue < 1.65f) && (chrom > 7.f && chrom < (55.f+C9) )) satreduc=extendedreduction2;
|
else if ((hue > (0.02f + H11) && hue < 1.65f) && (chrom > 7.f && chrom < (55.f+C9) )) satreduc=extendedreduction2;
|
||||||
}
|
}
|
||||||
else if (lum > 10.f) {
|
else if (lum > 10.f) {
|
||||||
if((hue > (0.f + H10) && hue < (0.95f +H2)) && (chrom > 8.f && chrom < (23.f+C2))) satreduc=reduction;
|
if((hue > (0.f + H10) && hue < (0.95f +H2)) && (chrom > 8.f && chrom < (23.f+C2))) satreduc=reduction;
|
||||||
else if ((hue > (0.02f+H11) && hue < 1.f) && (chrom > 7.f && chrom < (35.f+C1) )) satreduc=extendedreduction;
|
else if ((hue > (0.02f+H11) && hue < 1.f) && (chrom > 7.f && chrom < (35.f+C1) )) satreduc=extendedreduction;
|
||||||
else if ((hue > (0.02f+H11) && hue < 1.6f) && (chrom > 7.f && chrom < (45.f+C1) )) satreduc=extendedreduction2;
|
else if ((hue > (0.02f+H11) && hue < 1.6f) && (chrom > 7.f && chrom < (45.f+C1) )) satreduc=extendedreduction2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if((hue > (0.02f + H10) && hue < (0.9f+H1)) && (chrom > 8.f && chrom < (23.f+C1))) satreduc=reduction; // no data : extrapolate
|
if((hue > (0.02f + H10) && hue < (0.9f+H1)) && (chrom > 8.f && chrom < (23.f+C1))) satreduc=reduction; // no data : extrapolate
|
||||||
else if ((hue > (0.02f+H11) && hue < 1.f) && (chrom > 7.f && chrom < (35.f+C1) )) satreduc=extendedreduction;
|
else if ((hue > (0.02f+H11) && hue < 1.f) && (chrom > 7.f && chrom < (35.f+C1) )) satreduc=extendedreduction;
|
||||||
else if ((hue > (0.02f+H11) && hue < 1.6f) && (chrom > 7.f && chrom < (45.f+C1) )) satreduc=extendedreduction2;
|
else if ((hue > (0.02f+H11) && hue < 1.6f) && (chrom > 7.f && chrom < (45.f+C1) )) satreduc=extendedreduction2;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
112
rtengine/color.h
112
rtengine/color.h
@ -734,7 +734,7 @@ public:
|
|||||||
* @param ggm green channel of the mixer (return value)
|
* @param ggm green channel of the mixer (return value)
|
||||||
* @param bbm blue channel of the mixer (return value)
|
* @param bbm blue channel of the mixer (return value)
|
||||||
*/
|
*/
|
||||||
static void computeBWMixerConstants (const Glib::ustring &setting, const Glib::ustring &filter, const Glib::ustring &algo, float &mixerRed, float &mixerGreen,
|
static void computeBWMixerConstants (const Glib::ustring &setting, const Glib::ustring &filter, const Glib::ustring &algo, float &filcor, float &mixerRed, float &mixerGreen,
|
||||||
float &mixerBlue, float mixerOrange, float mixerYellow, float mixerCyan, float mixerPurple, float mixerMagenta,
|
float &mixerBlue, float mixerOrange, float mixerYellow, float mixerCyan, float mixerPurple, float mixerMagenta,
|
||||||
bool autoc, bool complement, float &kcorec, double &rrm, double &ggm, double &bbm);
|
bool autoc, bool complement, float &kcorec, double &rrm, double &ggm, double &bbm);
|
||||||
|
|
||||||
@ -1047,47 +1047,47 @@ public:
|
|||||||
static void skinred ( double J, double h, double sres, double Sp, float dred, float protect_red, int sk, float rstprotection, float ko, double &s);
|
static void skinred ( double J, double h, double sres, double Sp, float dred, float protect_red, int sk, float rstprotection, float ko, double &s);
|
||||||
static void skinredfloat ( float J, float h, float sres, float Sp, float dred, float protect_red, int sk, float rstprotection, float ko, float &s);
|
static void skinredfloat ( float J, float h, float sres, float Sp, float dred, float protect_red, int sk, float rstprotection, float ko, float &s);
|
||||||
// static void scaleredcdbl ( float skinprot, float param, float limit, float HH, float deltaHH, float &scale,float &scaleext);
|
// static void scaleredcdbl ( float skinprot, float param, float limit, float HH, float deltaHH, float &scale,float &scaleext);
|
||||||
|
|
||||||
static inline void SkinSatCbdl (float lum, float hue, float chrom, float skinprot, float &scale, bool neg, float b_l, float t_l, float t_r) {
|
static inline void SkinSatCbdl (float lum, float hue, float chrom, float skinprot, float &scale, bool neg, float b_l, float t_l, float t_r) {
|
||||||
|
|
||||||
static const float C9=8.f, C8=15.f, C7=12.f, C4=7.f, C3=5.f, C2=5.f, C1=5.f;
|
static const float C9=8.f, C8=15.f, C7=12.f, C4=7.f, C3=5.f, C2=5.f, C1=5.f;
|
||||||
static const float H9=0.05f, H8=0.25f, H7=0.1f, H4=0.02f, H3=0.02f, H2=0.1f, H1=0.1f, H10=-0.2f,H11=-0.2f;
|
static const float H9=0.05f, H8=0.25f, H7=0.1f, H4=0.02f, H3=0.02f, H2=0.1f, H1=0.1f, H10=-0.2f,H11=-0.2f;
|
||||||
|
|
||||||
// "real" skin color : take into account a slightly usage of contrast and saturation in RT if option "skin" = 1, uses imolicit factor 1.0
|
// "real" skin color : take into account a slightly usage of contrast and saturation in RT if option "skin" = 1, uses imolicit factor 1.0
|
||||||
// wide area skin color, useful if not accurate colorimetry or if the user has changed hue and saturation, uses explicit facor 0.6
|
// wide area skin color, useful if not accurate colorimetry or if the user has changed hue and saturation, uses explicit facor 0.6
|
||||||
// wide area for transition, uses explicit factor 0.4
|
// wide area for transition, uses explicit factor 0.4
|
||||||
|
|
||||||
if (lum >= 85.0f) {
|
if (lum >= 85.0f) {
|
||||||
if((hue > (t_l+0.53f-H9) && hue < (t_r+H9)) && (chrom > 8.0f && chrom < (14.0f+C9))) scale = (100.f-skinprot)/100.1f;
|
if((hue > (t_l+0.53f-H9) && hue < (t_r+H9)) && (chrom > 8.0f && chrom < (14.0f+C9))) scale = (100.f-skinprot)/100.1f;
|
||||||
else if (lum >= 92.0f) {
|
else if (lum >= 92.0f) {
|
||||||
if((hue > t_l+0.4f && hue < t_r) && (chrom > 7.0f && chrom < (15.0f))) scale = (100.f-skinprot*0.6f)/100.1f;
|
if((hue > t_l+0.4f && hue < t_r) && (chrom > 7.0f && chrom < (15.0f))) scale = (100.f-skinprot*0.6f)/100.1f;
|
||||||
else if ((hue > b_l && hue < t_r) && (chrom > 7.0f && chrom < (18.0f))) scale = (100.f-skinprot*0.4f)/100.1f;
|
else if ((hue > b_l && hue < t_r) && (chrom > 7.0f && chrom < (18.0f))) scale = (100.f-skinprot*0.4f)/100.1f;
|
||||||
}
|
}
|
||||||
else if ((hue > t_l+0.4f && hue < t_r-0.3f) && (chrom > 7.0f && chrom < (26.0f+C9))) scale = (100.f-skinprot*0.6f)/100.1f;
|
else if ((hue > t_l+0.4f && hue < t_r-0.3f) && (chrom > 7.0f && chrom < (26.0f+C9))) scale = (100.f-skinprot*0.6f)/100.1f;
|
||||||
else if ((hue > b_l+0.05f && hue < t_r) && (chrom > 7.0f && chrom < (35.0f+C9))) scale = (100.f-skinprot*0.4f)/100.1f;
|
else if ((hue > b_l+0.05f && hue < t_r) && (chrom > 7.0f && chrom < (35.0f+C9))) scale = (100.f-skinprot*0.4f)/100.1f;
|
||||||
}
|
}
|
||||||
else if (lum >= 70.0f) {
|
else if (lum >= 70.0f) {
|
||||||
if((hue > t_l+0.15f && hue < (t_r-0.2f+H8)) && (chrom > 8.0f && chrom < (35.0f+C8))) scale = (100.f-skinprot)/100.1f;
|
if((hue > t_l+0.15f && hue < (t_r-0.2f+H8)) && (chrom > 8.0f && chrom < (35.0f+C8))) scale = (100.f-skinprot)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f + H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (48.0f+C9) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
else if ((hue > (b_l+0.07f + H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (48.0f+C9) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f + H11) && hue < t_r) && (chrom > 7.0f && chrom < (55.0f+C9) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
else if ((hue > (b_l+0.07f + H11) && hue < t_r) && (chrom > 7.0f && chrom < (55.0f+C9) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
||||||
}
|
}
|
||||||
else if (lum >= 52.0f) {
|
else if (lum >= 52.0f) {
|
||||||
if((hue > t_l && hue < (t_r+H7)) && (chrom > 11.0f && chrom < (35.0f+C7))) scale = (100.f-skinprot)/100.1f;
|
if((hue > t_l && hue < (t_r+H7)) && (chrom > 11.0f && chrom < (35.0f+C7))) scale = (100.f-skinprot)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f + H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (48.0f+C9) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
else if ((hue > (b_l+0.07f + H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (48.0f+C9) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f + H11) && hue < t_r) && (chrom > 7.0f && chrom < (55.0f+C9) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
else if ((hue > (b_l+0.07f + H11) && hue < t_r) && (chrom > 7.0f && chrom < (55.0f+C9) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
||||||
}
|
}
|
||||||
else if (lum >= 35.0f) {
|
else if (lum >= 35.0f) {
|
||||||
if((hue > t_l && hue < (t_r+H4)) && (chrom > 13.0f && chrom < (37.0f+C4))) scale = (100.f-skinprot)/100.1f;
|
if((hue > t_l && hue < (t_r+H4)) && (chrom > 13.0f && chrom < (37.0f+C4))) scale = (100.f-skinprot)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f + H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (48.0f+C9) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
else if ((hue > (b_l+0.07f + H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (48.0f+C9) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f + H11) && hue < t_r) && (chrom > 7.0f && chrom < (55.0f+C9) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
else if ((hue > (b_l+0.07f + H11) && hue < t_r) && (chrom > 7.0f && chrom < (55.0f+C9) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
||||||
}
|
}
|
||||||
else if (lum >= 20.0f) {
|
else if (lum >= 20.0f) {
|
||||||
if((hue > t_l && hue < (t_r+H3)) && (chrom > 7.0f && chrom <(35.0f+C3) )) scale = (100.f-skinprot)/100.1f;
|
if((hue > t_l && hue < (t_r+H3)) && (chrom > 7.0f && chrom <(35.0f+C3) )) scale = (100.f-skinprot)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f + H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (48.0f+C9) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
else if ((hue > (b_l+0.07f + H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (48.0f+C9) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f + H11) && hue < t_r) && (chrom > 7.0f && chrom < (55.0f+C9) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
else if ((hue > (b_l+0.07f + H11) && hue < t_r) && (chrom > 7.0f && chrom < (55.0f+C9) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
||||||
}
|
}
|
||||||
else if (lum >= 10.0f) {
|
else if (lum >= 10.0f) {
|
||||||
if((hue > (t_l-0.25f + H10) && hue < (t_r-0.3f +H2)) && (chrom > 8.0f && chrom < (23.0f+C2))) scale = (100.f-skinprot)/100.1f;
|
if((hue > (t_l-0.25f + H10) && hue < (t_r-0.3f +H2)) && (chrom > 8.0f && chrom < (23.0f+C2))) scale = (100.f-skinprot)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f+H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (35.0f+C1) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
else if ((hue > (b_l+0.07f+H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (35.0f+C1) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f+H11) && hue < t_r-0.1f) && (chrom > 7.0f && chrom < (45.0f+C1) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
else if ((hue > (b_l+0.07f+H11) && hue < t_r-0.1f) && (chrom > 7.0f && chrom < (45.0f+C1) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
||||||
}
|
}
|
||||||
@ -1100,8 +1100,8 @@ public:
|
|||||||
float modula = -0.0666f * skinprot + 6.66f;
|
float modula = -0.0666f * skinprot + 6.66f;
|
||||||
scale *= modula;
|
scale *= modula;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void SkinSatCbdlCam (float lum, float hue, float chrom, float skinprot, float &scale, bool neg, float b_l, float t_l, float t_r) {
|
static inline void SkinSatCbdlCam (float lum, float hue, float chrom, float skinprot, float &scale, bool neg, float b_l, float t_l, float t_r) {
|
||||||
|
|
||||||
static const float C9=8.f, C8=15.f, C7=12.f, C4=7.f, C3=5.f, C2=5.f, C1=5.f;
|
static const float C9=8.f, C8=15.f, C7=12.f, C4=7.f, C3=5.f, C2=5.f, C1=5.f;
|
||||||
@ -1116,42 +1116,42 @@ public:
|
|||||||
else if(hue>285.f && hue<=355.f) {HH=0.1642f*hue -5.982f;} //HH>-1.3 HH <-0.15
|
else if(hue>285.f && hue<=355.f) {HH=0.1642f*hue -5.982f;} //HH>-1.3 HH <-0.15
|
||||||
|
|
||||||
hue=HH;
|
hue=HH;
|
||||||
|
|
||||||
// "real" skin color : take into account a slightly usage of contrast and saturation in RT if option "skin" = 1, uses imolicit factor 1.0
|
// "real" skin color : take into account a slightly usage of contrast and saturation in RT if option "skin" = 1, uses imolicit factor 1.0
|
||||||
// wide area skin color, useful if not accurate colorimetry or if the user has changed hue and saturation, uses explicit facor 0.6
|
// wide area skin color, useful if not accurate colorimetry or if the user has changed hue and saturation, uses explicit facor 0.6
|
||||||
// wide area for transition, uses explicit factor 0.4
|
// wide area for transition, uses explicit factor 0.4
|
||||||
|
|
||||||
if (lum >= 85.0f) {
|
if (lum >= 85.0f) {
|
||||||
if((hue > (t_l+0.53f-H9) && hue < (t_r+H9)) && (chrom > 8.0f && chrom < (14.0f+C9))) scale = (100.f-skinprot)/100.1f;
|
if((hue > (t_l+0.53f-H9) && hue < (t_r+H9)) && (chrom > 8.0f && chrom < (14.0f+C9))) scale = (100.f-skinprot)/100.1f;
|
||||||
else if (lum >= 92.0f) {
|
else if (lum >= 92.0f) {
|
||||||
if((hue > t_l+0.4f && hue < t_r) && (chrom > 7.0f && chrom < (15.0f))) scale = (100.f-skinprot*0.6f)/100.1f;
|
if((hue > t_l+0.4f && hue < t_r) && (chrom > 7.0f && chrom < (15.0f))) scale = (100.f-skinprot*0.6f)/100.1f;
|
||||||
else if ((hue > b_l && hue < t_r) && (chrom > 7.0f && chrom < (18.0f))) scale = (100.f-skinprot*0.4f)/100.1f;
|
else if ((hue > b_l && hue < t_r) && (chrom > 7.0f && chrom < (18.0f))) scale = (100.f-skinprot*0.4f)/100.1f;
|
||||||
}
|
}
|
||||||
else if ((hue > t_l+0.4f && hue < t_r-0.3f) && (chrom > 7.0f && chrom < (26.0f+C9))) scale = (100.f-skinprot*0.6f)/100.1f;
|
else if ((hue > t_l+0.4f && hue < t_r-0.3f) && (chrom > 7.0f && chrom < (26.0f+C9))) scale = (100.f-skinprot*0.6f)/100.1f;
|
||||||
else if ((hue > b_l+0.05f && hue < t_r) && (chrom > 7.0f && chrom < (35.0f+C9))) scale = (100.f-skinprot*0.4f)/100.1f;
|
else if ((hue > b_l+0.05f && hue < t_r) && (chrom > 7.0f && chrom < (35.0f+C9))) scale = (100.f-skinprot*0.4f)/100.1f;
|
||||||
}
|
}
|
||||||
else if (lum >= 70.0f) {
|
else if (lum >= 70.0f) {
|
||||||
if((hue > t_l+0.15f && hue < (t_r-0.2f+H8)) && (chrom > 8.0f && chrom < (35.0f+C8))) scale = (100.f-skinprot)/100.1f;
|
if((hue > t_l+0.15f && hue < (t_r-0.2f+H8)) && (chrom > 8.0f && chrom < (35.0f+C8))) scale = (100.f-skinprot)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f + H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (48.0f+C9) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
else if ((hue > (b_l+0.07f + H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (48.0f+C9) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f + H11) && hue < t_r) && (chrom > 7.0f && chrom < (55.0f+C9) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
else if ((hue > (b_l+0.07f + H11) && hue < t_r) && (chrom > 7.0f && chrom < (55.0f+C9) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
||||||
}
|
}
|
||||||
else if (lum >= 52.0f) {
|
else if (lum >= 52.0f) {
|
||||||
if((hue > t_l && hue < (t_r+H7)) && (chrom > 11.0f && chrom < (35.0f+C7))) scale = (100.f-skinprot)/100.1f;
|
if((hue > t_l && hue < (t_r+H7)) && (chrom > 11.0f && chrom < (35.0f+C7))) scale = (100.f-skinprot)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f + H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (48.0f+C9) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
else if ((hue > (b_l+0.07f + H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (48.0f+C9) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f + H11) && hue < t_r) && (chrom > 7.0f && chrom < (55.0f+C9) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
else if ((hue > (b_l+0.07f + H11) && hue < t_r) && (chrom > 7.0f && chrom < (55.0f+C9) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
||||||
}
|
}
|
||||||
else if (lum >= 35.0f) {
|
else if (lum >= 35.0f) {
|
||||||
if((hue > t_l && hue < (t_r+H4)) && (chrom > 13.0f && chrom < (37.0f+C4))) scale = (100.f-skinprot)/100.1f;
|
if((hue > t_l && hue < (t_r+H4)) && (chrom > 13.0f && chrom < (37.0f+C4))) scale = (100.f-skinprot)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f + H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (48.0f+C9) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
else if ((hue > (b_l+0.07f + H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (48.0f+C9) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f + H11) && hue < t_r) && (chrom > 7.0f && chrom < (55.0f+C9) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
else if ((hue > (b_l+0.07f + H11) && hue < t_r) && (chrom > 7.0f && chrom < (55.0f+C9) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
||||||
}
|
}
|
||||||
else if (lum >= 20.0f) {
|
else if (lum >= 20.0f) {
|
||||||
if((hue > t_l && hue < (t_r+H3)) && (chrom > 7.0f && chrom <(35.0f+C3) )) scale = (100.f-skinprot)/100.1f;
|
if((hue > t_l && hue < (t_r+H3)) && (chrom > 7.0f && chrom <(35.0f+C3) )) scale = (100.f-skinprot)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f + H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (48.0f+C9) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
else if ((hue > (b_l+0.07f + H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (48.0f+C9) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f + H11) && hue < t_r) && (chrom > 7.0f && chrom < (55.0f+C9) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
else if ((hue > (b_l+0.07f + H11) && hue < t_r) && (chrom > 7.0f && chrom < (55.0f+C9) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
||||||
}
|
}
|
||||||
else if (lum >= 10.0f) {
|
else if (lum >= 10.0f) {
|
||||||
if((hue > (t_l-0.25f + H10) && hue < (t_r-0.3f +H2)) && (chrom > 8.0f && chrom < (23.0f+C2))) scale = (100.f-skinprot)/100.1f;
|
if((hue > (t_l-0.25f + H10) && hue < (t_r-0.3f +H2)) && (chrom > 8.0f && chrom < (23.0f+C2))) scale = (100.f-skinprot)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f+H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (35.0f+C1) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
else if ((hue > (b_l+0.07f+H11) && hue < t_r-0.2f) && (chrom > 7.0f && chrom < (35.0f+C1) )) scale = (100.f-skinprot*0.6f)/100.1f;
|
||||||
else if ((hue > (b_l+0.07f+H11) && hue < t_r-0.1f) && (chrom > 7.0f && chrom < (45.0f+C1) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
else if ((hue > (b_l+0.07f+H11) && hue < t_r-0.1f) && (chrom > 7.0f && chrom < (45.0f+C1) )) scale = (100.f-skinprot*0.4f)/100.1f;
|
||||||
}
|
}
|
||||||
|
@ -3422,8 +3422,8 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, EditBuffer *e
|
|||||||
mixerPurple = 33.f;
|
mixerPurple = 33.f;
|
||||||
mixerCyan = 33.f;
|
mixerCyan = 33.f;
|
||||||
}
|
}
|
||||||
|
float filcor;
|
||||||
Color::computeBWMixerConstants(params->blackwhite.setting, params->blackwhite.filter,params->blackwhite.algo,
|
Color::computeBWMixerConstants(params->blackwhite.setting, params->blackwhite.filter,params->blackwhite.algo,filcor,
|
||||||
bwr, bwg, bwb, mixerOrange, mixerYellow, mixerCyan, mixerPurple, mixerMagenta,
|
bwr, bwg, bwb, mixerOrange, mixerYellow, mixerCyan, mixerPurple, mixerMagenta,
|
||||||
params->blackwhite.autoc, complem, kcorec, rrm, ggm, bbm);
|
params->blackwhite.autoc, complem, kcorec, rrm, ggm, bbm);
|
||||||
|
|
||||||
|
@ -1088,16 +1088,22 @@ void BlackWhite::updateRGBLabel () {
|
|||||||
b = mixerBlue->getValue();
|
b = mixerBlue->getValue();
|
||||||
}
|
}
|
||||||
double mixR, mixG, mixB;
|
double mixR, mixG, mixB;
|
||||||
|
float filcor;
|
||||||
Glib::ustring sSetting = getSettingString();
|
Glib::ustring sSetting = getSettingString();
|
||||||
Color::computeBWMixerConstants(sSetting, getFilterString(),getalgoString(), r, g, b,
|
Color::computeBWMixerConstants(sSetting, getFilterString(),getalgoString(), filcor, r, g, b,
|
||||||
mixerOrange->getValue(), mixerYellow->getValue(), mixerCyan->getValue(), mixerPurple->getValue(), mixerMagenta->getValue(),
|
mixerOrange->getValue(), mixerYellow->getValue(), mixerCyan->getValue(), mixerPurple->getValue(), mixerMagenta->getValue(),
|
||||||
autoch->get_active(), enabledcc->get_active(), kcorrec, mixR, mixG, mixB);
|
autoch->get_active(), enabledcc->get_active(), kcorrec, mixR, mixG, mixB);
|
||||||
|
if( filcor!=1.f){
|
||||||
|
r=kcorrec*r/(r+g+b);
|
||||||
|
g=kcorrec*g/(r+g+b);
|
||||||
|
b=kcorrec*b/(r+g+b);
|
||||||
|
}
|
||||||
RGBLabels->set_text(
|
RGBLabels->set_text(
|
||||||
Glib::ustring::compose(M("TP_BWMIX_RGBLABEL"),
|
Glib::ustring::compose(M("TP_BWMIX_RGBLABEL"),
|
||||||
Glib::ustring::format(std::fixed, std::setprecision(1), r*100.),
|
Glib::ustring::format(std::fixed, std::setprecision(1), r*100.),
|
||||||
Glib::ustring::format(std::fixed, std::setprecision(1), g*100.),
|
Glib::ustring::format(std::fixed, std::setprecision(1), g*100.),
|
||||||
Glib::ustring::format(std::fixed, std::setprecision(1), b*100.),
|
Glib::ustring::format(std::fixed, std::setprecision(1), b*100.),
|
||||||
Glib::ustring::format(std::fixed, std::setprecision(0), ceil(kcorrec*100./*(r+g+b)*100.)*/)))
|
Glib::ustring::format(std::fixed, std::setprecision(0), ceil(kcorrec*100./*(r+g+b)*100.)*/)))
|
||||||
);
|
);
|
||||||
// We have to update the RGB sliders too if preset values has been chosen
|
// We have to update the RGB sliders too if preset values has been chosen
|
||||||
if (sSetting != "RGB-Abs" && sSetting != "RGB-Rel" && sSetting != "ROYGCBPM-Abs" && sSetting != "ROYGCBPM-Rel") {
|
if (sSetting != "RGB-Abs" && sSetting != "RGB-Rel" && sSetting != "ROYGCBPM-Abs" && sSetting != "ROYGCBPM-Rel") {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user