From dedce5d3838a28b622b7058f15be83382dd9e0df Mon Sep 17 00:00:00 2001 From: Desmis Date: Tue, 10 Apr 2018 15:29:05 +0200 Subject: [PATCH] add selected TRC to FOIP --- rtdata/languages/default | 2 +- rtengine/iccstore.cc | 88 ++++++++++++++++++++++++++--------- rtengine/improccoordinator.cc | 2 +- rtengine/improccoordinator.h | 6 +++ rtengine/rtengine.h | 8 ++++ rtgui/icmpanel.cc | 36 +++++++++++--- rtgui/icmpanel.h | 3 +- rtgui/toolpanelcoord.cc | 1 + 8 files changed, 115 insertions(+), 31 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index bfeb7ad34..24d630e81 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1595,7 +1595,7 @@ TP_FLATFIELD_LABEL;Flat-Field TP_GAMMA_CURV;Gamma TP_GAMMA_FREE;Free Output Integrate Profile (FOIP) TP_GAMMA_PRIM;Primaries Output profile -TP_GAMMA_OUTPUT;Output gamma +TP_GAMMA_OUTPUT;Gamma - TRC TP_GAMMA_PROF;Generate ICC profile TP_GAMMA_PROF_NONE;none TP_GAMMA_PROF_V2;ICC V2 diff --git a/rtengine/iccstore.cc b/rtengine/iccstore.cc index 7eaabd79e..582026437 100644 --- a/rtengine/iccstore.cc +++ b/rtengine/iccstore.cc @@ -199,7 +199,7 @@ cmsHPROFILE createXYZProfile() const double(*wprofiles[])[3] = {xyz_sRGB, xyz_adobe, xyz_prophoto, xyz_widegamut, xyz_bruce, xyz_beta, xyz_best, xyz_rec2020, xyz_ACESc}; const double(*iwprofiles[])[3] = {sRGB_xyz, adobe_xyz, prophoto_xyz, widegamut_xyz, bruce_xyz, beta_xyz, best_xyz, rec2020_xyz, ACESc_xyz}; const char* wpnames[] = {"sRGB", "Adobe RGB", "ProPhoto", "WideGamut", "BruceRGB", "Beta RGB", "BestRGB", "Rec2020", "ACESc"}; -const char* wpgamma[] = {"default", "BT709_g2.2_s4.5", "sRGB_g2.4_s12.92", "linear_g1.0", "standard_g2.2", "standard_g1.8", "High_g1.3_s3.35", "Low_g2.6_s6.9"}; //gamma free +const char* wpgamma[] = {"Free", "BT709_g2.2_s4.5", "sRGB_g2.4_s12.92", "linear_g1.0", "standard_g2.2", "standard_g1.8", "High_g1.3_s3.35", "Low_g2.6_s6.9", "Lab_g3.0s9.03296"}; //gamma free //default = gamma inside profile //BT709 g=2.22 s=4.5 sRGB g=2.4 s=12.92 //linear g=1.0 @@ -1067,7 +1067,7 @@ void rtengine::ICCStore::getGammaArray(const procparams::ColorManagementParams & { const double eps = 0.000000001; // not divide by zero - if (!icm.freegamma) {//if Free gamma not selected + if (icm.freegamma && icm.gamma != "Free") { //if Free gamma selected with other than Free // gamma : ga[0],ga[1],ga[2],ga[3],ga[4],ga[5] by calcul if (icm.gamma == "BT709_g2.2_s4.5") { ga[0] = 2.22; //BT709 2.2 4.5 - my preferred as D.Coffin @@ -1105,6 +1105,13 @@ void rtengine::ICCStore::getGammaArray(const procparams::ColorManagementParams & ga[2] = 0.; ga[3] = 1. / eps; ga[4] = 0.; + } else if (icm.gamma == "Lab_g3.0s9.03296") { + ga[0] = 3.0; //Lab gamma =3 slope=9.03296 + ga[1] = 0.8621; + ga[2] = 0.1379; + ga[3] = 0.1107; + ga[4] = 0.08; + } else { /* if (icm.gamma == "linear_g1.0") */ ga[0] = 1.0; //gamma=1 linear : for high dynamic images(cf : D.Coffin...) ga[1] = 1.; @@ -1455,6 +1462,7 @@ cmsHPROFILE rtengine::ICCStore::createCustomGammaOutputProfile(const procparams: Glib::ustring outProfile; cmsHPROFILE outputProfile = nullptr; Glib::ustring outPr; + Glib::ustring gammaStr; if (icm.freegamma && icm.gampos < 1.35) { @@ -1463,7 +1471,7 @@ cmsHPROFILE rtengine::ICCStore::createCustomGammaOutputProfile(const procparams: pro = true; //pro=0 RT_sRGB || Prophoto } - //necessary for V2 profile + //necessary for V2 profile if (icm.wprimari == "ProPhoto" && rtengine::ICCStore::getInstance()->outputProfileExist(options.rtSettings.prophoto) && !pro) { outProfile = options.rtSettings.prophoto; outPr = "RT_large"; @@ -1538,32 +1546,52 @@ cmsHPROFILE rtengine::ICCStore::createCustomGammaOutputProfile(const procparams: mlu = cmsMLUalloc(ContextID, 1); Glib::ustring outPro; + if (icm.gamma == "High_g1.3_s3.35") { + gammaStr = "_High_g=1.3_s=3.35"; + } else if (icm.gamma == "Low_g2.6_s6.9") { + gammaStr = "_Low_g=2.6_s=6.9"; + } else if (icm.gamma == "sRGB_g2.4_s12.92") { + gammaStr = "_sRGB_g=2.4_s=12.92"; + } else if (icm.gamma == "BT709_g2.2_s4.5") { + gammaStr = "_BT709_g=2.2_s=4.5"; + } else if (icm.gamma == "linear_g1.0") { + gammaStr = "_Linear_g=1.0"; + } else if (icm.gamma == "standard_g2.2") { + gammaStr = "_g=2.2"; + } else if (icm.gamma == "standard_g1.8") { + gammaStr = "_g=1.8"; + } else if (icm.gamma == "Lab_g3.0s9.03296") { + gammaStr = "_LAB_g3.0_s9.03296"; + } + // instruction with //ICC are used to generate ICC profile if (mlu == nullptr) { printf("Description error\n"); } else { // Description TAG : selection of gamma and Primaries - if (!icm.freegamma) { - std::wstring gammaStr; + if (icm.freegamma && icm.gamma != "Free") { + /* + // std::wstring gammaStr; if (icm.gamma == "High_g1.3_s3.35") { - gammaStr = std::wstring(L"GammaTRC: High g=1.3 s=3.35"); + gammaStr = "_TRC: High g=1.3 s=3.35"; } else if (icm.gamma == "Low_g2.6_s6.9") { - gammaStr = std::wstring(L"GammaTRC: Low g=2.6 s=6.9"); + gammaStr = "_TRC: Low g=2.6 s=6.9"; } else if (icm.gamma == "sRGB_g2.4_s12.92") { - gammaStr = std::wstring(L"GammaTRC: sRGB g=2.4 s=12.92"); + gammaStr = "_TRC: sRGB g=2.4 s=12.92"; } else if (icm.gamma == "BT709_g2.2_s4.5") { - gammaStr = std::wstring(L"GammaTRC: BT709 g=2.2 s=4.5"); + gammaStr = "_TRC: BT709 g=2.2 s=4.5"; } else if (icm.gamma == "linear_g1.0") { - gammaStr = std::wstring(L"GammaTRC: Linear g=1.0"); + gammaStr = "_TRC: Linear g=1.0"; } else if (icm.gamma == "standard_g2.2") { - gammaStr = std::wstring(L"GammaTRC: g=2.2"); + gammaStr = "GammaTRC: g=2.2"; } else if (icm.gamma == "standard_g1.8") { - gammaStr = std::wstring(L"GammaTRC: g=1.8"); + gammaStr = "GammaTRC: g=1.8"; } + */ + //cmsMLUsetWide(mlu, "en", "US", gammaStr.c_str()); - cmsMLUsetWide(mlu, "en", "US", gammaStr.c_str()); } else { /* // create description with gamma + slope + primaries @@ -1709,25 +1737,43 @@ cmsHPROFILE rtengine::ICCStore::createCustomGammaOutputProfile(const procparams: // create description with gamma + slope + primaries std::wostringstream gammaWs; //std::string gammaWsICC; - std::wstring gammaStrICC; + std::wstring gammaStrIC; gammaWs.precision(6); - if (icm.wprofile == "v4") { - outPro = outPr + "_FOIP_V4_" + std::to_string((float)icm.gampos) + " " + std::to_string((float)icm.slpos) + ".icc"; - } else if (icm.wprofile == "v2") { - outPro = outPr + "_FOIP_V2_" + std::to_string((float)icm.gampos) + " " + std::to_string((float)icm.slpos) + ".icc"; + if (icm.gamma == "Free") { + if (icm.wprofile == "v4") { + outPro = outPr + "_FOIP_V4_" + std::to_string((float)icm.gampos) + " " + std::to_string((float)icm.slpos) + ".icc"; + } else if (icm.wprofile == "v2") { + outPro = outPr + "_FOIP_V2_" + std::to_string((float)icm.gampos) + " " + std::to_string((float)icm.slpos) + ".icc"; + } + + gammaWs << outPro.c_str() << (float)icm.gampos << " s=" << (float)icm.slpos; + + cmsMLUsetWide(mlu, "en", "US", gammaWs.str().c_str()); + + } else { + + if (icm.wprofile == "v4") { + outPro = outPr + "_FOIP_V4_" + gammaStr + ".icc"; + + } else if (icm.wprofile == "v2") { + outPro = outPr + "_FOIP_V2_" + gammaStr + ".icc"; + } + + gammaWs << outPro.c_str() << " s="; + cmsMLUsetWide(mlu, "en", "US", gammaWs.str().c_str()); + + } - gammaWs << outPro.c_str() << (float)icm.gampos << " s=" << (float)icm.slpos; - - cmsMLUsetWide(mlu, "en", "US", gammaWs.str().c_str()); cmsMLU *copyright = cmsMLUalloc(NULL, 1); cmsMLUsetASCII(copyright, "en", "US", "No copyright Rawtherapee"); cmsWriteTag(outputProfile, cmsSigCopyrightTag, copyright); cmsMLUfree(copyright); } + cmsMLU *descrip = cmsMLUalloc(NULL, 1); cmsMLUsetASCII(descrip, "en", "US", "Rawtherapee"); cmsWriteTag(outputProfile, cmsSigDeviceModelDescTag, descrip); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index be8aa2533..fcfe7a567 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -93,7 +93,7 @@ ImProcCoordinator::ImProcCoordinator () fw (0), fh (0), tr (0), fullw (1), fullh (1), pW (-1), pH (-1), - plistener (nullptr), imageListener (nullptr), aeListener (nullptr), acListener (nullptr), abwListener (nullptr), awbListener (nullptr), frameCountListener (nullptr), imageTypeListener (nullptr), actListener (nullptr), adnListener (nullptr), awavListener (nullptr), dehaListener (nullptr), hListener (nullptr), + plistener (nullptr), imageListener (nullptr), aeListener (nullptr), acListener (nullptr), abwListener (nullptr), awbListener (nullptr), icmListener (nullptr), frameCountListener (nullptr), imageTypeListener (nullptr), actListener (nullptr), adnListener (nullptr), awavListener (nullptr), dehaListener (nullptr), hListener (nullptr), resultValid (false), lastOutputProfile ("BADFOOD"), lastOutputIntent (RI__COUNT), lastOutputBPC (false), thread (nullptr), changeSinceLast (0), updaterRunning (false), destroying (false), utili (false), autili (false), butili (false), ccutili (false), cclutili (false), clcutili (false), opautili (false), wavcontlutili (false), colourToningSatLimit (0.f), colourToningSatLimitOpacity (0.f), highQualityComputed (false) {} diff --git a/rtengine/improccoordinator.h b/rtengine/improccoordinator.h index ab599bfb3..871d90a07 100644 --- a/rtengine/improccoordinator.h +++ b/rtengine/improccoordinator.h @@ -159,6 +159,7 @@ protected: AutoCamListener* acListener; AutoBWListener* abwListener; AutoWBListener* awbListener; + ICMListener* icmListener; FrameCountListener *frameCountListener; ImageTypeListener *imageTypeListener; @@ -323,6 +324,11 @@ public: { awbListener = awb; } + void setICMListener (ICMListener* icml) + { + icmListener = icml; + } + void setAutoColorTonListener (AutoColorTonListener* bwct) { actListener = bwct; diff --git a/rtengine/rtengine.h b/rtengine/rtengine.h index 687836c49..8722fd095 100644 --- a/rtengine/rtengine.h +++ b/rtengine/rtengine.h @@ -348,6 +348,13 @@ public : virtual void WBChanged (double temp, double green) = 0; }; +class ICMListener +{ +public : + virtual ~ICMListener() = default; + virtual void TRCChanged (double gamm, double slo) = 0; +}; + class FrameCountListener { public : @@ -469,6 +476,7 @@ public: virtual void setFrameCountListener (FrameCountListener* l) = 0; virtual void setAutoBWListener (AutoBWListener* l) = 0; virtual void setAutoWBListener (AutoWBListener* l) = 0; + virtual void setICMListener (ICMListener* l) = 0; virtual void setAutoColorTonListener (AutoColorTonListener* l) = 0; virtual void setAutoChromaListener (AutoChromaListener* l) = 0; virtual void setRetinexListener (RetinexListener* l) = 0; diff --git a/rtgui/icmpanel.cc b/rtgui/icmpanel.cc index 78d98ddc4..ff36ca7cf 100644 --- a/rtgui/icmpanel.cc +++ b/rtgui/icmpanel.cc @@ -229,7 +229,7 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha wgamma = Gtk::manage(new MyComboBoxText()); gaHBox->pack_start(*wgamma, Gtk::PACK_EXPAND_WIDGET); - oVBox->pack_start(*gaHBox, Gtk::PACK_EXPAND_WIDGET); + // oVBox->pack_start(*gaHBox, Gtk::PACK_EXPAND_WIDGET); std::vector wpgamma = rtengine::ICCStore::getGamma(); @@ -267,6 +267,7 @@ ICMPanel::ICMPanel() : FoldableToolPanel(this, "icm", M("TP_ICM_LABEL")), iuncha } wprimari->set_active(6); + fgVBox->pack_start(*gaHBox, Gtk::PACK_EXPAND_WIDGET); gampos = Gtk::manage(new Adjuster(M("TP_GAMMA_CURV"), 1, 3.5, 0.00001, 2.4)); gampos->setAdjusterListener(this); @@ -617,12 +618,12 @@ void ICMPanel::read(const ProcParams* pp, const ParamsEdited* pedited) lastgamfree = pp->icm.freegamma; if (!batchMode) { - onames->set_sensitive(wgamma->get_active_row_number() == 0 && !pp->icm.freegamma); //"default" - wgamma->set_sensitive(!pp->icm.freegamma); + onames->set_sensitive(/*wgamma->get_active_row_number() == 0 &&*/ !pp->icm.freegamma); //"default" + wgamma->set_sensitive(pp->icm.freegamma); gampos->set_sensitive(pp->icm.freegamma); slpos->set_sensitive(pp->icm.freegamma); updateRenderingIntent(pp->icm.output); - //wprimari->set_sensitive(!pp->icm.freegamma); + wprimari->set_sensitive(pp->icm.freegamma); } gampos->setValue(pp->icm.gampos); @@ -813,6 +814,13 @@ void ICMPanel::wprofileChanged() void ICMPanel::gpChanged() { + if (wgamma->get_active_row_number() == 0) { + gampos->set_sensitive(true); + slpos->set_sensitive(true); + } else { + gampos->set_sensitive(false); + slpos->set_sensitive(false); + } if (listener) { listener->panelChanged(EvGAMMA, wgamma->get_active_text()); @@ -931,6 +939,19 @@ void ICMPanel::applyHueSatMapChanged() } } +void ICMPanel::TRCChanged(double gamm, double slo) +{ + GThreadLock lock; + disableListener(); + setEnabled(true); + gampos->setValue(gamm); + slpos->setValue(slo); + gampos->setDefault(gamm); + slpos->setDefault(slo); + enableListener(); +} + + void ICMPanel::ipChanged() { @@ -980,7 +1001,7 @@ void ICMPanel::GamChanged() if (!batchMode) { onames->set_sensitive(false);//disabled choice - wgamma->set_sensitive(false); + wgamma->set_sensitive(true); gampos->set_sensitive(true); slpos->set_sensitive(true); wprimari->set_sensitive(true); @@ -991,8 +1012,9 @@ void ICMPanel::GamChanged() listener->panelChanged(EvGAMFREE, M("GENERAL_DISABLED")); if (!batchMode) { - onames->set_sensitive(wgamma->get_active_row_number() == 0); - wgamma->set_sensitive(true); + // onames->set_sensitive(wgamma->get_active_row_number() == 0); + onames->set_sensitive(true); + wgamma->set_sensitive(false); gampos->set_sensitive(false); slpos->set_sensitive(false); wprimari->set_sensitive(false); diff --git a/rtgui/icmpanel.h b/rtgui/icmpanel.h index f1640bd0d..cf15f6b72 100644 --- a/rtgui/icmpanel.h +++ b/rtgui/icmpanel.h @@ -36,7 +36,7 @@ public: virtual void saveInputICCReference(Glib::ustring fname, bool apply_wb) {} }; -class ICMPanel : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel +class ICMPanel : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::ICMListener { protected: @@ -130,6 +130,7 @@ public: void applyLookTableChanged(); void applyBaselineExposureOffsetChanged(); void applyHueSatMapChanged(); + void TRCChanged (double gamm, double slo); void setRawMeta(bool raw, const rtengine::FramesData* pMeta); void saveReferencePressed(); diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index de8e28915..62e8ac766 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -515,6 +515,7 @@ void ToolPanelCoordinator::initImage (rtengine::StagedImageProcessor* ipc_, bool ipc->setAutoBWListener (blackwhite); ipc->setFrameCountListener (bayerprocess); ipc->setAutoWBListener (whitebalance); + ipc->setICMListener (icm); ipc->setAutoColorTonListener (colortoning); ipc->setAutoChromaListener (dirpyrdenoise); ipc->setWaveletListener (wavelet);