diff --git a/rtdata/languages/default b/rtdata/languages/default index 23d12e1be..f4546245e 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -707,6 +707,10 @@ HISTORY_MSG_475;PS - Equalize channel HISTORY_MSG_476;CAM02 - Temp out HISTORY_MSG_477;CAM02 - Green out HISTORY_MSG_478;CAM02 - Yb out +HISTORY_MSG_479;CAM02 - CAT adaptation out +HISTORY_MSG_480;CAM02 - CAT auto out +HISTORY_MSG_481;CAM02 - temp scene +HISTORY_MSG_482;CAM02 - green scene HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOT;Snapshot @@ -1308,6 +1312,7 @@ TP_COLORAPP_DATACIE;CIECAM02 output histograms in curves TP_COLORAPP_DATACIE_TOOLTIP;When enabled, histograms in CIECAM02 curves show approximate values/ranges for J or Q, and C, s or M after the CIECAM02 adjustments.\nThis selection does not impact the main histogram panel.\n\nWhen disabled, histograms in CIECAM02 curves show L*a*b* values before CIECAM02 adjustments. TP_COLORAPP_DEGREE_AUTO_TOOLTIP;If the check-box is checked (recommended), RawTherapee calculates an optimum value, which is then used by CAT02, and also for the entire CIECAM02.\nTo set the value manually, uncheck the check-box first (values above 65 are recommended). TP_COLORAPP_DEGREE_TOOLTIP;Amount of CIE Chromatic Adaptation Transform 2002. +TP_COLORAPP_FREE;Free temp+green + CAT02 + [output] TP_COLORAPP_GAMUT;Gamut control (L*a*b*) TP_COLORAPP_GAMUT_TOOLTIP;Allow gamut control in L*a*b* mode. TP_COLORAPP_HUE;Hue (h) @@ -1319,7 +1324,7 @@ TP_COLORAPP_LABEL_VIEWING;Viewing Conditions TP_COLORAPP_LIGHT;Lightness (J) TP_COLORAPP_LIGHT_TOOLTIP;Lightness in CIECAM02 differs from L*a*b* and RGB lightness. TP_COLORAPP_MODEL;WP Model -TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions. +TP_COLORAPP_MODEL_TOOLTIP;White-Point Model.\n\nWB [RT] + [output]: RT's white balance is used for the scene, CIECAM02 is set to D50, and the output device's white balance is set in Viewing Conditions.\n\nWB [RT+CAT02] + [output]: RT's white balance settings are used by CAT02 and the output device's white balance is set in Viewing Conditions.\n\nFree temp+green + CAT02 + [output]: temp and green are selected bu user, output device's white balance is set in Viewing Conditions. TP_COLORAPP_RSTPRO;Red & skin-tones protection TP_COLORAPP_RSTPRO_TOOLTIP;Red and skin-tones protection affects both sliders and curves. TP_COLORAPP_SHARPCIE;--unused-- diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index d03ceca2c..1429b3b68 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -541,7 +541,7 @@ void ImProcFunctions::ciecam_02 (CieImage* ncie, double adap, int begh, int endh xw = 100.0 * Xw; yw = 100.0 * Yw; zw = 100.0 * Zw; - double xw1, yw1, zw1, xw2, yw2, zw2; + double xw1 =0., yw1 = 0., zw1 = 0., xw2 = 0., yw2 = 0., zw2 = 0.; // settings of WB: scene and viewing if (params->colorappearance.wbmodel == "RawT") { @@ -1497,10 +1497,11 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int double Xw, Zw; float f, nc, yb = 0.f, la, c, xw, yw, zw, f2 = 1.f, c2 = 1.f, nc2 = 1.f, yb2; float fl, n, nbb, ncb, aw; //d - float xwd, ywd, zwd; + float xwd, ywd, zwd, xws, yws, zws; int alg = 0; bool algepd = false; double Xwout, Zwout; + double Xwsc, Zwsc; const bool epdEnabled = params->epd.enabled; bool ciedata = (params->colorappearance.datacie && pW != 1) && ! ((params->colorappearance.tonecie && (epdEnabled)) || (params->sharpening.enabled && settings->autocielab && execsharp) @@ -1509,6 +1510,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int ColorTemp::temp2mulxyz (params->wb.temperature, params->wb.green, params->wb.method, Xw, Zw); //compute white Xw Yw Zw : white current WB ColorTemp::temp2mulxyz (params->colorappearance.tempout, params->colorappearance.greenout, "Custom", Xwout, Zwout); + ColorTemp::temp2mulxyz (params->colorappearance.tempsc, params->colorappearance.greensc, "Custom", Xwsc, Zwsc); //viewing condition for surround if (params->colorappearance.surround == "Average") { @@ -1556,6 +1558,12 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int xwd = 100.f * Xwout; zwd = 100.f * Zwout; ywd = 100.f / params->colorappearance.greenout;//approximation to simplify + + xws = 100.f * Xwsc; + zws = 100.f * Zwsc; + yws = 100.f / params->colorappearance.greensc;//approximation to simplify + + /* //settings white point of output device - or illuminant viewing if (settings->viewingdevice == 0) { @@ -1841,7 +1849,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int xw = 100.0f * Xw; yw = 100.0f * Yw; zw = 100.0f * Zw; - float xw1, yw1, zw1, xw2, yw2, zw2; + float xw1 = 0.f, yw1 = 0.f, zw1 = 0.f, xw2 = 0.f, yw2 = 0.f, zw2 = 0.f; // settings of WB: scene and viewing if (params->colorappearance.wbmodel == "RawT") { @@ -1851,14 +1859,22 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int begh, int xw2 = xwd; yw2 = ywd; zw2 = zwd; - } else { /*if(params->colorappearance.wbmodel == "RawTCAT02")*/ + } else if(params->colorappearance.wbmodel == "RawTCAT02") { xw1 = xw; // Settings RT WB are used for CAT02 => mix , CAT02 is use for output device (screen: D50 D65, projector: lamp, LED) see preferences yw1 = yw; zw1 = zw; xw2 = xwd; yw2 = ywd; zw2 = zwd; - } + } else if(params->colorappearance.wbmodel == "free") { + xw1 = xws; // free temp and green + yw1 = yws; + zw1 = zws; + xw2 = xwd; + yw2 = ywd; + zw2 = zwd; + } + float cz, wh, pfl; Ciecam02::initcam1float (gamu, yb, pilot, f, la, xw, yw, zw, n, d, nbb, ncb, cz, aw, wh, pfl, fl, c); diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 5070a9b0d..88aaf0e3f 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -507,6 +507,8 @@ enum ProcEvent { EvCATybout = 477, EvCATDegreeout = 478, EvCATAutoDegreeout = 479, + EvCATtempsc = 480, + EvCATgreensc = 481, NUMOFEVENTS diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index a16703f5a..8ed7236cb 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1154,6 +1154,8 @@ void ProcParams::setDefaults () colorappearance.tempout = 5000; colorappearance.greenout = 1.0; colorappearance.ybout = 18; + colorappearance.tempsc = 5000; + colorappearance.greensc = 1.0; impulseDenoise.enabled = false; impulseDenoise.thresh = 50; @@ -2149,6 +2151,14 @@ int ProcParams::save (const Glib::ustring &fname, const Glib::ustring &fname2, b keyFile.set_double ("Color appearance", "Greenout", colorappearance.greenout); } + if (!pedited || pedited->colorappearance.tempsc) { + keyFile.set_integer ("Color appearance", "Tempsc", colorappearance.tempsc); + } + + if (!pedited || pedited->colorappearance.greensc) { + keyFile.set_double ("Color appearance", "Greensc", colorappearance.greensc); + } + if (!pedited || pedited->colorappearance.ybout) { keyFile.set_integer ("Color appearance", "Ybout", colorappearance.ybout); } @@ -5124,6 +5134,22 @@ int ProcParams::load (const Glib::ustring &fname, ParamsEdited* pedited) } } + if (keyFile.has_key ("Color appearance", "Tempsc")) { + colorappearance.tempsc = keyFile.get_integer ("Color appearance", "Tempsc"); + + if (pedited) { + pedited->colorappearance.tempsc = true; + } + } + + if (keyFile.has_key ("Color appearance", "Greensc")) { + colorappearance.greensc = keyFile.get_double ("Color appearance", "Greensc"); + + if (pedited) { + pedited->colorappearance.greensc = true; + } + } + if (keyFile.has_key ("Color appearance", "Ybout")) { colorappearance.ybout = keyFile.get_integer ("Color appearance", "Ybout"); @@ -8260,6 +8286,8 @@ bool ProcParams::operator== (const ProcParams& other) && colorappearance.colorh == other.colorappearance.colorh && colorappearance.tempout == other.colorappearance.tempout && colorappearance.greenout == other.colorappearance.greenout + && colorappearance.tempsc == other.colorappearance.tempsc + && colorappearance.greensc == other.colorappearance.greensc && colorappearance.ybout == other.colorappearance.ybout && impulseDenoise.enabled == other.impulseDenoise.enabled && impulseDenoise.thresh == other.impulseDenoise.thresh diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 1ee5d16df..636308800 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -619,6 +619,8 @@ public: int tempout; int ybout; double greenout; + int tempsc; + double greensc; // bool sharpcie; }; diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 0a345d8ac..732e2e05d 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -506,7 +506,9 @@ int refreshmap[rtengine::NUMOFEVENTS] = { LUMINANCECURVE, // EvCATgreenout LUMINANCECURVE, // EvCATybout LUMINANCECURVE, // EvCATDegreeout - LUMINANCECURVE // EvCATAutoDegreeout + LUMINANCECURVE, // EvCATAutoDegreeout + LUMINANCECURVE, // EvCATtempsc + LUMINANCECURVE // EvCATgreensc }; diff --git a/rtgui/colorappearance.cc b/rtgui/colorappearance.cc index c01b7458f..983ea7552 100644 --- a/rtgui/colorappearance.cc +++ b/rtgui/colorappearance.cc @@ -159,10 +159,27 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" wbmodel = Gtk::manage (new MyComboBoxText ()); wbmodel->append (M ("TP_COLORAPP_WBRT")); wbmodel->append (M ("TP_COLORAPP_WBCAM")); + wbmodel->append (M ("TP_COLORAPP_FREE")); + wbmodel->set_active (0); wbmHBox->pack_start (*wbmodel); p1VBox->pack_start (*wbmHBox); + Gtk::Image* itempL = Gtk::manage (new RTImage ("ajd-wb-temp1.png")); + Gtk::Image* itempR = Gtk::manage (new RTImage ("ajd-wb-temp2.png")); + Gtk::Image* igreenL = Gtk::manage (new RTImage ("ajd-wb-green1.png")); + Gtk::Image* igreenR = Gtk::manage (new RTImage ("ajd-wb-green2.png")); + + + tempsc = Gtk::manage (new Adjuster (M ("TP_WBALANCE_TEMPERATURE"), MINTEMP0, MAXTEMP0, 5, CENTERTEMP0, itempR, itempL, &wbSlider2Temp, &wbTemp2Slider)); + greensc = Gtk::manage (new Adjuster (M ("TP_WBALANCE_GREEN"), MINGREEN0, MAXGREEN0, 0.001, 1.0, igreenR, igreenL)); + + tempsc->show(); + greensc->show(); + p1VBox->pack_start (*tempsc); + p1VBox->pack_start (*greensc); + + adapscen = Gtk::manage (new Adjuster (M ("TP_COLORAPP_ADAPTSCENE"), 0.001, 16384., 0.001, 2000.)); // EV -7 ==> EV 17 if (adapscen->delay < options.adjusterMaxDelay) { @@ -443,10 +460,6 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" adaplum->set_tooltip_markup (M ("TP_COLORAPP_ADAPTVIEWING_TOOLTIP")); p3VBox->pack_start (*adaplum); - Gtk::Image* itempL = Gtk::manage (new RTImage ("ajd-wb-temp1.png")); - Gtk::Image* itempR = Gtk::manage (new RTImage ("ajd-wb-temp2.png")); - Gtk::Image* igreenL = Gtk::manage (new RTImage ("ajd-wb-green1.png")); - Gtk::Image* igreenR = Gtk::manage (new RTImage ("ajd-wb-green2.png")); // Gtk::Image* iblueredL = Gtk::manage (new RTImage ("ajd-wb-bluered1.png")); // Gtk::Image* iblueredR = Gtk::manage (new RTImage ("ajd-wb-bluered2.png")); @@ -541,6 +554,8 @@ ColorAppearance::ColorAppearance () : FoldableToolPanel (this, "colorappearance" tempout->setAdjusterListener (this); greenout->setAdjusterListener (this); ybout->setAdjusterListener (this); + tempsc->setAdjusterListener (this); + greensc->setAdjusterListener (this); show_all(); @@ -597,6 +612,8 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) tempout->setEditedState (pedited->colorappearance.tempout ? Edited : UnEdited); greenout->setEditedState (pedited->colorappearance.greenout ? Edited : UnEdited); ybout->setEditedState (pedited->colorappearance.ybout ? Edited : UnEdited); + tempsc->setEditedState (pedited->colorappearance.tempsc ? Edited : UnEdited); + greensc->setEditedState (pedited->colorappearance.greensc ? Edited : UnEdited); contrast->setEditedState (pedited->colorappearance.contrast ? Edited : UnEdited); qcontrast->setEditedState (pedited->colorappearance.qcontrast ? Edited : UnEdited); colorh->setEditedState (pedited->colorappearance.colorh ? Edited : UnEdited); @@ -654,11 +671,13 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) wbmodelconn.block (true); if (pedited && !pedited->colorappearance.wbmodel) { - wbmodel->set_active (2); + wbmodel->set_active (3); } else if (pp->colorappearance.wbmodel == "RawT") { wbmodel->set_active (0); } else if (pp->colorappearance.wbmodel == "RawTCAT02") { wbmodel->set_active (1); + } else if (pp->colorappearance.wbmodel == "free") { + wbmodel->set_active (2); } wbmodelconn.block (false); @@ -734,6 +753,8 @@ void ColorAppearance::read (const ProcParams* pp, const ParamsEdited* pedited) tempout->setValue (pp->colorappearance.tempout); greenout->setValue (pp->colorappearance.greenout); ybout->setValue (pp->colorappearance.ybout); + tempsc->setValue (pp->colorappearance.tempsc); + greensc->setValue (pp->colorappearance.greensc); tcmode3conn.block (false); tcmode2conn.block (false); @@ -782,6 +803,8 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) pp->colorappearance.tempout = tempout->getValue (); pp->colorappearance.greenout = greenout->getValue (); pp->colorappearance.ybout = ybout->getValue (); + pp->colorappearance.tempsc = tempsc->getValue (); + pp->colorappearance.greensc = greensc->getValue (); int tcMode = toneCurveMode->get_active_row_number(); @@ -846,6 +869,8 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) pedited->colorappearance.tempout = tempout->getEditedState (); pedited->colorappearance.greenout = greenout->getEditedState (); pedited->colorappearance.ybout = ybout->getEditedState (); + pedited->colorappearance.tempsc = tempsc->getEditedState (); + pedited->colorappearance.greensc = greensc->getEditedState (); } @@ -863,6 +888,9 @@ void ColorAppearance::write (ProcParams* pp, ParamsEdited* pedited) pp->colorappearance.wbmodel = "RawT"; } else if (wbmodel->get_active_row_number() == 1) { pp->colorappearance.wbmodel = "RawTCAT02"; + } else if (wbmodel->get_active_row_number() == 2) { + pp->colorappearance.wbmodel = "free"; + } if (algo->get_active_row_number() == 0) { @@ -1121,6 +1149,8 @@ void ColorAppearance::setDefaults (const ProcParams* defParams, const ParamsEdit tempout->setDefault (defParams->colorappearance.tempout); greenout->setDefault (defParams->colorappearance.greenout); ybout->setDefault (defParams->colorappearance.ybout); + tempsc->setDefault (defParams->colorappearance.tempsc); + greensc->setDefault (defParams->colorappearance.greensc); if (pedited) { degree->setDefaultEditedState (pedited->colorappearance.degree ? Edited : UnEdited); @@ -1140,6 +1170,8 @@ void ColorAppearance::setDefaults (const ProcParams* defParams, const ParamsEdit tempout->setDefaultEditedState (pedited->colorappearance.tempout ? Edited : UnEdited); greenout->setDefaultEditedState (pedited->colorappearance.greenout ? Edited : UnEdited); ybout->setDefaultEditedState (pedited->colorappearance.ybout ? Edited : UnEdited); + tempsc->setDefaultEditedState (pedited->colorappearance.tempsc ? Edited : UnEdited); + greensc->setDefaultEditedState (pedited->colorappearance.greensc ? Edited : UnEdited); } else { degree->setDefaultEditedState (Irrelevant); @@ -1159,6 +1191,8 @@ void ColorAppearance::setDefaults (const ProcParams* defParams, const ParamsEdit tempout->setDefaultEditedState (Irrelevant); greenout->setDefaultEditedState (Irrelevant); ybout->setDefaultEditedState (Irrelevant); + tempsc->setDefaultEditedState (Irrelevant); + greensc->setDefaultEditedState (Irrelevant); } } @@ -1272,6 +1306,10 @@ void ColorAppearance::adjusterChanged (Adjuster* a, double newval) listener->panelChanged (EvCATgreenout, a->getTextValue()); } else if (a == ybout) { listener->panelChanged (EvCATybout, a->getTextValue()); + } else if (a == tempsc) { + listener->panelChanged (EvCATtempsc, a->getTextValue()); + } else if (a == greensc) { + listener->panelChanged (EvCATgreensc, a->getTextValue()); } @@ -1373,6 +1411,14 @@ void ColorAppearance::surroundChanged () void ColorAppearance::wbmodelChanged () { + if (wbmodel->get_active_row_number() == 0 || wbmodel->get_active_row_number() == 1) { + tempsc->hide(); + greensc->hide(); + } + if (wbmodel->get_active_row_number() == 2){ + tempsc->show(); + greensc->show(); + } if (listener && (multiImage || getEnabled()) ) { listener->panelChanged (EvCATMethodWB, wbmodel->get_active_text ()); @@ -1474,6 +1520,8 @@ void ColorAppearance::setBatchMode (bool batchMode) tempout->showEditedCB (); greenout->showEditedCB (); ybout->showEditedCB (); + tempsc->showEditedCB (); + greensc->showEditedCB (); surround->append (M ("GENERAL_UNCHANGED")); wbmodel->append (M ("GENERAL_UNCHANGED")); @@ -1534,5 +1582,7 @@ void ColorAppearance::trimValues (rtengine::procparams::ProcParams* pp) tempout->trimValue (pp->colorappearance.tempout); greenout->trimValue (pp->colorappearance.greenout); ybout->trimValue (pp->colorappearance.ybout); + tempsc->trimValue (pp->colorappearance.tempsc); + greensc->trimValue (pp->colorappearance.greensc); } diff --git a/rtgui/colorappearance.h b/rtgui/colorappearance.h index 261d8f9bd..f5102be95 100644 --- a/rtgui/colorappearance.h +++ b/rtgui/colorappearance.h @@ -105,6 +105,8 @@ private: Adjuster* tempout; Adjuster* greenout; Adjuster* ybout; + Adjuster* tempsc; + Adjuster* greensc; MyComboBoxText* toneCurveMode; MyComboBoxText* toneCurveMode2; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 7b7942203..d3e17b810 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -209,6 +209,8 @@ void ParamsEdited::set (bool v) colorappearance.tempout = v; colorappearance.greenout = v; colorappearance.ybout = v; + colorappearance.tempsc = v; + colorappearance.greensc = v; //colorBoost.amount = v; //colorBoost.avoidclip = v; @@ -734,6 +736,8 @@ void ParamsEdited::initFrom (const std::vector colorappearance.tempout = colorappearance.tempout && p.colorappearance.tempout == other.colorappearance.tempout; colorappearance.greenout = colorappearance.greenout && p.colorappearance.greenout == other.colorappearance.greenout; colorappearance.ybout = colorappearance.ybout && p.colorappearance.ybout == other.colorappearance.ybout; + colorappearance.tempsc = colorappearance.tempsc && p.colorappearance.tempsc == other.colorappearance.tempsc; + colorappearance.greensc = colorappearance.greensc && p.colorappearance.greensc == other.colorappearance.greensc; //colorBoost.amount = colorBoost.amount && p.colorBoost.amount == other.colorBoost.amount; //colorBoost.avoidclip = colorBoost.avoidclip && p.colorBoost.avoidclip == other.colorBoost.avoidclip; @@ -1759,6 +1763,14 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.colorappearance.greenout = mods.colorappearance.greenout; } + if (colorappearance.tempsc) { + toEdit.colorappearance.tempsc = mods.colorappearance.tempsc; + } + + if (colorappearance.greensc) { + toEdit.colorappearance.greensc = mods.colorappearance.greensc; + } + if (colorappearance.ybout) { toEdit.colorappearance.ybout = mods.colorappearance.ybout; } diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 7d0ce7fde..4c0bcd38e 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -316,6 +316,8 @@ public: bool tempout; bool greenout; bool ybout; + bool tempsc; + bool greensc; };