From 22f9910edb88bf514516a1bd466b77fa64ad1c42 Mon Sep 17 00:00:00 2001 From: jdc Date: Wed, 2 Nov 2011 02:48:15 +0100 Subject: [PATCH] add output gamma to partialpast and suppress crash when no output file #issue1081 --- rtdata/languages/default | 1 + rtengine/iplab2rgb.cc | 4 +-- rtengine/procparams.h | 2 ++ rtengine/simpleprocess.cc | 69 ++++++++++++++++++++---------------- rtgui/addsetids.h | 4 ++- rtgui/batchtoolpanelcoord.cc | 5 +++ rtgui/icmpanel.cc | 63 +++++++++++++++++--------------- rtgui/icmpanel.h | 7 ++-- rtgui/options.cc | 4 ++- rtgui/paramsedited.cc | 11 ++++-- rtgui/partialpastedlg.cc | 22 +++++++++--- rtgui/partialpastedlg.h | 4 ++- rtgui/preferences.cc | 6 ++++ 13 files changed, 129 insertions(+), 73 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index ef9a2b4ac..678425ca7 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -527,6 +527,7 @@ PARTIALPASTE_HLRECOVERY;Highlight recovery PARTIALPASTE_HLRECOVERYTHRESHOLD;Highlight recovery threshold PARTIALPASTE_HSVEQUALIZER;HSV Equalizer PARTIALPASTE_ICMSETTINGS;ICM settings +PARTIALPASTE_ICMGAMMA;Output gamma PARTIALPASTE_IMPULSEDENOISE;Impulse noise reduction PARTIALPASTE_IPTCINFO;IPTC info PARTIALPASTE_LABCURVE;Lab adjustments diff --git a/rtengine/iplab2rgb.cc b/rtengine/iplab2rgb.cc index b8de3a8ff..d7ec3c1e6 100644 --- a/rtengine/iplab2rgb.cc +++ b/rtengine/iplab2rgb.cc @@ -330,7 +330,7 @@ Image16* ImProcFunctions::lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int int t50; int select_temp =1;//5003K double eps=0.000000001;// not divide by zero - //primaries + //primaries for 7 working profiles ==> output profiles if(profi=="ProPhoto") {p1=0.7347; p2=0.2653; p3=0.1596; p4=0.8404; p5=0.0366; p6=0.0001;select_temp=1;}//Prophoto primaries else if (profi=="WideGamut") {p1=0.7350; p2=0.2650; p3=0.1150; p4=0.8260; p5=0.1570; p6=0.0180;select_temp=1;}//Widegamut primaries else if (profi=="Adobe RGB") {p1=0.6400; p2=0.3300; p3=0.2100; p4=0.7100; p5=0.1500; p6=0.0600;select_temp=2;}//Adobe primaries @@ -376,7 +376,7 @@ Image16* ImProcFunctions::lab2rgb16b (LabImage* lab, int cx, int cy, int cw, int // 7 parameters for smoother curves cmsWhitePointFromTemp(&xyD, t50); GammaTRC[0] = GammaTRC[1] = GammaTRC[2] = cmsBuildParametricToneCurve(NULL, 5, Parameters);//5 = more smoother than 4 - cmsHPROFILE oprofdef = cmsCreateRGBProfileTHR(NULL, &xyD, &Primaries, GammaTRC); + cmsHPROFILE oprofdef = cmsCreateRGBProfileTHR(NULL, &xyD, &Primaries, GammaTRC); //oprofdef become Outputprofile cmsFreeToneCurve(GammaTRC[0]); diff --git a/rtengine/procparams.h b/rtengine/procparams.h index c0fcf6720..7a6f5dba9 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -489,6 +489,8 @@ class ProcParams { HRecParams hlrecovery; ///< Highlight recovery parameters ResizeParams resize; ///< Resize parameters ColorManagementParams icm; ///< profiles/color spaces used during the image processing + ColorManagementParams gam; ///< profiles/color spaces used during the image processing + RAWParams raw; ///< RAW parameters before demosaicing DirPyrEqualizerParams dirpyrequalizer; ///< directional pyramid equalizer parameters HSVEqualizerParams hsvequalizer; ///< hsv equalizer parameters diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index b3ccfe5a6..ffb7f83dc 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -33,6 +33,8 @@ namespace rtengine { +extern const Settings* settings; + IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* pl, bool tunnelMetaData) { errorCode = 0; @@ -217,14 +219,48 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p if(params.icm.gamma != "default" || params.icm.freegamma) { // if select gamma output between BT709, sRGB, linear, low, high, 2.2 , 1.8 //or selected Free gamma + Image16* readyImgP; Image16* readyImg = ipf.lab2rgb16b (labView, cx, cy, cw, ch, params.icm.output, params.icm.working, params.icm.gamma, params.icm.freegamma, params.icm.gampos, params.icm.slpos); - + readyImgP=readyImg; delete labView; if (pl) pl->setProgress (0.70); - + int drapeau=0; // get the resize parameters int refw, refh; double tmpScale; + Glib::ustring chpro, outProfile; + int present_space[7]={0,0,0,0,0,0,0}; + std::vector opnames = iccStore->getOutputProfiles (); + //test if files are in system + for (int j=0; j<7;j++) { + // one can modify "option" [Color Management] to adapt name of profile if there are different for windows, MacOS, Linux ?? + if(j==0) chpro=options.rtSettings.prophoto; + else if(j==1) chpro=options.rtSettings.adobe; + else if(j==2) chpro=options.rtSettings.widegamut; + else if(j==3) chpro=options.rtSettings.beta; + else if(j==4) chpro=options.rtSettings.best; + else if(j==5) chpro=options.rtSettings.bruce; + else if(j==6) chpro=options.rtSettings.srgb; + for (int i=0; isetProgressStr ("Missing file..");pl->setProgress (0.0);// display file not present: not very good display information...!! + if (settings->verbose) printf("Missing file: %s \n", chpro.c_str());} //c_str() + } + + // Check that output profiles exist, otherwise use LCMS2 + if (params.icm.working=="ProPhoto" && present_space[0]==1) outProfile=options.rtSettings.prophoto;//in option we can change the name of file - if different... + else if (params.icm.working=="Adobe RGB" && present_space[1]==1) outProfile=options.rtSettings.adobe; + else if (params.icm.working=="WideGamut" && present_space[2]==1) outProfile=options.rtSettings.widegamut; + else if (params.icm.working=="Beta RGB" && present_space[3]==1) outProfile=options.rtSettings.beta; + else if (params.icm.working=="BestRGB" && present_space[4]==1) outProfile=options.rtSettings.best; + else if (params.icm.working=="BruceRGB" && present_space[5]==1) outProfile=options.rtSettings.bruce; + else if (params.icm.working== "sRGB" && present_space[6]==1) outProfile=options.rtSettings.srgb; + //OutProfile become Profile's system + else {if (settings->verbose) printf("No file:%s in system - use LCMS2 substitution\n",params.icm.working.c_str() ); drapeau=1; } + + if (settings->verbose && drapeau==0) printf("Output profile: %s \n", outProfile.c_str()); //c_str() + if (params.resize.enabled) { @@ -293,34 +329,8 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p ProfileContent pc; - Glib::ustring chpro, outProfile; - int present_space[7]={0,0,0,0,0,0,0}; - std::vector opnames = iccStore->getOutputProfiles (); - //test if files are in system - for (int j=0; j<7;j++) { - // one can modify "option" [Color Management] to adapt name of profile if there are different for windows, MacOS, Linux ?? - if(j==0) chpro=options.rtSettings.prophoto; - else if(j==1) chpro=options.rtSettings.adobe; - else if(j==2) chpro=options.rtSettings.widegamut; - else if(j==3) chpro=options.rtSettings.beta; - else if(j==4) chpro=options.rtSettings.best; - else if(j==5) chpro=options.rtSettings.bruce; - else if(j==6) chpro=options.rtSettings.srgb; - for (int i=0; isetProgressStr ("Missing file..");pl->setProgress (0.0);}// display file not present: not very good display information...!! - } - - // Check that output profiles exist, otherwise revert to sRGB - if (params.icm.output=="ProPhoto" && present_space[0]==1) outProfile=options.rtSettings.prophoto; - else if (params.icm.output=="Adobe RGB" && present_space[1]==1) outProfile=options.rtSettings.adobe; - else if (params.icm.output=="WideGamut" && present_space[2]==1) outProfile=options.rtSettings.widegamut; - else if (params.icm.output=="Beta RGB" && present_space[3]==1) outProfile=options.rtSettings.beta; - else if (params.icm.output=="BestRGB" && present_space[4]==1) outProfile=options.rtSettings.best; - else if (params.icm.output=="BruceRGB" && present_space[5]==1) outProfile=options.rtSettings.bruce; - else outProfile=options.rtSettings.srgb; //if not found or choice=srgb - pc = iccStore->getContent (outProfile); + if (drapeau==0) pc = iccStore->getContent (outProfile);// use profile in system (Prophoto.icm, sRGB.icm, etc.) if present, otherwise use LCMS2 profile generate by lab2rgb16b readyImg->setOutputProfile (pc.data, pc.length); @@ -337,7 +347,6 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p } else {//if default mode : profil = selection by choice in list (Prophoto.icm, sRGB.icm, etc., etc.) , gamma = gamma of profile or not selected Free gamma - Image16* readyImg = ipf.lab2rgb16 (labView, cx, cy, cw, ch, params.icm.output); delete labView; if (pl) pl->setProgress (0.70); diff --git a/rtgui/addsetids.h b/rtgui/addsetids.h index 81ccfc974..bcba84ec0 100644 --- a/rtgui/addsetids.h +++ b/rtgui/addsetids.h @@ -50,8 +50,10 @@ #define ADDSET_VIBRANCE_PASTELS 40 #define ADDSET_VIBRANCE_SATURATED 41 #define ADDSET_VIBRANCE_PSTHRESHOLD 42 +#define ADDSET_FREE_OUPUT_GAMMA 43 +#define ADDSET_FREE_OUTPUT_SLOPE 44 // When adding items, make sure to update ADDSET_PARAM_NUM -#define ADDSET_PARAM_NUM 43 // THIS IS USED AS A DELIMITER!! +#define ADDSET_PARAM_NUM 45 // THIS IS USED AS A DELIMITER!! #endif diff --git a/rtgui/batchtoolpanelcoord.cc b/rtgui/batchtoolpanelcoord.cc index 217bed3bb..f82e52e1c 100644 --- a/rtgui/batchtoolpanelcoord.cc +++ b/rtgui/batchtoolpanelcoord.cc @@ -131,6 +131,7 @@ void BatchToolPanelCoordinator::initSession () { sharpening->setAdjusterBehavior (false); sharpenEdge->setAdjusterBehavior (false, false); sharpenMicro->setAdjusterBehavior (false, false); + icm->setAdjusterBehavior (false, false); chmixer->setAdjusterBehavior (false); shadowshighlights->setAdjusterBehavior (false, false, false); @@ -154,6 +155,7 @@ void BatchToolPanelCoordinator::initSession () { sharpening->setAdjusterBehavior (options.baBehav[ADDSET_SHARP_AMOUNT]); sharpenEdge->setAdjusterBehavior (options.baBehav[ADDSET_SHARPENEDGE_AMOUNT],options.baBehav[ADDSET_SHARPENEDGE_PASS]); sharpenMicro->setAdjusterBehavior (options.baBehav[ADDSET_SHARPENMICRO_AMOUNT],options.baBehav[ADDSET_SHARPENMICRO_UNIFORMITY]); + icm->setAdjusterBehavior (options.baBehav[ADDSET_FREE_OUPUT_GAMMA],options.baBehav[ADDSET_FREE_OUTPUT_SLOPE]); chmixer->setAdjusterBehavior (options.baBehav[ADDSET_CHMIXER]); shadowshighlights->setAdjusterBehavior (options.baBehav[ADDSET_SH_HIGHLIGHTS], options.baBehav[ADDSET_SH_SHADOWS], options.baBehav[ADDSET_SH_LOCALCONTRAST]); @@ -194,6 +196,9 @@ void BatchToolPanelCoordinator::initSession () { if (options.baBehav[ADDSET_VIBRANCE_PASTELS]) pparams.vibrance.pastels = 0; if (options.baBehav[ADDSET_VIBRANCE_SATURATED]) pparams.vibrance.saturated = 0; + if (options.baBehav[ADDSET_FREE_OUPUT_GAMMA]) pparams.icm.gampos = 0; + if (options.baBehav[ADDSET_FREE_OUTPUT_SLOPE]) pparams.icm.slpos = 0; + if (options.baBehav[ADDSET_CBOOST_AMOUNT]) pparams.colorBoost.amount = 0; if (options.baBehav[ADDSET_CS_BLUEYELLOW]) pparams.colorShift.a = 0; diff --git a/rtgui/icmpanel.cc b/rtgui/icmpanel.cc index 55f232892..ef3bfdd7b 100644 --- a/rtgui/icmpanel.cc +++ b/rtgui/icmpanel.cc @@ -127,16 +127,16 @@ ICMPanel::ICMPanel () : Gtk::VBox(), FoldableToolPanel(this), iunchanged(NULL), freegamma->set_active (false); pack_start( *freegamma); - g_ampos = Gtk::manage(new Adjuster (M("TP_GAMMA_CURV"),1,3.5,0.01,2.22)); - g_ampos->setAdjusterListener (this); - if (g_ampos->delay < 1000) g_ampos->delay = 1000; - g_ampos->show(); - s_lpos = Gtk::manage(new Adjuster (M("TP_GAMMA_SLOP"),0,15,0.01,4.5)); - s_lpos->setAdjusterListener (this); - if (s_lpos->delay < 1000) s_lpos->delay = 1000; - s_lpos->show(); - pack_start( *g_ampos, Gtk::PACK_SHRINK, 4);//gamma - pack_start( *s_lpos, Gtk::PACK_SHRINK, 4);//slope + gampos = Gtk::manage(new Adjuster (M("TP_GAMMA_CURV"),1,3.5,0.01,2.22)); + gampos->setAdjusterListener (this); + if (gampos->delay < 1000) gampos->delay = 1000; + gampos->show(); + slpos = Gtk::manage(new Adjuster (M("TP_GAMMA_SLOP"),0,15,0.01,4.5)); + slpos->setAdjusterListener (this); + if (slpos->delay < 1000) slpos->delay = 1000; + slpos->show(); + pack_start( *gampos, Gtk::PACK_SHRINK, 4);//gamma + pack_start( *slpos, Gtk::PACK_SHRINK, 4);//slope gamcsconn = freegamma->signal_toggled().connect ( sigc::mem_fun(*this, &ICMPanel::GamChanged)); @@ -243,8 +243,8 @@ void ICMPanel::read (const ProcParams* pp, const ParamsEdited* pedited) { wgamma->set_active_text(M("GENERAL_UNCHANGED")); wgamma->set_active_text(M("GENERAL_UNCHANGED")); } - g_ampos->setEditedState (pedited->icm.gampos ? Edited : UnEdited); - s_lpos->setEditedState (pedited->icm.slpos ? Edited : UnEdited); + gampos->setEditedState (pedited->icm.gampos ? Edited : UnEdited); + slpos->setEditedState (pedited->icm.slpos ? Edited : UnEdited); } @@ -253,8 +253,8 @@ void ICMPanel::read (const ProcParams* pp, const ParamsEdited* pedited) { gamcsconn.block (false); lastgamfree = pp->icm.freegamma; - g_ampos->setValue (pp->icm.gampos); - s_lpos->setValue (pp->icm.slpos); + gampos->setValue (pp->icm.gampos); + slpos->setValue (pp->icm.slpos); ipc.block (false); @@ -290,8 +290,8 @@ void ICMPanel::write (ProcParams* pp, ParamsEdited* pedited) { pp->icm.output = onames->get_active_text(); pp->icm.freegamma = freegamma->get_active(); pp->icm.blendCMSMatrix = ckbBlendCMSMatrix->get_active (); - pp->icm.gampos =(double) g_ampos->getValue(); - pp->icm.slpos =(double) s_lpos->getValue(); + pp->icm.gampos =(double) gampos->getValue(); + pp->icm.slpos =(double) slpos->getValue(); if (pedited) { pedited->icm.input = !iunchanged->get_active (); @@ -300,35 +300,42 @@ void ICMPanel::write (ProcParams* pp, ParamsEdited* pedited) { pedited->icm.blendCMSMatrix = !ckbBlendCMSMatrix->get_inconsistent (); pedited->icm.gamma = wgamma->get_active_text()!=M("GENERAL_UNCHANGED"); pedited->icm.freegamma =!freegamma->get_inconsistent(); - pedited->icm.gampos = g_ampos->getEditedState (); - pedited->icm.slpos = s_lpos->getEditedState (); + pedited->icm.gampos = gampos->getEditedState (); + pedited->icm.slpos = slpos->getEditedState (); } } void ICMPanel::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) { - g_ampos->setDefault (defParams->icm.gampos); - s_lpos->setDefault (defParams->icm.slpos); + gampos->setDefault (defParams->icm.gampos); + slpos->setDefault (defParams->icm.slpos); if (pedited) { - g_ampos->setDefaultEditedState (pedited->icm.gampos ? Edited : UnEdited); - s_lpos->setDefaultEditedState (pedited->icm.slpos ? Edited : UnEdited); + gampos->setDefaultEditedState (pedited->icm.gampos ? Edited : UnEdited); + slpos->setDefaultEditedState (pedited->icm.slpos ? Edited : UnEdited); } else { - g_ampos->setDefaultEditedState (Irrelevant); - s_lpos->setDefaultEditedState (Irrelevant); + gampos->setDefaultEditedState (Irrelevant); + slpos->setDefaultEditedState (Irrelevant); } } + + void ICMPanel::setAdjusterBehavior (bool gammaadd, bool slopeadd) { + gampos->setAddMode (gammaadd); + slpos->setAddMode (slopeadd); +} + + void ICMPanel::adjusterChanged (Adjuster* a, double newval) { if (listener && freegamma->get_active()) { Glib::ustring costr = Glib::ustring::format ((int)a->getValue()); - if (a==g_ampos) + if (a==gampos) listener->panelChanged (EvGAMPOS, costr); - else if (a==s_lpos) + else if (a==slpos) listener->panelChanged (EvSLPOS, costr); } @@ -468,8 +475,8 @@ void ICMPanel::setBatchMode (bool batchMode) { onames->append_text (M("GENERAL_UNCHANGED")); wnames->append_text (M("GENERAL_UNCHANGED")); wgamma->append_text (M("GENERAL_UNCHANGED")); - g_ampos->showEditedCB (); - s_lpos->showEditedCB (); + gampos->showEditedCB (); + slpos->showEditedCB (); } diff --git a/rtgui/icmpanel.h b/rtgui/icmpanel.h index 055e59f41..49fecea8d 100644 --- a/rtgui/icmpanel.h +++ b/rtgui/icmpanel.h @@ -35,8 +35,8 @@ class ICMPanelListener { class ICMPanel : public Gtk::VBox, public AdjusterListener, public FoldableToolPanel { protected: - Adjuster* g_ampos; - Adjuster* s_lpos; + Adjuster* gampos; + Adjuster* slpos; bool lastgamfree; sigc::connection gamcsconn; //bool freegamma; @@ -74,7 +74,8 @@ class ICMPanel : public Gtk::VBox, public AdjusterListener, public FoldableToolP void setBatchMode (bool batchMode); void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited=NULL); void adjusterChanged (Adjuster* a, double newval); - + void setAdjusterBehavior (bool gammaadd, bool slopeadd); + void wpChanged (); void opChanged (); void ipChanged (); diff --git a/rtgui/options.cc b/rtgui/options.cc index 0ced9d81b..f9fa54250 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -212,7 +212,9 @@ void Options::setDefaults () { 0, // ADDSET_SHARPENMICRO_UNIFORMITY 1, // ADDSET_VIBRANCE_PASTELS 1, // ADDSET_VIBRANCE_SATURATED - 0 // ADDSET_VIBRANCE_SATURATED + 0, // ADDSET_VIBRANCE_PSTHRESHOLD + 0, // ADDSET_FREE_OUPUT_GAMMA + 0, // ADDSET_FREE_OUTPUT_SLOPE }; baBehav = std::vector (babehav, babehav+ADDSET_PARAM_NUM); diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 9c9b8c908..d99ae2307 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -431,6 +431,11 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (vibrance.protectskins) toEdit.vibrance.protectskins = mods.vibrance.protectskins; if (vibrance.avoidcolorshift) toEdit.vibrance.avoidcolorshift = mods.vibrance.avoidcolorshift; if (vibrance.pastsattog) toEdit.vibrance.pastsattog = mods.vibrance.pastsattog; + + + + + if (colorBoost.amount) toEdit.colorBoost.amount = dontforceSet && options.baBehav[ADDSET_CBOOST_AMOUNT] ? toEdit.colorBoost.amount + mods.colorBoost.amount : mods.colorBoost.amount; if (colorBoost.avoidclip) toEdit.colorBoost.avoidclip = mods.colorBoost.avoidclip; if (colorBoost.enable_saturationlimiter)toEdit.colorBoost.enable_saturationlimiter = mods.colorBoost.enable_saturationlimiter; @@ -509,8 +514,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (icm.blendCMSMatrix) toEdit.icm.blendCMSMatrix = mods.icm.blendCMSMatrix; if (icm.working) toEdit.icm.working = mods.icm.working; if (icm.output) toEdit.icm.output = mods.icm.output; - if (icm.gampos) toEdit.icm.gampos = mods.icm.gampos; - if (icm.slpos) toEdit.icm.slpos = mods.icm.slpos; + //if (icm.gampos) toEdit.icm.gampos = mods.icm.gampos; + //if (icm.slpos) toEdit.icm.slpos = mods.icm.slpos; + if (icm.gampos) toEdit.icm.gampos = dontforceSet && options.baBehav[ADDSET_FREE_OUPUT_GAMMA] ? toEdit.icm.gampos + mods.icm.gampos : mods.icm.gampos; + if (icm.slpos) toEdit.icm.slpos = dontforceSet && options.baBehav[ADDSET_FREE_OUTPUT_SLOPE] ? toEdit.icm.slpos + mods.icm.slpos : mods.icm.slpos; if (icm.gamma) toEdit.icm.gamma = mods.icm.gamma; if (icm.freegamma) toEdit.icm.freegamma = mods.icm.freegamma; if (raw.ccSteps) toEdit.raw.ccSteps = mods.raw.ccSteps; diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index 6c3354126..76e178076 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -62,7 +62,7 @@ PartialPasteDlg::PartialPasteDlg () { chmixer = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_CHANNELMIXER"))); dirpyrden = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DIRPYRDENOISE"))); hsveq = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_HSVEQUALIZER"))); - + // options in lens: distortion = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_DISTORTION"))); cacorr = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_CACORRECTION"))); @@ -80,6 +80,7 @@ PartialPasteDlg::PartialPasteDlg () { exifch = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_EXIFCHANGES"))); iptc = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_IPTCINFO"))); icm = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_ICMSETTINGS"))); + gam = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_ICMGAMMA"))); // options in raw: raw_expos = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAWEXPOS_LINEAR"))); @@ -158,6 +159,7 @@ PartialPasteDlg::PartialPasteDlg () { vboxes[5]->pack_start (*exifch, Gtk::PACK_SHRINK, 2); vboxes[5]->pack_start (*iptc, Gtk::PACK_SHRINK, 2); vboxes[5]->pack_start (*icm, Gtk::PACK_SHRINK, 2); + vboxes[5]->pack_start (*gam, Gtk::PACK_SHRINK, 2); vboxes[6]->pack_start (*raw, Gtk::PACK_SHRINK, 2); vboxes[6]->pack_start (*hseps[6], Gtk::PACK_SHRINK, 2); @@ -247,7 +249,7 @@ PartialPasteDlg::PartialPasteDlg () { vibranceConn = vibrance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); chmixerConn = chmixer->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); hsveqConn = hsveq->signal_toggled().connect (sigc::bind (sigc::mem_fun(*color, &Gtk::CheckButton::set_inconsistent), true)); - + distortionConn = distortion->signal_toggled().connect (sigc::bind (sigc::mem_fun(*lens, &Gtk::CheckButton::set_inconsistent), true)); cacorrConn = cacorr->signal_toggled().connect (sigc::bind (sigc::mem_fun(*lens, &Gtk::CheckButton::set_inconsistent), true)); vignettingConn = vignetting->signal_toggled().connect (sigc::bind (sigc::mem_fun(*lens, &Gtk::CheckButton::set_inconsistent), true)); @@ -262,6 +264,7 @@ PartialPasteDlg::PartialPasteDlg () { exifchConn = exifch->signal_toggled().connect (sigc::bind (sigc::mem_fun(*metaicm, &Gtk::CheckButton::set_inconsistent), true)); iptcConn = iptc->signal_toggled().connect (sigc::bind (sigc::mem_fun(*metaicm, &Gtk::CheckButton::set_inconsistent), true)); icmConn = icm->signal_toggled().connect (sigc::bind (sigc::mem_fun(*metaicm, &Gtk::CheckButton::set_inconsistent), true)); + gamcsconn = gam->signal_toggled().connect (sigc::bind (sigc::mem_fun(*metaicm, &Gtk::CheckButton::set_inconsistent), true)); raw_dmethodConn = raw_dmethod->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_ccStepsConn = raw_ccSteps->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); @@ -459,16 +462,19 @@ void PartialPasteDlg::colorToggled () { vibranceConn.block (true); chmixerConn.block (true); hsveqConn.block (true); - + gamcsconn.block (true); color->set_inconsistent (false); vibrance->set_active (color->get_active ()); chmixer->set_active (color->get_active ()); hsveq->set_active (color->get_active ()); - + icm->set_active (color->get_active ()); + vibranceConn.block (false); chmixerConn.block (false); hsveqConn.block (false); + gamcsconn.block (false); + } void PartialPasteDlg::lensToggled () { @@ -519,16 +525,19 @@ void PartialPasteDlg::metaicmToggled () { exifchConn.block (true); iptcConn.block (true); icmConn.block (true); - + gamcsconn.block (true); metaicm->set_inconsistent (false); exifch->set_active (metaicm->get_active ()); iptc->set_active (metaicm->get_active ()); icm->set_active (metaicm->get_active ()); + gam->set_active (metaicm->get_active ()); exifchConn.block (false); iptcConn.block (false); icmConn.block (false); + gamcsconn.block (false); + } @@ -551,6 +560,8 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dst, const r if (vibrance->get_active ()) dst->vibrance = src->vibrance; if (chmixer->get_active ()) dst->chmixer = src->chmixer; if (hsveq->get_active ()) dst->hsvequalizer = src->hsvequalizer; + if (icm->get_active ()) dst->icm = src->icm; + if (distortion->get_active ()) dst->distortion = src->distortion; if (cacorr->get_active ()) dst->cacorrection = src->cacorrection; if (vignetting->get_active ()) dst->vignetting = src->vignetting; @@ -565,6 +576,7 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dst, const r if (exifch->get_active ()) dst->exif = src->exif; if (iptc->get_active ()) dst->iptc = src->iptc; if (icm->get_active ()) dst->icm = src->icm; + if (gam->get_active ()) dst->gam = src->gam; if (raw_dmethod->get_active ()) dst->raw.dmethod =src->raw.dmethod; if (raw_ccSteps->get_active ()) dst->raw.ccSteps =src->raw.ccSteps; diff --git a/rtgui/partialpastedlg.h b/rtgui/partialpastedlg.h index b200fa35e..b2e30f7e3 100644 --- a/rtgui/partialpastedlg.h +++ b/rtgui/partialpastedlg.h @@ -58,6 +58,7 @@ class PartialPasteDlg : public Gtk::Dialog { Gtk::CheckButton* vibrance; Gtk::CheckButton* chmixer; Gtk::CheckButton* hsveq; + // Gtk::CheckButton* icm; // options in lens: Gtk::CheckButton* distortion; @@ -76,6 +77,7 @@ class PartialPasteDlg : public Gtk::Dialog { Gtk::CheckButton* exifch; Gtk::CheckButton* iptc; Gtk::CheckButton* icm; + Gtk::CheckButton* gam; // options in raw: Gtk::CheckButton* raw_expos; @@ -107,7 +109,7 @@ class PartialPasteDlg : public Gtk::Dialog { sigc::connection vibranceConn, chmixerConn, hsveqConn; sigc::connection distortionConn, cacorrConn, vignettingConn; sigc::connection coarserotConn, finerotConn, cropConn, resizeConn, perspectiveConn, commonTransConn; - sigc::connection exifchConn, iptcConn, icmConn; + sigc::connection exifchConn, iptcConn, icmConn, gamcsconn; sigc::connection df_fileConn, df_AutoSelectConn, ff_fileConn, ff_AutoSelectConn, ff_BlurRadiusConn, ff_BlurTypeConn; sigc::connection raw_caredConn, raw_cablueConn, raw_ca_autocorrectConn, raw_hotdeadpix_filtConn, raw_linenoiseConn, raw_greenthreshConn, raw_ccStepsConn, raw_dmethodConn, raw_dcb_iterationsConn, raw_all_enhanceConn, raw_dcb_enhanceConn, raw_exposConn, raw_preserConn, raw_blackConn; diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index a055dfe3e..576ad0c1e 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -195,6 +195,12 @@ Gtk::Widget* Preferences::getBatchProcPanel () { appendBehavList (mi, M("TP_VIBRANCE_SATURATED"), ADDSET_VIBRANCE_SATURATED, false); appendBehavList (mi, M("TP_VIBRANCE_PSTHRESHOLD"), ADDSET_VIBRANCE_PSTHRESHOLD, false); + mi = behModel->append (); + mi->set_value (behavColumns.label, M("TP_GAMMA_OUTPUT")); + appendBehavList (mi, M("TP_GAMMA_CURV"), ADDSET_FREE_OUPUT_GAMMA, false); + appendBehavList (mi, M("TP_GAMMA_SLOP"), ADDSET_FREE_OUTPUT_SLOPE, false); + + mi = behModel->append (); mi->set_value (behavColumns.label, M("TP_CHMIXER_LABEL")); appendBehavList (mi, M("TP_CHMIXER_RED")+", "+M("TP_CHMIXER_GREEN")+", "+M("TP_CHMIXER_BLUE"), ADDSET_CHMIXER, false);