diff --git a/rtdata/languages/default b/rtdata/languages/default index b3df9c5c8..9ee60ab9b 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -644,6 +644,8 @@ HISTORY_MSG_411;Dehaze strength HISTORY_MSG_412;Dehaze scales HISTORY_MSG_413;Dehaze var HISTORY_MSG_414;Dehaze histogram +HISTORY_MSG_415;Dehaze enabled +HISTORY_MSG_416;Dehaze transmission HISTORY_NEWSNAPSHOT;Add HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s HISTORY_SNAPSHOTS;Snapshots @@ -1547,15 +1549,29 @@ TP_LABCURVE_LCREDSK;Restrict LC to red and skin-tones TP_LABCURVE_LCREDSK_TIP;If enabled, the LC Curve affects only red and skin-tones.\nIf disabled, it applies to all tones. TP_LABCURVE_RSTPROTECTION;Red and skin-tones protection TP_LABCURVE_RSTPRO_TOOLTIP;Works on the Chromaticity slider and the CC curve. -TP_LABCURVE_STR;Strength -TP_LABCURVE_SCAL;Scales -TP_LABCURVE_NEIGH;Neighboring pixels -TP_LABCURVE_GAIN;Gain -TP_LABCURVE_OFFS;Offset +TP_DEHAZ_STR;Strength +TP_DEHAZ_STR_TOOLTIP;Mixture in proportion to the original image and that obtained by Retinex algoritm +TP_DEHAZ_RETIN;Complete Retinex algoritm +TP_DEHAZ_LAB;Retinex +TP_DEHAZ_LAB_TOOLTIP;Use all component of Retinex algorihm, to improve results +TP_DEHAZ_LABEL;Dehaze +TP_DEHAZ_SCAL;Scales +TP_DEHAZ_SCAL_TOOLTIP;Low scales increase contrast but give relief effect\nHigh scales can increase noise, but give more natural images +TP_DEHAZ_NEIGH;Neighboring pixels +TP_DEHAZ_NEIGH_TOOLTIP;Take into account, neighboring pixels, by Gauss function +TP_DEHAZ_GAIN;Gain +TP_DEHAZ_OFFS;Offset +TP_DEHAZ_GAIN_TOOLTIP;Acts on the transmission in combination with offset, this is very different from others settings\nUsed for black or white pixels, and for better balance the histogram TP_DEHAZE_LAB;Dehaze +TP_DEHAZ_CONTEDIT;Histogram equalizer +TP_DEHAZ_CURVEEDITOR_CD;L=f(L) +TP_DEHAZ_CURVEEDITOR_CD_TOOLTIP;Correct Raw data, to reduce halos and artifacts +TP_DEHAZ_TRANSMISSION;Transmission map TP_DEHAZE_LAB_TOOLTIP;Use Retinex algorithm (Lab) to improve dehaze..defog... -TP_LABCURVE_VART;Variance +TP_DEHAZ_VART;Variance +TP_DEHAZ_VART_TOOLTIP;Low variance increase local contrast and saturation, but can leeds to artifacts TP_DEHAZE_MET;Dehaze method +TP_DEHAZ_MET_TOOLTIP;Low :reinforce low light\nUniform :expect to equalize action\nHigh : reinforce high light TP_DEHAZ_NONE;None TP_DEHAZ_UNI;Uniform TP_DEHAZ_LOW;Low diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index 277794a54..0d7c32b52 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -69,12 +69,12 @@ public: virtual int load (Glib::ustring fname, bool batch = false) = 0; virtual void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse) {}; virtual void demosaic (const RAWParams &raw) {}; - virtual void dehaz (RAWParams raw, ColorManagementParams cmp, LCurveParams lcur, LUTf & cdcurve, bool dehacontlutili) {}; + virtual void dehaz (RAWParams raw, ColorManagementParams cmp, DehazParams lcur, LUTf & cdcurve, bool dehacontlutili) {}; virtual void flushRawData () {}; virtual void flushRGB () {}; virtual void HLRecovery_Global (ToneCurveParams hrp) {}; virtual void HLRecovery_inpaint (float** red, float** green, float** blue) {}; - virtual void MSR(LabImage* lab, int width, int height, int skip, LCurveParams lcur) {}; + virtual void MSR(LabImage* lab, int width, int height, int skip, DehazParams lcur) {}; virtual bool IsrgbSourceModified() = 0; // tracks whether cached rgb output of demosaic has been modified // virtual void MSR(LabImage* lab, int width, int height, int skip, const LCurveParams &lcur); diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 00e973e37..fdcb8bf27 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -208,6 +208,12 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) OR HLR gets disabled when Color method was selected */ // If high detail (=100%) is newly selected, do a demosaic update, since the last was just with FAST + + //I forced dehazmet with toneCurve.hrenabled=true==> probably another way ?? + + bool hrdehaz=false; + if(!params.toneCurve.hrenabled) if(params.dehaz.enabled) {hrdehaz=true; params.toneCurve.hrenabled=true;} + if ( (todo & M_RAW) || (!highDetailRawComputed && highDetailNeeded) || ( params.toneCurve.hrenabled && params.toneCurve.method != "Color" && imgsrc->IsrgbSourceModified()) @@ -235,13 +241,16 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) } } bool dehacontlutili=false; - CurveFactory::curveDehaContL (dehacontlutili, params.labCurve.cdcurve, cdcurve, 1); + CurveFactory::curveDehaContL (dehacontlutili, params.dehaz.cdcurve, cdcurve, 1); - if (todo & M_INIT || params.labCurve.dehazmet!="none"){ - if(params.labCurve.dehazmet!="none") - imgsrc->dehaz( params.raw, params.icm, params.labCurve, cdcurve, dehacontlutili);//enabled Dehaze + if (todo & M_INIT || params.dehaz.enabled){ + if(params.dehaz.enabled) + imgsrc->dehaz( params.raw, params.icm, params.dehaz, cdcurve, dehacontlutili);//enabled Dehaze } + if(hrdehaz==true) params.toneCurve.hrenabled=false; + + // Updating toneCurve.hrenabled if necessary // It has to be done there, because the next 'if' statement will use the value computed here if (todo & M_AUTOEXP) { diff --git a/rtengine/ipdehaz.cc b/rtengine/ipdehaz.cc index 10f2a0e4a..230d51bf7 100644 --- a/rtengine/ipdehaz.cc +++ b/rtengine/ipdehaz.cc @@ -100,7 +100,7 @@ void mean_stddv( float **dst, float &mean, float &stddv, int W_L, int H_L ) -void RawImageSource::MSR(LabImage* lab, int width, int height, int skip, LCurveParams lcur) +void RawImageSource::MSR(LabImage* lab, int width, int height, int skip, DehazParams lcur) { StopWatch Stop1("MSR"); @@ -120,11 +120,11 @@ StopWatch Stop1("MSR"); float vart = (float)lcur.vart;//variance vart /=100.f; int modedehaz; - if(lcur.dehazmet=="none") modedehaz=-1;//enabled disabled if(lcur.dehazmet=="uni") modedehaz=0; if(lcur.dehazmet=="low") modedehaz=1; if(lcur.dehazmet=="high") modedehaz=2; - if (modedehaz !=-1) {//enabled + // if (modedehaz !=-1) {//enabled + if (lcur.enabled) {//enabled int H_L=height; int W_L=width; diff --git a/rtengine/previewimage.cc b/rtengine/previewimage.cc index 1e0f15593..d68ce3229 100644 --- a/rtengine/previewimage.cc +++ b/rtengine/previewimage.cc @@ -140,7 +140,7 @@ PreviewImage::PreviewImage (const Glib::ustring &fname, const Glib::ustring &ext params.raw.xtranssensor.method = RAWParams::XTransSensor::methodstring[RAWParams::XTransSensor::fast]; rawImage.preprocess(params.raw, params.lensProf, params.coarse); rawImage.demosaic(params.raw); - // rawImage.dehaz(params.raw, params.icm, params.labCurve, cdcurve, dehacontlutili); + rawImage.dehaz(params.raw, params.icm, params.dehaz, cdcurve, dehacontlutili); Imagefloat* image = new rtengine::Imagefloat (fw, fh); rawImage.getImage (wb, TR_NONE, image, pp, params.toneCurve, params.icm, params.raw); output = new Image8(fw, fh); diff --git a/rtengine/procevents.h b/rtengine/procevents.h index 8d9693d28..0c890d11d 100644 --- a/rtengine/procevents.h +++ b/rtengine/procevents.h @@ -439,7 +439,11 @@ enum ProcEvent { EvLstr = 410, EvLscal = 411, EvLvart = 412, - EvLCDCurve = 413, + EvLCDCurve = 413, + EvDehaztransmission = 414, + EvDehazEnabled = 415, + EvDehazretinex = 416, + NUMOFEVENTS }; } diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index cf8d34b15..58668db0d 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -116,6 +116,65 @@ void CropParams::mapToResized(int resizedWidth, int resizedHeight, int scale, in } } +DehazParams::DehazParams () +{ + setDefaults (); +} + +void DehazParams::getDefaulttransmissionCurve(std::vector &curve) +{ + double v[16] = { 0.00, 0.3, 0.35, 0.00, + 0.25, 0.5, 0.35, 0.35, + 0.70, 0.5, 0.35, 0.35, + 1.00, 0.7, 0.00, 0.00 + }; + curve.resize(17); + curve.at(0 ) = double(FCT_MinMaxCPoints); + + for (size_t i = 1; i < curve.size(); ++i) { + curve.at(i) = v[i - 1]; + } +} + +void DehazParams::getDefaultCDCurve(std::vector &curve) +{ + double v[12] = { 0.00, 0.00, + 0.185, 0., + 0.235, 0.25, + 0.5, 0.5, + 0.8, 0.8, + 1.0, 1.0, + }; + + curve.resize(13); + curve.at(0) = double(DCT_NURBS); + + for (size_t i = 1; i < curve.size(); ++i) { + curve.at(i) = v[i - 1]; + } +} + +void DehazParams::setDefaults() +{ + enabled = false; + str = 60; + scal = 3; + neigh = 80; + gain = 100; + offs = 0; + vart = 125; + getDefaulttransmissionCurve(transmissionCurve); + getDefaultCDCurve(cdcurve); + dehazmet = "uni"; + retinex = false; +} + +//void DehazParams::getCurves(transmissionCurve &transmissionCurveLUT) const +//{ + // opacityCurveLUT.Set(this->opacityCurve); +//} + + ColorToningParams::ColorToningParams () : hlColSat(60, 80, false), shadowsColSat(80, 208, false) { setDefaults(); @@ -882,12 +941,6 @@ void ProcParams::setDefaults () labCurve.brightness = 0; labCurve.contrast = 0; labCurve.chromaticity = 0; - labCurve.str = 60; - labCurve.scal = 3; - labCurve.neigh = 80; - labCurve.gain = 100; - labCurve.offs = 0; - labCurve.vart = 125; labCurve.avoidcolorshift = false; labCurve.lcredsk = true; labCurve.rstprotection = 0; @@ -905,14 +958,11 @@ void ProcParams::setDefaults () labCurve.lhcurve.push_back(FCT_Linear); labCurve.hhcurve.clear (); labCurve.hhcurve.push_back(FCT_Linear); - labCurve.dehazmet = "none"; labCurve.lccurve.clear (); labCurve.lccurve.push_back(DCT_Linear); labCurve.clcurve.clear (); labCurve.clcurve.push_back(DCT_Linear); - labCurve.cdcurve.clear (); - labCurve.cdcurve.push_back(DCT_Linear); rgbCurves.lumamode = false; rgbCurves.rcurve.clear (); @@ -1387,6 +1437,49 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol keyFile.set_double_list("Exposure", "Curve2", tcurve); } + //save dehaz + + if (!pedited || pedited->dehaz.str) { + keyFile.set_integer ("Dehaz", "Str", dehaz.str); + } + if (!pedited || pedited->dehaz.scal) { + keyFile.set_integer ("Dehaz", "Scal", dehaz.scal); + } + if (!pedited || pedited->dehaz.enabled) { + keyFile.set_boolean ("Dehaz", "Enabled", dehaz.enabled); + } + + if (!pedited || pedited->dehaz.retinex) { + keyFile.set_boolean ("Dehaz", "Retinex", dehaz.retinex); + } + + if (!pedited || pedited->dehaz.neigh) { + keyFile.set_integer ("Dehaz", "Neigh", dehaz.neigh); + } + if (!pedited || pedited->dehaz.gain) { + keyFile.set_integer ("Dehaz", "Gain", dehaz.gain); + } + if (!pedited || pedited->dehaz.offs) { + keyFile.set_integer ("Dehaz","Offs", dehaz.offs); + } + if (!pedited || pedited->dehaz.vart) { + keyFile.set_integer ("Dehaz","Vart", dehaz.vart); + } + + if (!pedited || pedited->dehaz.dehazmet) { + keyFile.set_string ("Dehaz", "Dehazmet",dehaz.dehazmet); + } + + if (!pedited || pedited->dehaz.cdcurve) { + Glib::ArrayHandle cdcurve = dehaz.cdcurve; + keyFile.set_double_list("Dehaz", "CDCurve", cdcurve); + } + + if (!pedited || pedited->dehaz.transmissionCurve) { + Glib::ArrayHandle transmissionCurve = dehaz.transmissionCurve; + keyFile.set_double_list("Dehaz", "TransmissionCurve", transmissionCurve); + } + // save channel mixer if (!pedited || pedited->chmixer.red[0] || pedited->chmixer.red[1] || pedited->chmixer.red[2]) { Glib::ArrayHandle rmix (chmixer.red, 3, Glib::OWNERSHIP_NONE); @@ -1546,25 +1639,6 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol if (!pedited || pedited->labCurve.chromaticity) { keyFile.set_integer ("Luminance Curve", "Chromaticity", labCurve.chromaticity); } - if (!pedited || pedited->labCurve.str) { - keyFile.set_integer ("Luminance Curve", "Str", labCurve.str); - } - if (!pedited || pedited->labCurve.scal) { - keyFile.set_integer ("Luminance Curve", "Scal", labCurve.scal); - } - - if (!pedited || pedited->labCurve.neigh) { - keyFile.set_integer ("Luminance Curve", "Neigh", labCurve.neigh); - } - if (!pedited || pedited->labCurve.gain) { - keyFile.set_integer ("Luminance Curve", "Gain", labCurve.gain); - } - if (!pedited || pedited->labCurve.offs) { - keyFile.set_integer ("Luminance Curve","Offs", labCurve.offs); - } - if (!pedited || pedited->labCurve.vart) { - keyFile.set_integer ("Luminance Curve","Vart", labCurve.vart); - } if (!pedited || pedited->labCurve.avoidcolorshift) { keyFile.set_boolean ("Luminance Curve", "AvoidColorShift", labCurve.avoidcolorshift); @@ -1617,20 +1691,11 @@ int ProcParams::save (Glib::ustring fname, Glib::ustring fname2, bool fnameAbsol Glib::ArrayHandle lccurve = labCurve.lccurve; keyFile.set_double_list("Luminance Curve", "LcCurve", lccurve); } - if (!pedited || pedited->labCurve.dehazmet) { - keyFile.set_string ("Luminance Curve", "Dehazmet",labCurve.dehazmet); - } - if (!pedited || pedited->labCurve.clcurve) { Glib::ArrayHandle clcurve = labCurve.clcurve; keyFile.set_double_list("Luminance Curve", "ClCurve", clcurve); } - if (!pedited || pedited->labCurve.cdcurve) { - Glib::ArrayHandle cdcurve = labCurve.cdcurve; - keyFile.set_double_list("Luminance Curve", "CDCurve", cdcurve); - } - // save sharpening if (!pedited || pedited->sharpening.enabled) { keyFile.set_boolean ("Sharpening", "Enabled", sharpening.enabled); @@ -3671,7 +3736,92 @@ int ProcParams::load (Glib::ustring fname, ParamsEdited* pedited) } } } + //load dehaz + if (keyFile.has_group ("Dehaz")) { + + if (keyFile.has_key ("Dehaz", "Retinex")) { + dehaz.retinex = keyFile.get_boolean ("Dehaz", "Retinex"); + if (pedited) { + pedited->dehaz.retinex = true; + } + } + + if (keyFile.has_key ("Dehaz", "Dehazmet")) { + dehaz.dehazmet = keyFile.get_string ("Dehaz", "Dehazmet"); + + if (pedited) { + pedited->dehaz.dehazmet = true; + } + } + if (keyFile.has_key ("Dehaz", "Enabled")) { + dehaz.enabled = keyFile.get_boolean ("Dehaz", "Enabled"); + if (pedited) { + pedited->dehaz.enabled = true; + } + } + + if (keyFile.has_key ("Dehaz", "Neigh")) { + dehaz.neigh = keyFile.get_integer ("Dehaz", "Neigh"); + + if (pedited) { + pedited->dehaz.neigh = true; + } + } + if (keyFile.has_key ("Dehaz", "Str")) { + dehaz.str = keyFile.get_integer ("Dehaz", "Str"); + + if (pedited) { + pedited->dehaz.str = true; + } + } + if (keyFile.has_key ("Dehaz", "Scal")) { + dehaz.scal = keyFile.get_integer ("Dehaz", "Scal"); + + if (pedited) { + pedited->dehaz.scal = true; + } + } + + if (keyFile.has_key ("Dehaz", "Gain")) { + dehaz.gain = keyFile.get_integer ("Dehaz", "Gain"); + + if (pedited) { + pedited->dehaz.gain = true; + } + } + if (keyFile.has_key ("Dehaz", "Offs")) { + dehaz.offs = keyFile.get_integer ("Dehaz", "Offs"); + + if (pedited) { + pedited->dehaz.offs = true; + } + } + if (keyFile.has_key ("Dehaz", "Vart")) { + dehaz.vart = keyFile.get_integer ("Dehaz", "Vart"); + + if (pedited) { + pedited->dehaz.vart = true; + } + } + + if (keyFile.has_key ("Dehaz", "CDCurve")) { + dehaz.cdcurve = keyFile.get_double_list ("Dehaz", "CDCurve"); + + if (pedited) { + pedited->dehaz.cdcurve = true; + } + } + if (keyFile.has_key ("Dehaz", "TransmissionCurve")) { + dehaz.transmissionCurve = keyFile.get_double_list ("Dehaz", "TransmissionCurve"); + + if (pedited) { + pedited->dehaz.transmissionCurve = true; + } + } + } + + // load luma curve if (keyFile.has_group ("Luminance Curve")) { if (keyFile.has_key ("Luminance Curve", "Brightness")) { @@ -3689,50 +3839,6 @@ int ProcParams::load (Glib::ustring fname, ParamsEdited* pedited) pedited->labCurve.contrast = true; } } - if (keyFile.has_key ("Luminance Curve", "Neigh")) { - labCurve.neigh = keyFile.get_integer ("Luminance Curve", "Neigh"); - - if (pedited) { - pedited->labCurve.neigh = true; - } - } - if (keyFile.has_key ("Luminance Curve", "Str")) { - labCurve.str = keyFile.get_integer ("Luminance Curve", "Str"); - - if (pedited) { - pedited->labCurve.str = true; - } - } - if (keyFile.has_key ("Luminance Curve", "Scal")) { - labCurve.scal = keyFile.get_integer ("Luminance Curve", "Scal"); - - if (pedited) { - pedited->labCurve.scal = true; - } - } - - if (keyFile.has_key ("Luminance Curve", "Gain")) { - labCurve.gain = keyFile.get_integer ("Luminance Curve", "Gain"); - - if (pedited) { - pedited->labCurve.gain = true; - } - } - if (keyFile.has_key ("Luminance Curve", "Offs")) { - labCurve.offs = keyFile.get_integer ("Luminance Curve", "Offs"); - - if (pedited) { - pedited->labCurve.offs = true; - } - } - if (keyFile.has_key ("Luminance Curve", "Vart")) { - labCurve.vart = keyFile.get_integer ("Luminance Curve", "Vart"); - - if (pedited) { - pedited->labCurve.vart = true; - } - } - if (ppVersion < 303) { // transform Saturation into Chromaticity // if Saturation == 0, should we set BWToning on? @@ -3847,14 +3953,6 @@ int ProcParams::load (Glib::ustring fname, ParamsEdited* pedited) pedited->labCurve.lhcurve = true; } } - if (keyFile.has_key ("Luminance Curve", "Dehazmet")) { - labCurve.dehazmet = keyFile.get_string ("Luminance Curve", "Dehazmet"); - - if (pedited) { - pedited->labCurve.dehazmet = true; - } - } - if (keyFile.has_key ("Luminance Curve", "hhCurve")) { labCurve.hhcurve = keyFile.get_double_list ("Luminance Curve", "hhCurve"); @@ -3879,14 +3977,6 @@ int ProcParams::load (Glib::ustring fname, ParamsEdited* pedited) } } - if (keyFile.has_key ("Luminance Curve", "CDCurve")) { - labCurve.cdcurve = keyFile.get_double_list ("Luminance Curve", "CDCurve"); - - if (pedited) { - pedited->labCurve.cdcurve = true; - } - } - } // load sharpening @@ -7089,6 +7179,17 @@ bool ProcParams::operator== (const ProcParams& other) && toneCurve.curveMode2 == other.toneCurve.curveMode2 && toneCurve.hrenabled == other.toneCurve.hrenabled && toneCurve.method == other.toneCurve.method + && dehaz.cdcurve == other.dehaz.cdcurve + && dehaz.transmissionCurve == other.dehaz.transmissionCurve + && dehaz.str == other.dehaz.str + && dehaz.scal == other.dehaz.scal + && dehaz.neigh == other.dehaz.neigh + && dehaz.gain == other.dehaz.gain + && dehaz.offs == other.dehaz.offs + && dehaz.dehazmet == other.dehaz.dehazmet + && dehaz.vart == other.dehaz.vart + && dehaz.enabled == other.dehaz.enabled + && dehaz.retinex == other.dehaz.retinex && labCurve.lcurve == other.labCurve.lcurve && labCurve.acurve == other.labCurve.acurve && labCurve.bcurve == other.labCurve.bcurve @@ -7098,15 +7199,6 @@ bool ProcParams::operator== (const ProcParams& other) && labCurve.hhcurve == other.labCurve.hhcurve && labCurve.lccurve == other.labCurve.lccurve && labCurve.clcurve == other.labCurve.clcurve - && labCurve.cdcurve == other.labCurve.cdcurve - && labCurve.str == other.labCurve.str - && labCurve.scal == other.labCurve.scal - && labCurve.neigh == other.labCurve.neigh - && labCurve.gain == other.labCurve.gain - && labCurve.offs == other.labCurve.offs - && labCurve.dehazmet == other.labCurve.dehazmet - && labCurve.vart == other.labCurve.vart - && labCurve.brightness == other.labCurve.brightness && labCurve.contrast == other.labCurve.contrast && labCurve.chromaticity == other.labCurve.chromaticity diff --git a/rtengine/procparams.h b/rtengine/procparams.h index f6d92a0fb..82fb2fc4d 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -259,6 +259,32 @@ public: void setDefaults(); static bool HLReconstructionNecessary(LUTu &histRedRaw, LUTu &histGreenRaw, LUTu &histBlueRaw); }; +/** + * Parameters of Dehaz + */ +class DehazParams +{ + +public: + bool enabled; + std::vector cdcurve; + std::vector transmissionCurve; + int str; + int scal; + int neigh; + int gain; + int offs; + Glib::ustring dehazmet; + int vart; + bool retinex; + DehazParams (); + void setDefaults(); + // void getCurves(transmissionCurve &transmissionCurveLUT) const; + + static void getDefaulttransmissionCurve(std::vector &curve); + static void getDefaultCDCurve(std::vector &curve); + +}; /** @@ -277,21 +303,12 @@ public: std::vector hhcurve; std::vector lccurve; std::vector clcurve; - std::vector cdcurve; int brightness; int contrast; int chromaticity; bool avoidcolorshift; double rstprotection; bool lcredsk; - int str; - int scal; - int neigh; - int gain; - int offs; - Glib::ustring dehazmet; - int vart; - }; /** @@ -1196,6 +1213,7 @@ class ProcParams public: ToneCurveParams toneCurve; ///< Tone curve parameters LCurveParams labCurve; ///< CIELAB luminance curve parameters + DehazParams dehaz; ///< Dehaz parameters RGBCurvesParams rgbCurves; ///< RGB curves parameters ColorToningParams colorToning; ///< Color Toning parameters SharpeningParams sharpening; ///< Sharpening parameters diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index dbd7e9c9a..a5d223aa0 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1800,7 +1800,7 @@ void RawImageSource::demosaic(const RAWParams &raw) } } -void RawImageSource::dehaz(RAWParams raw, ColorManagementParams cmp, LCurveParams lcur, LUTf & cdcurve, bool dehacontlutili) +void RawImageSource::dehaz(RAWParams raw, ColorManagementParams cmp, DehazParams lcur, LUTf & cdcurve, bool dehacontlutili) { MyTime t4, t5; diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 3ce1f1089..5a58d935e 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -151,7 +151,7 @@ public: int load (Glib::ustring fname, bool batch = false); void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse); void demosaic (const RAWParams &raw); - void dehaz (RAWParams raw, ColorManagementParams cmp, LCurveParams lcur, LUTf & cdcurve, bool dehacontlutili); + void dehaz (RAWParams raw, ColorManagementParams cmp, DehazParams lcur, LUTf & cdcurve, bool dehacontlutili); void flushRawData (); void flushRGB (); void HLRecovery_Global (ToneCurveParams hrp); @@ -227,7 +227,7 @@ public: void boxblur2(float** src, float** dst, int H, int W, int box ); void boxblur_resamp(float **src, float **dst, int H, int W, int box, int samp ); - void MSR(LabImage* lab, int width, int height, int skip, LCurveParams lcur); + void MSR(LabImage* lab, int width, int height, int skip, DehazParams lcur); //void boxblur_resamp(float **red, float **green, float **blue, int H, int W, float thresh[3], float max[3], // multi_array2D & hfsize, multi_array2D & hilite, int box ); diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc index 32cc0b6b8..aa1cad0f7 100644 --- a/rtengine/refreshmap.cc +++ b/rtengine/refreshmap.cc @@ -435,7 +435,10 @@ int refreshmap[rtengine::NUMOFEVENTS] = { ALLNORAW, // EvLstr ALLNORAW, // EvLscal ALLNORAW, // EvLvart - ALLNORAW // EvLCDCurve + ALLNORAW, // EvLCDCurve + ALLNORAW, // EvDehazOpacity + ALLNORAW, // EvDehazEnabled + ALLNORAW // EvDehazretinex }; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 3c30b0bb4..628c86dd8 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -118,10 +118,10 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p LUTf cdcurve (65536, 0); bool dehacontlutili=false; - CurveFactory::curveDehaContL (dehacontlutili, params.labCurve.cdcurve, cdcurve, 1); + CurveFactory::curveDehaContL (dehacontlutili, params.dehaz.cdcurve, cdcurve, 1); - if(params.labCurve.dehazmet!="none") - imgsrc->dehaz( params.raw, params.icm, params.labCurve, cdcurve, dehacontlutili );//enabled Dehaze + if(params.dehaz.dehazmet!="none") + imgsrc->dehaz( params.raw, params.icm, params.dehaz, cdcurve, dehacontlutili );//enabled Dehaze if (pl) { diff --git a/rtgui/CMakeLists.txt b/rtgui/CMakeLists.txt index c21dd6c55..d49b2dbe6 100644 --- a/rtgui/CMakeLists.txt +++ b/rtgui/CMakeLists.txt @@ -17,7 +17,7 @@ set (BASESOURCEFILES previewloader.cc rtimage.cc inspector.cc histogrampanel.cc history.cc imagearea.cc imageareapanel.cc iptcpanel.cc labcurve.cc main.cc - multilangmgr.cc mycurve.cc myflatcurve.cc mydiagonalcurve.cc options.cc + multilangmgr.cc mycurve.cc myflatcurve.cc mydiagonalcurve.cc options.cc dehaz.cc preferences.cc profilepanel.cc saveasdlg.cc saveformatpanel.cc soundman.cc splash.cc thumbnail.cc tonecurve.cc toolbar.cc diff --git a/rtgui/dehaz.cc b/rtgui/dehaz.cc new file mode 100644 index 000000000..8323a6a9e --- /dev/null +++ b/rtgui/dehaz.cc @@ -0,0 +1,420 @@ +/* + * This file is part of RawTherapee. + */ +#include "dehaz.h" +#include "mycurve.h" + +using namespace rtengine; +using namespace rtengine::procparams; + +Dehaz::Dehaz () : FoldableToolPanel(this, "dehaz", M("TP_DEHAZ_LABEL"), false, true) +{ + CurveListener::setMulti(true); + std::vector milestones; + + dehazFrame = Gtk::manage (new Gtk::Frame (M("TP_DEHAZ_LAB")) ); + dehazFrame->set_tooltip_text(M("TP_DEHAZ_LAB_TOOLTIP")); + dehazFrame->set_border_width(0); + dehazFrame->set_label_align(0.025, 0.5); + + Gtk::VBox * dehazVBox = Gtk::manage ( new Gtk::VBox()); + dehazVBox->set_border_width(4); + dehazVBox->set_spacing(2); + + Gtk::VBox * RetiVBox = Gtk::manage ( new Gtk::VBox()); + RetiVBox->set_border_width(4); + RetiVBox->set_spacing(2); + + dhbox = Gtk::manage (new Gtk::HBox ()); + labmdh = Gtk::manage (new Gtk::Label (M("TP_DEHAZE_MET") + ":")); + dhbox->pack_start (*labmdh, Gtk::PACK_SHRINK, 1); + + dehazmet = Gtk::manage (new MyComboBoxText ()); + dehazmet->append_text (M("TP_DEHAZ_LOW")); + dehazmet->append_text (M("TP_DEHAZ_UNI")); + dehazmet->append_text (M("TP_DEHAZ_HIGH")); + dehazmet->set_active(0); + dehazmetConn = dehazmet->signal_changed().connect ( sigc::mem_fun(*this, &Dehaz::dehazmetChanged) ); + dehazmet->set_tooltip_markup (M("TP_DEHAZ_MET_TOOLTIP")); + dhbox->pack_start(*dehazmet); + dehazVBox->pack_start(*dhbox); + std::vector defaultCurve; + + curveEditorGD = new CurveEditorGroup (options.lastDehazDir, M("TP_DEHAZ_CONTEDIT")); + curveEditorGD->setCurveListener (this); + rtengine::DehazParams::getDefaultCDCurve(defaultCurve); + cdshape = static_cast(curveEditorGD->addCurve(CT_Diagonal, M("TP_DEHAZ_CURVEEDITOR_CD"))); + cdshape->setResetCurve(DiagonalCurveType(defaultCurve.at(0)), defaultCurve); + cdshape->setTooltip(M("TP_DEHAZ_CURVEEDITOR_CD_TOOLTIP")); + std::vector milestones22; + + milestones22.push_back( GradientMilestone(0., 0., 0., 0.) ); + milestones22.push_back( GradientMilestone(1., 1., 1., 1.) ); + cdshape->setBottomBarBgGradient(milestones22); + cdshape->setLeftBarBgGradient(milestones22); + + curveEditorGD->curveListComplete(); + + transmissionCurveEditorG = new CurveEditorGroup (options.lastDehazDir, M("TP_DEHAZ_TRANSMISSION")); + transmissionCurveEditorG->setCurveListener (this); + + rtengine::DehazParams::getDefaulttransmissionCurve(defaultCurve); + transmissionShape = static_cast(transmissionCurveEditorG->addCurve(CT_Flat, "", NULL, false)); + transmissionShape->setIdentityValue(0.); + transmissionShape->setResetCurve(FlatCurveType(defaultCurve.at(0)), defaultCurve); + transmissionShape->setBottomBarBgGradient(milestones); + transmissionCurveEditorG->set_tooltip_markup (M("TP_DEHAZ_TRANS_TOOLTIP")); + + transmissionCurveEditorG->curveListComplete(); + + + + str = Gtk::manage (new Adjuster (M("TP_DEHAZ_STR"), 0, 100., 1., 60.)); + str->set_tooltip_markup (M("TP_DEHAZ_STR_TOOLTIP")); + neigh = Gtk::manage (new Adjuster (M("TP_DEHAZ_NEIGH"), 6, 100., 1., 80.)); + + retinex = Gtk::manage (new Gtk::CheckButton (M("TP_DEHAZ_RETIN"))); + retinex->set_active (true); + retinexConn = retinex->signal_toggled().connect( sigc::mem_fun(*this, &Dehaz::retinexChanged) ); + + dehazVBox->pack_start (*str); + str->show (); + + dehazVBox->pack_start (*neigh); + neigh->show (); + neigh->set_tooltip_markup (M("TP_DEHAZ_NEIGH_TOOLTIP")); + + dehazVBox->pack_start (*retinex); + retinex->show (); + + scal = Gtk::manage (new Adjuster (M("TP_DEHAZ_SCAL"), 1, 6., 1., 3.)); + gain = Gtk::manage (new Adjuster (M("TP_DEHAZ_GAIN"), 50, 150, 1, 100)); + offs = Gtk::manage (new Adjuster (M("TP_DEHAZ_OFFS"), -3000, 3000, 1, 0)); + vart = Gtk::manage (new Adjuster (M("TP_DEHAZ_VART"), 80, 250, 1, 125)); + gain->set_tooltip_markup (M("TP_DEHAZ_GAIN_TOOLTIP")); + scal->set_tooltip_markup (M("TP_DEHAZ_SCAL_TOOLTIP")); + vart->set_tooltip_markup (M("TP_DEHAZ_VART_TOOLTIP")); + + RetiVBox->pack_start (*curveEditorGD, Gtk::PACK_SHRINK, 4); + curveEditorGD->show(); + + RetiVBox->pack_start (*scal); + scal->show (); + + + RetiVBox->pack_start (*gain); + gain->show (); + + RetiVBox->pack_start (*offs); + offs->show (); + + RetiVBox->pack_start (*vart); + vart->show (); + + RetiVBox->pack_start( *transmissionCurveEditorG, Gtk::PACK_SHRINK, 2); + transmissionCurveEditorG->show(); + + + str->setAdjusterListener (this); + scal->setAdjusterListener (this); + neigh->setAdjusterListener (this); + gain->setAdjusterListener (this); + offs->setAdjusterListener (this); + vart->setAdjusterListener (this); + pack_start (*dehazVBox); + dehazFrame->add(*RetiVBox); + pack_start (*dehazFrame); + dehazFrame->hide(); + + disableListener(); + retinexChanged(); + enableListener(); + +} + +Dehaz::~Dehaz() +{ + delete curveEditorGD; + delete transmissionCurveEditorG; + +} + + +void Dehaz::read (const ProcParams* pp, const ParamsEdited* pedited) +{ + disableListener (); + dehazmetConn.block(true); + + + if (pedited) { + scal->setEditedState (pedited->dehaz.scal ? Edited : UnEdited); + neigh->setEditedState (pedited->dehaz.neigh ? Edited : UnEdited); + gain->setEditedState (pedited->dehaz.gain ? Edited : UnEdited); + offs->setEditedState (pedited->dehaz.offs ? Edited : UnEdited); + vart->setEditedState (pedited->dehaz.vart ? Edited : UnEdited); + set_inconsistent (multiImage && !pedited->dehaz.enabled); + retinex->set_inconsistent (!pedited->dehaz.retinex); + + + if (!pedited->dehaz.dehazmet) { + dehazmet->set_active_text(M("GENERAL_UNCHANGED")); + } + cdshape->setUnChanged (!pedited->dehaz.cdcurve); + transmissionShape->setUnChanged (!pedited->dehaz.transmissionCurve); + + } + + neigh->setValue (pp->dehaz.neigh); + gain->setValue (pp->dehaz.gain); + offs->setValue (pp->dehaz.offs); + str->setValue (pp->dehaz.str); + scal->setValue (pp->dehaz.scal); + vart->setValue (pp->dehaz.vart); + + setEnabled (pp->dehaz.enabled); + + retinexConn.block (true); + retinex->set_active (pp->dehaz.retinex); + retinexConn.block (false); + lastretinex = pp->dehaz.retinex; + + + if (pp->dehaz.dehazmet == "low") { + dehazmet->set_active (0); + } else if (pp->dehaz.dehazmet == "uni") { + dehazmet->set_active (1); + } else if (pp->dehaz.dehazmet == "high") { + dehazmet->set_active (2); + } + dehazmetChanged (); + retinexConn.block(false); + retinexChanged (); + retinexConn.block(false); + + cdshape->setCurve (pp->dehaz.cdcurve); + dehazmetConn.block(false); + transmissionShape->setCurve (pp->dehaz.transmissionCurve); + + + enableListener (); +} +void Dehaz::retinexUpdateUI () +{ + if (!batchMode) { + if (retinex->get_active ()) { + scal->show(); + gain->show(); + offs->show(); + vart->show(); + transmissionCurveEditorG->show(); + curveEditorGD->show(); + dehazFrame->show(); + } else { + scal->hide(); + gain->hide(); + offs->hide(); + vart->hide(); + transmissionCurveEditorG->hide(); + curveEditorGD->hide(); + dehazFrame->hide(); + } + } +} + + + +void Dehaz::write (ProcParams* pp, ParamsEdited* pedited) +{ + + pp->dehaz.str = str->getValue (); + pp->dehaz.scal = (int)scal->getValue (); + pp->dehaz.neigh = neigh->getValue (); + pp->dehaz.gain = (int)gain->getValue (); + pp->dehaz.offs = (int)offs->getValue (); + pp->dehaz.vart = (int)vart->getValue (); + pp->dehaz.cdcurve = cdshape->getCurve (); + pp->dehaz.transmissionCurve = transmissionShape->getCurve (); + pp->dehaz.enabled = getEnabled(); + pp->dehaz.retinex = retinex->get_active(); + + if (pedited) { + pedited->dehaz.dehazmet = dehazmet->get_active_text() != M("GENERAL_UNCHANGED"); + + //%%%%%%%%%%%%%%%%%%%%%% + pedited->dehaz.str = str->getEditedState (); + pedited->dehaz.scal = scal->getEditedState (); + pedited->dehaz.neigh = neigh->getEditedState (); + pedited->dehaz.gain = gain->getEditedState (); + pedited->dehaz.offs = offs->getEditedState (); + pedited->dehaz.vart = vart->getEditedState (); + pedited->dehaz.cdcurve = !cdshape->isUnChanged (); + pedited->dehaz.transmissionCurve = !transmissionShape->isUnChanged (); + pedited->dehaz.enabled = !get_inconsistent(); + pedited->dehaz.retinex = !retinex->get_inconsistent(); + + } + if (dehazmet->get_active_row_number() == 0) { + pp->dehaz.dehazmet = "low"; + } else if (dehazmet->get_active_row_number() == 1) { + pp->dehaz.dehazmet = "uni"; + } else if (dehazmet->get_active_row_number() == 2) { + pp->dehaz.dehazmet = "high"; + } +} + +void Dehaz::dehazmetChanged() +{ + if (listener) { + listener->panelChanged (Evdehazmet, dehazmet->get_active_text ()); + } + } + +void Dehaz::retinexChanged () +{ + if (batchMode) { + if (retinex->get_inconsistent()) { + retinex->set_inconsistent (false); + retinexConn.block (true); + retinex->set_active (false); + retinexConn.block (false); + } else if (lastretinex) { + retinex->set_inconsistent (true); + } + + lastretinex = retinex->get_active (); + } + retinexUpdateUI(); + + if (listener) { + if (retinex->get_active()) { + if (getEnabled()) { + listener->panelChanged (EvDehazretinex, M("GENERAL_ENABLED")); + } + } else { + if (getEnabled()) { + listener->panelChanged (EvDehazretinex, M("GENERAL_DISABLED")); + } + } + + } +} + + + +void Dehaz::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) +{ + + neigh->setDefault (defParams->dehaz.neigh); + gain->setDefault (defParams->dehaz.gain); + offs->setDefault (defParams->dehaz.offs); + str->setDefault (defParams->dehaz.str); + scal->setDefault (defParams->dehaz.scal); + vart->setDefault (defParams->dehaz.vart); + + if (pedited) { + neigh->setDefaultEditedState (pedited->dehaz.neigh ? Edited : UnEdited); + gain->setDefaultEditedState (pedited->dehaz.gain ? Edited : UnEdited); + offs->setDefaultEditedState (pedited->dehaz.offs ? Edited : UnEdited); + str->setDefaultEditedState (pedited->dehaz.str ? Edited : UnEdited); + scal->setDefaultEditedState (pedited->dehaz.scal ? Edited : UnEdited); + vart->setDefaultEditedState (pedited->dehaz.vart ? Edited : UnEdited); + + } else { + neigh->setDefaultEditedState (Irrelevant); + gain->setDefaultEditedState (Irrelevant); + offs->setDefaultEditedState (Irrelevant); + vart->setDefaultEditedState (Irrelevant); + str->setDefaultEditedState (Irrelevant); + scal->setDefaultEditedState (Irrelevant); + } +} +/* +void Dehaz::setAdjusterBehavior (bool splitAdd, bool satThresholdAdd, bool satOpacityAdd, bool strprotectAdd, bool balanceAdd) +{ + +} +*/ + +void Dehaz::adjusterChanged (Adjuster* a, double newval) +{ + + if (!listener || !getEnabled()) { + return; + } + + if (a == neigh) { + listener->panelChanged (EvLneigh, neigh->getTextValue()); + } else if (a == str) { + listener->panelChanged (EvLstr, str->getTextValue()); + } else if (a == scal) { + listener->panelChanged (EvLscal, scal->getTextValue()); + } else if (a == gain) { + listener->panelChanged (EvLgain, gain->getTextValue()); + } else if (a == offs) { + listener->panelChanged (EvLoffs, offs->getTextValue()); + } else if (a == vart) { + listener->panelChanged (EvLvart, vart->getTextValue()); + } +} + + + +void Dehaz::autoOpenCurve () +{ + cdshape->openIfNonlinear(); + transmissionShape->openIfNonlinear(); + +} + + +void Dehaz::curveChanged (CurveEditor* ce) +{ + if (listener && getEnabled()) { + if (ce == cdshape) { + listener->panelChanged (EvLCDCurve, M("HISTORY_CUSTOMCURVE")); + } else if (ce == transmissionShape) { + listener->panelChanged (EvDehaztransmission, M("HISTORY_CUSTOMCURVE")); + } + } +} + +void Dehaz::enabledChanged () +{ + + if (listener) { + if (get_inconsistent()) { + listener->panelChanged (EvDehazEnabled, M("GENERAL_UNCHANGED")); + } else if (getEnabled()) { + listener->panelChanged (EvDehazEnabled, M("GENERAL_ENABLED")); + } else { + listener->panelChanged (EvDehazEnabled, M("GENERAL_DISABLED")); + } + } +} + + +void Dehaz::trimValues (rtengine::procparams::ProcParams* pp) +{ + str->trimValue(pp->dehaz.str); + scal->trimValue(pp->dehaz.scal); + neigh->trimValue(pp->dehaz.neigh); + gain->trimValue(pp->dehaz.gain); + offs->trimValue(pp->dehaz.offs); + vart->trimValue(pp->dehaz.vart); + +} + +void Dehaz::setBatchMode (bool batchMode) +{ + ToolPanel::setBatchMode (batchMode); + neigh->showEditedCB (); + gain->showEditedCB (); + offs->showEditedCB (); + str->showEditedCB (); + scal->showEditedCB (); + vart->showEditedCB (); + curveEditorGD->setBatchMode (batchMode); + transmissionCurveEditorG->setBatchMode (batchMode); + + +} diff --git a/rtgui/dehaz.h b/rtgui/dehaz.h new file mode 100644 index 000000000..9cf0614c5 --- /dev/null +++ b/rtgui/dehaz.h @@ -0,0 +1,63 @@ +/* + * This file is part of RawTherapee. + */ +#ifndef _DEHAZ_H_ +#define _DEHAZ_H_ + +#include +#include "adjuster.h" +#include "toolpanel.h" +#include "guiutils.h" +#include "curveeditor.h" +#include "curveeditorgroup.h" +#include "thresholdadjuster.h" +#include "colorprovider.h" + +class Dehaz : public ToolParamBlock, public FoldableToolPanel, public CurveListener, + public AdjusterListener +{ + +protected: + CurveEditorGroup* curveEditorGD; + Adjuster* str; + Adjuster* scal; + Adjuster* neigh; + Adjuster* gain; + Adjuster* offs; + Adjuster* vart; + + Gtk::Label* labmdh; + Gtk::HBox* dhbox; + MyComboBoxText* dehazmet; + Gtk::CheckButton* retinex; + Gtk::Frame* dehazFrame; + + DiagonalCurveEditor* cdshape; + CurveEditorGroup* transmissionCurveEditorG; + sigc::connection dehazmetConn; + FlatCurveEditor* transmissionShape; + bool lastretinex; + sigc::connection retinexConn; + +public: + Dehaz (); + ~Dehaz (); + + void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = NULL); + void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = NULL); + void setBatchMode (bool batchMode); + void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = NULL); + void trimValues (rtengine::procparams::ProcParams* pp); + void adjusterChanged (Adjuster* a, double newval); +// void setAdjusterBehavior (bool splitAdd, bool satThresholdAdd, bool satOpacityAdd, bool strprotectAdd, bool balanceAdd); + void autoOpenCurve (); + void retinexChanged (); + + void enabledChanged (); + void curveChanged (CurveEditor* ce); + void dehazmetChanged(); + void retinexUpdateUI(); + +}; + +#endif diff --git a/rtgui/labcurve.cc b/rtgui/labcurve.cc index 08c9ac0c2..2fb7f250c 100644 --- a/rtgui/labcurve.cc +++ b/rtgui/labcurve.cc @@ -210,85 +210,11 @@ LCurve::LCurve () : FoldableToolPanel(this, "labcurves", M("TP_LABCURVE_LABEL")) hsepdh->show (); pack_start (*hsepdh, Gtk::PACK_EXPAND_WIDGET, 4); - Gtk::Frame* dehazFrame = Gtk::manage (new Gtk::Frame (M("TP_DEHAZE_LAB")) ); - dehazFrame->set_tooltip_text(M("TP_DEHAZE_LAB_TOOLTIP")); - dehazFrame->set_border_width(0); - dehazFrame->set_label_align(0.025, 0.5); - - Gtk::VBox * dehazVBox = Gtk::manage ( new Gtk::VBox()); - dehazVBox->set_border_width(4); - dehazVBox->set_spacing(2); - - dhbox = Gtk::manage (new Gtk::HBox ()); - labmdh = Gtk::manage (new Gtk::Label (M("TP_DEHAZE_MET") + ":")); - dhbox->pack_start (*labmdh, Gtk::PACK_SHRINK, 1); - - dehazmet = Gtk::manage (new MyComboBoxText ()); - dehazmet->append_text (M("TP_DEHAZ_NONE")); - dehazmet->append_text (M("TP_DEHAZ_UNI")); - dehazmet->append_text (M("TP_DEHAZ_LOW")); - dehazmet->append_text (M("TP_DEHAZ_HIGH")); - dehazmet->set_active(0); - dehazmetConn = dehazmet->signal_changed().connect ( sigc::mem_fun(*this, &LCurve::dehazmetChanged) ); - // dehazmet->set_tooltip_markup (M("TP_DEHAZ_MET_TOOLTIP")); - dhbox->pack_start(*dehazmet); - dehazVBox->pack_start(*dhbox); - - curveEditorGD = new CurveEditorGroup (options.lastLabCurvesDir, M("TP_LABCURVE_CONTEDIT")); - curveEditorGD->setCurveListener (this); - cdshape = static_cast(curveEditorGD->addCurve(CT_Diagonal, M("TP_LABCURVE_CURVEEDITOR_CD"))); - cdshape->setTooltip(M("TP_LABCURVE_CURVEEDITOR_CD_TOOLTIP")); - std::vector milestones22; - - milestones22.push_back( GradientMilestone(0., 0., 0., 0.) ); - milestones22.push_back( GradientMilestone(1., 1., 1., 1.) ); - cdshape->setBottomBarBgGradient(milestones22); - cdshape->setLeftBarBgGradient(milestones22); - - curveEditorGD->curveListComplete(); - - str = Gtk::manage (new Adjuster (M("TP_LABCURVE_STR"), 0, 100., 1., 60.)); - scal = Gtk::manage (new Adjuster (M("TP_LABCURVE_SCAL"), 1, 6., 1., 3.)); - neigh = Gtk::manage (new Adjuster (M("TP_LABCURVE_NEIGH"), 6, 100., 1., 80.)); - gain = Gtk::manage (new Adjuster (M("TP_LABCURVE_GAIN"), 50, 150, 1, 100)); - offs = Gtk::manage (new Adjuster (M("TP_LABCURVE_OFFS"), 0, 3000, 1, 0)); - vart = Gtk::manage (new Adjuster (M("TP_LABCURVE_VART"), 80, 300, 1, 125)); - dehazVBox->pack_start (*str); - str->show (); - - dehazVBox->pack_start (*curveEditorGD, Gtk::PACK_SHRINK, 4); - curveEditorGD->show(); - - dehazVBox->pack_start (*scal); - scal->show (); - - dehazVBox->pack_start (*neigh); - neigh->show (); - - dehazVBox->pack_start (*gain); - gain->show (); - - dehazVBox->pack_start (*offs); - offs->show (); - - dehazVBox->pack_start (*vart); - vart->show (); - - str->setAdjusterListener (this); - scal->setAdjusterListener (this); - neigh->setAdjusterListener (this); - gain->setAdjusterListener (this); - offs->setAdjusterListener (this); - vart->setAdjusterListener (this); - dehazFrame->add(*dehazVBox); - pack_start (*dehazFrame); - } LCurve::~LCurve () { delete curveEditorG; - delete curveEditorGD; } @@ -296,30 +222,16 @@ void LCurve::read (const ProcParams* pp, const ParamsEdited* pedited) { disableListener (); - dehazmetConn.block(true); if (pedited) { brightness->setEditedState (pedited->labCurve.brightness ? Edited : UnEdited); contrast->setEditedState (pedited->labCurve.contrast ? Edited : UnEdited); - chromaticity->setEditedState (pedited->labCurve.chromaticity ? Edited : UnEdited); + chromaticity->setEditedState (pedited->labCurve.chromaticity ? Edited : UnEdited); //%%%%%%%%%%%%%%%%%%%%%% rstprotection->setEditedState (pedited->labCurve.rstprotection ? Edited : UnEdited); avoidcolorshift->set_inconsistent (!pedited->labCurve.avoidcolorshift); lcredsk->set_inconsistent (!pedited->labCurve.lcredsk); - str->setEditedState (pedited->labCurve.str ? Edited : UnEdited); - scal->setEditedState (pedited->labCurve.scal ? Edited : UnEdited); - neigh->setEditedState (pedited->labCurve.neigh ? Edited : UnEdited); - gain->setEditedState (pedited->labCurve.gain ? Edited : UnEdited); - offs->setEditedState (pedited->labCurve.offs ? Edited : UnEdited); - vart->setEditedState (pedited->labCurve.vart ? Edited : UnEdited); - - // if (!pedited->labCurve.dehazmet) { - // dehazmet->set_active (3); - // } - if (!pedited->labCurve.dehazmet) { - dehazmet->set_active_text(M("GENERAL_UNCHANGED")); - } //%%%%%%%%%%%%%%%%%%%%%% @@ -332,32 +244,12 @@ void LCurve::read (const ProcParams* pp, const ParamsEdited* pedited) hhshape->setUnChanged (!pedited->labCurve.hhcurve); lcshape->setUnChanged (!pedited->labCurve.lccurve); clshape->setUnChanged (!pedited->labCurve.clcurve); - cdshape->setUnChanged (!pedited->labCurve.cdcurve); } brightness->setValue (pp->labCurve.brightness); contrast->setValue (pp->labCurve.contrast); chromaticity->setValue (pp->labCurve.chromaticity); adjusterChanged(chromaticity, pp->labCurve.chromaticity); // To update the GUI sensitiveness - neigh->setValue (pp->labCurve.neigh); - gain->setValue (pp->labCurve.gain); - offs->setValue (pp->labCurve.offs); - str->setValue (pp->labCurve.str); - scal->setValue (pp->labCurve.scal); - vart->setValue (pp->labCurve.vart); - -// dehazmet->set_active (0); - if (pp->labCurve.dehazmet == "none") { - dehazmet->set_active (0); - } else if (pp->labCurve.dehazmet == "uni") { - dehazmet->set_active (1); - } else if (pp->labCurve.dehazmet == "low") { - dehazmet->set_active (2); - } else if (pp->labCurve.dehazmet == "high") { - dehazmet->set_active (3); - } - dehazmetChanged (); - //%%%%%%%%%%%%%%%%%%%%%% rstprotection->setValue (pp->labCurve.rstprotection); @@ -384,10 +276,8 @@ void LCurve::read (const ProcParams* pp, const ParamsEdited* pedited) hhshape->setCurve (pp->labCurve.hhcurve); lcshape->setCurve (pp->labCurve.lccurve); clshape->setCurve (pp->labCurve.clcurve); - cdshape->setCurve (pp->labCurve.cdcurve); queue_draw(); - dehazmetConn.block(false); enableListener (); } @@ -429,9 +319,6 @@ void LCurve::autoOpenCurve () clshape->openIfNonlinear(); } - if (!active) { - cdshape->openIfNonlinear(); - } } void LCurve::setEditProvider (EditDataProvider *provider) @@ -440,7 +327,6 @@ void LCurve::setEditProvider (EditDataProvider *provider) ccshape->setEditProvider(provider); lcshape->setEditProvider(provider); clshape->setEditProvider(provider); - cdshape->setEditProvider(provider); lhshape->setEditProvider(provider); chshape->setEditProvider(provider); hhshape->setEditProvider(provider); @@ -456,13 +342,6 @@ void LCurve::write (ProcParams* pp, ParamsEdited* pedited) pp->labCurve.brightness = brightness->getValue (); pp->labCurve.contrast = (int)contrast->getValue (); pp->labCurve.chromaticity = (int)chromaticity->getValue (); - pp->labCurve.str = str->getValue (); - pp->labCurve.scal = (int)scal->getValue (); - pp->labCurve.neigh = neigh->getValue (); - pp->labCurve.gain = (int)gain->getValue (); - pp->labCurve.offs = (int)offs->getValue (); - pp->labCurve.vart = (int)vart->getValue (); - //%%%%%%%%%%%%%%%%%%%%%% pp->labCurve.avoidcolorshift = avoidcolorshift->get_active (); pp->labCurve.lcredsk = lcredsk->get_active (); @@ -479,7 +358,6 @@ void LCurve::write (ProcParams* pp, ParamsEdited* pedited) pp->labCurve.hhcurve = hhshape->getCurve (); pp->labCurve.lccurve = lcshape->getCurve (); pp->labCurve.clcurve = clshape->getCurve (); - pp->labCurve.cdcurve = cdshape->getCurve (); if (pedited) { pedited->labCurve.brightness = brightness->getEditedState (); @@ -491,17 +369,6 @@ void LCurve::write (ProcParams* pp, ParamsEdited* pedited) pedited->labCurve.lcredsk = !lcredsk->get_inconsistent(); pedited->labCurve.rstprotection = rstprotection->getEditedState (); - // pedited->labCurve.dehazmet = dehazmet->get_active_row_number() != 3; - pedited->labCurve.dehazmet = dehazmet->get_active_text() != M("GENERAL_UNCHANGED"); - - //%%%%%%%%%%%%%%%%%%%%%% - pedited->labCurve.str = str->getEditedState (); - pedited->labCurve.scal = scal->getEditedState (); - pedited->labCurve.neigh = neigh->getEditedState (); - pedited->labCurve.gain = gain->getEditedState (); - pedited->labCurve.offs = offs->getEditedState (); - pedited->labCurve.vart = vart->getEditedState (); - pedited->labCurve.lcurve = !lshape->isUnChanged (); pedited->labCurve.acurve = !ashape->isUnChanged (); @@ -512,31 +379,12 @@ void LCurve::write (ProcParams* pp, ParamsEdited* pedited) pedited->labCurve.hhcurve = !hhshape->isUnChanged (); pedited->labCurve.lccurve = !lcshape->isUnChanged (); pedited->labCurve.clcurve = !clshape->isUnChanged (); - pedited->labCurve.cdcurve = !cdshape->isUnChanged (); } - if (dehazmet->get_active_row_number() == 0) { - pp->labCurve.dehazmet = "none"; - } else if (dehazmet->get_active_row_number() == 1) { - pp->labCurve.dehazmet = "uni"; - } else if (dehazmet->get_active_row_number() == 2) { - pp->labCurve.dehazmet = "low"; - } else if (dehazmet->get_active_row_number() == 3) { - pp->labCurve.dehazmet = "high"; - } - } -void LCurve::dehazmetChanged() -{ - if (listener) { - listener->panelChanged (Evdehazmet, dehazmet->get_active_text ()); - } - } - - void LCurve::setDefaults (const ProcParams* defParams, const ParamsEdited* pedited) { @@ -544,36 +392,16 @@ void LCurve::setDefaults (const ProcParams* defParams, const ParamsEdited* pedit contrast->setDefault (defParams->labCurve.contrast); chromaticity->setDefault (defParams->labCurve.chromaticity); rstprotection->setDefault (defParams->labCurve.rstprotection); - neigh->setDefault (defParams->labCurve.neigh); - gain->setDefault (defParams->labCurve.gain); - offs->setDefault (defParams->labCurve.offs); - str->setDefault (defParams->labCurve.str); - scal->setDefault (defParams->labCurve.scal); - vart->setDefault (defParams->labCurve.vart); - if (pedited) { brightness->setDefaultEditedState (pedited->labCurve.brightness ? Edited : UnEdited); contrast->setDefaultEditedState (pedited->labCurve.contrast ? Edited : UnEdited); chromaticity->setDefaultEditedState (pedited->labCurve.chromaticity ? Edited : UnEdited); rstprotection->setDefaultEditedState (pedited->labCurve.rstprotection ? Edited : UnEdited); - neigh->setDefaultEditedState (pedited->labCurve.neigh ? Edited : UnEdited); - gain->setDefaultEditedState (pedited->labCurve.gain ? Edited : UnEdited); - offs->setDefaultEditedState (pedited->labCurve.offs ? Edited : UnEdited); - str->setDefaultEditedState (pedited->labCurve.str ? Edited : UnEdited); - scal->setDefaultEditedState (pedited->labCurve.scal ? Edited : UnEdited); - vart->setDefaultEditedState (pedited->labCurve.vart ? Edited : UnEdited); - } else { brightness->setDefaultEditedState (Irrelevant); contrast->setDefaultEditedState (Irrelevant); chromaticity->setDefaultEditedState (Irrelevant); rstprotection->setDefaultEditedState (Irrelevant); - neigh->setDefaultEditedState (Irrelevant); - gain->setDefaultEditedState (Irrelevant); - offs->setDefaultEditedState (Irrelevant); - vart->setDefaultEditedState (Irrelevant); - str->setDefaultEditedState (Irrelevant); - scal->setDefaultEditedState (Irrelevant); } } @@ -679,9 +507,6 @@ void LCurve::curveChanged (CurveEditor* ce) listener->panelChanged (EvLCLCurve, M("HISTORY_CUSTOMCURVE")); } - if (ce == cdshape) { - listener->panelChanged (EvLCDCurve, M("HISTORY_CUSTOMCURVE")); - } } } @@ -711,32 +536,6 @@ void LCurve::adjusterChanged (Adjuster* a, double newval) if (listener) { listener->panelChanged (EvLRSTProtection, costr); } - } else if (a == neigh) { - if (listener) { - listener->panelChanged (EvLneigh, costr); - } - } else if (a == str) { - if (listener) { - listener->panelChanged (EvLstr, costr); - } - } else if (a == scal) { - if (listener) { - listener->panelChanged (EvLscal, costr); - } - - } else if (a == gain) { - if (listener) { - listener->panelChanged (EvLgain, costr); - } - } else if (a == offs) { - if (listener) { - listener->panelChanged (EvLoffs, costr); - } - } else if (a == vart) { - if (listener) { - listener->panelChanged (EvLvart, costr); - } - } else if (a == chromaticity) { if (multiImage) { //if chromaticity==-100 (lowest value), we enter the B&W mode and avoid color shift and rstprotection has no effect @@ -822,15 +621,6 @@ void LCurve::setBatchMode (bool batchMode) contrast->showEditedCB (); chromaticity->showEditedCB (); rstprotection->showEditedCB (); - dehazmet->append_text (M("GENERAL_UNCHANGED")); - neigh->showEditedCB (); - gain->showEditedCB (); - offs->showEditedCB (); - str->showEditedCB (); - scal->showEditedCB (); - vart->showEditedCB (); - curveEditorGD->setBatchMode (batchMode); - curveEditorG->setBatchMode (batchMode); lcshape->setBottomBarColorProvider(NULL, -1); lcshape->setLeftBarColorProvider(NULL, -1); @@ -861,10 +651,4 @@ void LCurve::trimValues (rtengine::procparams::ProcParams* pp) brightness->trimValue(pp->labCurve.brightness); contrast->trimValue(pp->labCurve.contrast); chromaticity->trimValue(pp->labCurve.chromaticity); - str->trimValue(pp->labCurve.str); - scal->trimValue(pp->labCurve.scal); - neigh->trimValue(pp->labCurve.neigh); - gain->trimValue(pp->labCurve.gain); - offs->trimValue(pp->labCurve.offs); - vart->trimValue(pp->labCurve.vart); } diff --git a/rtgui/labcurve.h b/rtgui/labcurve.h index ae671a2f5..765574a67 100644 --- a/rtgui/labcurve.h +++ b/rtgui/labcurve.h @@ -31,17 +31,10 @@ class LCurve : public ToolParamBlock, public AdjusterListener, public FoldableTo protected: CurveEditorGroup* curveEditorG; - CurveEditorGroup* curveEditorGD; +// CurveEditorGroup* curveEditorGD; Adjuster* brightness; Adjuster* contrast; Adjuster* chromaticity; - Adjuster* str; - Adjuster* scal; - Adjuster* neigh; - Adjuster* gain; - Adjuster* offs; - Adjuster* vart; - DiagonalCurveEditor* lshape; DiagonalCurveEditor* ashape; DiagonalCurveEditor* bshape; @@ -52,7 +45,6 @@ protected: FlatCurveEditor* hhshape; Gtk::Label* labmdh; Gtk::HBox* dhbox; - MyComboBoxText* dehazmet; DiagonalCurveEditor* clshape; DiagonalCurveEditor* cdshape; @@ -62,7 +54,7 @@ protected: Gtk::CheckButton* lcredsk; Adjuster* rstprotection; - sigc::connection bwtconn, acconn, lcconn, dehazmetConn; + sigc::connection bwtconn, acconn, lcconn; bool lastACVal, lastLCVal; //%%%%%%%%%%%%%%%% @@ -90,8 +82,7 @@ public: virtual void colorForValue (double valX, double valY, enum ColorCaller::ElemType elemType, int callerId, ColorCaller* caller); - private: - void dehazmetChanged(); + private: diff --git a/rtgui/options.cc b/rtgui/options.cc index efdb98732..5212c6505 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -177,6 +177,10 @@ void Options::updatePaths() if (lastLabCurvesDir.empty() || !safe_file_test (lastLabCurvesDir, Glib::FILE_TEST_EXISTS) || !safe_file_test (lastLabCurvesDir, Glib::FILE_TEST_IS_DIR)) { lastLabCurvesDir = preferredPath; } + + if (lastDehazDir.empty() || !safe_file_test (lastDehazDir, Glib::FILE_TEST_EXISTS) || !safe_file_test (lastLabCurvesDir, Glib::FILE_TEST_IS_DIR)) { + lastDehazDir = preferredPath; + } if (lastDenoiseCurvesDir.empty() || !safe_file_test (lastDenoiseCurvesDir, Glib::FILE_TEST_EXISTS) || !safe_file_test (lastDenoiseCurvesDir, Glib::FILE_TEST_IS_DIR)) { lastDenoiseCurvesDir = preferredPath; @@ -682,6 +686,7 @@ void Options::setDefaults () // at the end of the "updatePaths" method. lastRgbCurvesDir = ""; lastLabCurvesDir = ""; + lastDehazDir = ""; lastDenoiseCurvesDir = ""; lastWaveletCurvesDir = ""; lastPFCurvesDir = ""; @@ -1733,6 +1738,7 @@ int Options::readFromFile (Glib::ustring fname) safeDirGet(keyFile, "Dialogs", "LastFlatfieldDir", lastFlatfieldDir); safeDirGet(keyFile, "Dialogs", "LastRgbCurvesDir", lastRgbCurvesDir); safeDirGet(keyFile, "Dialogs", "LastLabCurvesDir", lastLabCurvesDir); + safeDirGet(keyFile, "Dialogs", "LastDehazDir", lastDehazDir); safeDirGet(keyFile, "Dialogs", "LastDenoiseCurvesDir", lastDenoiseCurvesDir); safeDirGet(keyFile, "Dialogs", "LastWaveletCurvesDir", lastWaveletCurvesDir); safeDirGet(keyFile, "Dialogs", "LastPFCurvesDir", lastPFCurvesDir); @@ -2069,6 +2075,7 @@ int Options::saveToFile (Glib::ustring fname) keyFile.set_string ("Dialogs", "LastFlatfieldDir", lastFlatfieldDir); keyFile.set_string ("Dialogs", "LastRgbCurvesDir", lastRgbCurvesDir); keyFile.set_string ("Dialogs", "LastLabCurvesDir", lastLabCurvesDir); + keyFile.set_string ("Dialogs", "LastDehazDir", lastDehazDir); keyFile.set_string ("Dialogs", "LastDenoiseCurvesDir", lastDenoiseCurvesDir); keyFile.set_string ("Dialogs", "LastWaveletCurvesDir", lastWaveletCurvesDir); keyFile.set_string ("Dialogs", "LastPFCurvesDir", lastPFCurvesDir); diff --git a/rtgui/options.h b/rtgui/options.h index 753ae01bb..f619a9455 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -278,6 +278,7 @@ public: Glib::ustring lastFlatfieldDir; Glib::ustring lastRgbCurvesDir; Glib::ustring lastLabCurvesDir; + Glib::ustring lastDehazDir; Glib::ustring lastDenoiseCurvesDir; Glib::ustring lastWaveletCurvesDir; Glib::ustring lastPFCurvesDir; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index 30e1ad38a..6d81e28d8 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -49,6 +49,17 @@ void ParamsEdited::set (bool v) toneCurve.expcomp = v; toneCurve.hrenabled = v; toneCurve.method = v; + dehaz.cdcurve = v; + dehaz.dehazmet = v; + dehaz.enabled = v; + dehaz.str = v; + dehaz.scal = v; + dehaz.neigh = v; + dehaz.gain = v; + dehaz.offs = v; + dehaz.vart = v; + dehaz.transmissionCurve = v; + dehaz.retinex = v; labCurve.lcurve = v; labCurve.acurve = v; labCurve.bcurve = v; @@ -58,14 +69,6 @@ void ParamsEdited::set (bool v) labCurve.hhcurve = v; labCurve.lccurve = v; labCurve.clcurve = v; - labCurve.cdcurve = v; - labCurve.dehazmet = v; - labCurve.str = v; - labCurve.scal = v; - labCurve.neigh = v; - labCurve.gain = v; - labCurve.offs = v; - labCurve.vart = v; labCurve.brightness = v; labCurve.contrast = v; labCurve.chromaticity = v; @@ -512,6 +515,17 @@ void ParamsEdited::initFrom (const std::vector toneCurve.expcomp = toneCurve.expcomp && p.toneCurve.expcomp == other.toneCurve.expcomp; toneCurve.hrenabled = toneCurve.hrenabled && p.toneCurve.hrenabled == other.toneCurve.hrenabled; toneCurve.method = toneCurve.method && p.toneCurve.method == other.toneCurve.method; + dehaz.cdcurve = dehaz.cdcurve && p.dehaz.cdcurve == other.dehaz.cdcurve; + dehaz.transmissionCurve = dehaz.transmissionCurve && p.dehaz.transmissionCurve == other.dehaz.transmissionCurve; + dehaz.dehazmet = dehaz.dehazmet && p.dehaz.dehazmet == other.dehaz.dehazmet; + dehaz.str = dehaz.str && p.dehaz.str == other.dehaz.str; + dehaz.scal = dehaz.scal && p.dehaz.scal == other.dehaz.scal; + dehaz.neigh = dehaz.neigh && p.dehaz.neigh == other.dehaz.neigh; + dehaz.gain = dehaz.gain && p.dehaz.gain == other.dehaz.gain; + dehaz.offs = dehaz.offs && p.dehaz.offs == other.dehaz.offs; + dehaz.vart = dehaz.vart && p.dehaz.vart == other.dehaz.vart; + dehaz.enabled = dehaz.enabled && p.dehaz.enabled == other.dehaz.enabled; + dehaz.retinex = dehaz.retinex && p.dehaz.retinex == other.dehaz.retinex; labCurve.lcurve = labCurve.lcurve && p.labCurve.lcurve == other.labCurve.lcurve; labCurve.acurve = labCurve.acurve && p.labCurve.acurve == other.labCurve.acurve; labCurve.bcurve = labCurve.bcurve && p.labCurve.bcurve == other.labCurve.bcurve; @@ -521,14 +535,6 @@ void ParamsEdited::initFrom (const std::vector labCurve.hhcurve = labCurve.hhcurve && p.labCurve.hhcurve == other.labCurve.hhcurve; labCurve.lccurve = labCurve.lccurve && p.labCurve.lccurve == other.labCurve.lccurve; labCurve.clcurve = labCurve.clcurve && p.labCurve.clcurve == other.labCurve.clcurve; - labCurve.cdcurve = labCurve.cdcurve && p.labCurve.cdcurve == other.labCurve.cdcurve; - labCurve.dehazmet = labCurve.dehazmet && p.labCurve.dehazmet == other.labCurve.dehazmet; - labCurve.str = labCurve.str && p.labCurve.str == other.labCurve.str; - labCurve.scal = labCurve.scal && p.labCurve.scal == other.labCurve.scal; - labCurve.neigh = labCurve.neigh && p.labCurve.neigh == other.labCurve.neigh; - labCurve.gain = labCurve.gain && p.labCurve.gain == other.labCurve.gain; - labCurve.offs = labCurve.offs && p.labCurve.offs == other.labCurve.offs; - labCurve.vart = labCurve.vart && p.labCurve.vart == other.labCurve.vart; labCurve.brightness = labCurve.brightness && p.labCurve.brightness == other.labCurve.brightness; labCurve.contrast = labCurve.contrast && p.labCurve.contrast == other.labCurve.contrast; labCurve.chromaticity = labCurve.chromaticity && p.labCurve.chromaticity == other.labCurve.chromaticity; @@ -1010,7 +1016,49 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (toneCurve.method) { toEdit.toneCurve.method = mods.toneCurve.method; } + + if (dehaz.enabled) { + toEdit.dehaz.enabled = mods.dehaz.enabled; + } + if (dehaz.cdcurve) { + toEdit.dehaz.cdcurve = mods.dehaz.cdcurve; + } + + if (dehaz.transmissionCurve) { + toEdit.dehaz.transmissionCurve = mods.dehaz.transmissionCurve; + } + + if (dehaz.str) { + toEdit.dehaz.str = mods.dehaz.str; + } + + if (dehaz.scal) { + toEdit.dehaz.scal = mods.dehaz.scal; + } + + if (dehaz.retinex) { + toEdit.dehaz.retinex = mods.dehaz.retinex; + } + + if (dehaz.enabled) { + toEdit.dehaz.enabled = mods.dehaz.enabled; + } + + if (dehaz.neigh) { + toEdit.dehaz.neigh = mods.dehaz.neigh; + } + + if (dehaz.gain) { + toEdit.dehaz.gain = mods.dehaz.gain; + } + if (dehaz.offs) { + toEdit.dehaz.offs = mods.dehaz.offs; + } + if (dehaz.vart) { + toEdit.dehaz.vart = mods.dehaz.vart; + } + if (labCurve.lcurve) { toEdit.labCurve.lcurve = mods.labCurve.lcurve; } @@ -1042,15 +1090,15 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (labCurve.lccurve) { toEdit.labCurve.lccurve = mods.labCurve.lccurve; } - if (labCurve.dehazmet) { - toEdit.labCurve.dehazmet = mods.labCurve.dehazmet; - } +// if (labCurve.dehazmet) { +// toEdit.labCurve.dehazmet = mods.labCurve.dehazmet; +// } if (labCurve.clcurve) { toEdit.labCurve.clcurve = mods.labCurve.clcurve; } - if (labCurve.cdcurve) { - toEdit.labCurve.cdcurve = mods.labCurve.cdcurve; - } + // if (labCurve.cdcurve) { + // toEdit.labCurve.cdcurve = mods.labCurve.cdcurve; + // } if (labCurve.brightness) { toEdit.labCurve.brightness = dontforceSet && options.baBehav[ADDSET_LC_BRIGHTNESS] ? toEdit.labCurve.brightness + mods.labCurve.brightness : mods.labCurve.brightness; @@ -1063,26 +1111,6 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten if (labCurve.chromaticity) { toEdit.labCurve.chromaticity = dontforceSet && options.baBehav[ADDSET_LC_CHROMATICITY] ? toEdit.labCurve.chromaticity + mods.labCurve.chromaticity : mods.labCurve.chromaticity; } - if (labCurve.str) { - toEdit.labCurve.str = mods.labCurve.str; - } - - if (labCurve.scal) { - toEdit.labCurve.scal = mods.labCurve.scal; - } - - if (labCurve.neigh) { - toEdit.labCurve.neigh = mods.labCurve.neigh; - } - if (labCurve.gain) { - toEdit.labCurve.gain = mods.labCurve.gain; - } - if (labCurve.offs) { - toEdit.labCurve.offs = mods.labCurve.offs; - } - if (labCurve.vart) { - toEdit.labCurve.vart = mods.labCurve.vart; - } if (labCurve.avoidcolorshift) { toEdit.labCurve.avoidcolorshift = mods.labCurve.avoidcolorshift; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 021b45c86..10dbfe828 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -55,12 +55,10 @@ public: bool method; }; -class LCurveParamsEdited +class DehazParamsEdited { public: - bool brightness; - bool contrast; - bool chromaticity; + bool enabled; bool str; bool scal; bool neigh; @@ -68,7 +66,20 @@ public: bool offs; bool dehazmet; bool vart; - + bool method; + bool transmissionCurve; + bool cdcurve; + bool retinex; + +}; + + +class LCurveParamsEdited +{ +public: + bool brightness; + bool contrast; + bool chromaticity; bool avoidcolorshift; bool rstprotection; bool lcurve; @@ -81,8 +92,6 @@ public: bool hhcurve; bool lccurve; bool clcurve; - bool cdcurve; - bool enabled; bool method; }; @@ -708,6 +717,7 @@ public: LCurveParamsEdited labCurve; RGBCurvesParamsEdited rgbCurves; ColorToningEdited colorToning; + DehazParamsEdited dehaz; SharpeningParamsEdited sharpening; SharpeningParamsEdited prsharpening; SharpenEdgeParamsEdited sharpenEdge; diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index c77a9cdb5..3436a9c4d 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -59,6 +59,7 @@ ToolPanelCoordinator::ToolPanelCoordinator () : ipc(NULL) colorappearance = Gtk::manage (new ColorAppearance ()); whitebalance = Gtk::manage (new WhiteBalance ()); vignetting = Gtk::manage (new Vignetting ()); + dehaz = Gtk::manage (new Dehaz ()); gradient = Gtk::manage (new Gradient ()); pcvignette = Gtk::manage (new PCVignette ()); perspective = Gtk::manage (new PerspCorrection ()); @@ -125,6 +126,8 @@ ToolPanelCoordinator::ToolPanelCoordinator () : ipc(NULL) toolPanels.push_back (colortoning); addPanel (exposurePanel, epd); toolPanels.push_back (epd); + addPanel (exposurePanel, dehaz); + toolPanels.push_back (dehaz); addPanel (exposurePanel, pcvignette); toolPanels.push_back (pcvignette); addPanel (exposurePanel, gradient); diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index 8362a3f37..868fad258 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -51,6 +51,7 @@ #include "perspective.h" #include "rotate.h" #include "vignetting.h" +#include "dehaz.h" #include "gradient.h" #include "pcvignette.h" #include "toolbar.h" @@ -101,6 +102,7 @@ protected: WhiteBalance* whitebalance; Vignetting* vignetting; Gradient* gradient; + Dehaz* dehaz; PCVignette* pcvignette; LensGeometry* lensgeom; LensProfilePanel* lensProf;