diff --git a/rtdata/languages/default b/rtdata/languages/default
index 68386d1bd..7d01c019d 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -703,6 +703,7 @@ HISTORY_MSG_468;EvPixelShiftMedian
HISTORY_MSG_469;EvPixelShiftMedian3
HISTORY_MSG_470;EvPixelShiftMotionMethod
HISTORY_MSG_471;EvPixelShiftSmooth
+HISTORY_MSG_472;EvPixelShiftLmmse
HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
HISTORY_SNAPSHOT;Snapshot
@@ -1694,6 +1695,7 @@ TP_RAW_PIXELSHIFTMEDIAN3;Exclude selected frame from median
TP_RAW_PIXELSHIFTHOLEFILL;3x3 new: Fill holes
TP_RAW_PIXELSHIFTBLUR;3x3 new: Blur
TP_RAW_PIXELSHIFTSMOOTH;3x3 new: Smooth transitions
+TP_RAW_PIXELSHIFTLMMSE;Use lmmse for motion parts
TP_RAW_PIXELSHIFTEXP0;Experimental
TP_RAW_PIXELSHIFTGREEN;Check dual green
TP_RAW_PIXELSHIFTNONGREENCROSS;Check red/blue cross
diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc
index 8e973913e..5a517b107 100644
--- a/rtengine/dcraw.cc
+++ b/rtengine/dcraw.cc
@@ -9486,7 +9486,7 @@ dng_skip:
adobe_coeff (make, model);
if(!strncmp(make, "Samsung", 7) && !strncmp(model, "NX1",3))
adobe_coeff (make, model);
- if(!strncmp(make, "Pentax", 6) && (!strncmp(model, "K10D",4) || !strncmp(model, "K-70",4)))
+ if(!strncmp(make, "Pentax", 6) && (!strncmp(model, "K10D",4) || !strncmp(model, "K-70",4) || !strncmp(model, "K-1",3)))
adobe_coeff (make, model);
if(!strncmp(make, "Leica", 5) && !strncmp(model, "Q",1))
adobe_coeff (make, model);
diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc
index e641ed777..1d8554792 100644
--- a/rtengine/demosaic_algos.cc
+++ b/rtengine/demosaic_algos.cc
@@ -1315,7 +1315,7 @@ void RawImageSource::jdl_interpolate_omp() // from "Lassus"
// Adapted to RawTherapee by Jacques Desmis 3/2013
// Improved speed and reduced memory consumption by Ingo Weyrich 2/2015
//TODO Tiles to reduce memory consumption
-SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, int iterations)
+SSEFUNCTION void RawImageSource::lmmse_interpolate_omp(int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue, int iterations)
{
const int width = winw, height = winh;
const int ba = 10;
diff --git a/rtengine/procevents.h b/rtengine/procevents.h
index 86deb7d6d..13294c73a 100644
--- a/rtengine/procevents.h
+++ b/rtengine/procevents.h
@@ -498,6 +498,7 @@ enum ProcEvent {
EvPixelShiftMedian3 = 468,
EvPixelShiftMotionMethod = 469,
EvPixelShiftSmooth = 470,
+ EvPixelShiftLmmse = 471,
NUMOFEVENTS
};
diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc
index 18437431d..dc6b804a1 100644
--- a/rtengine/procparams.cc
+++ b/rtengine/procparams.cc
@@ -899,6 +899,7 @@ void RAWParams::BayerSensor::setPixelShiftDefaults()
pixelShiftBlur = true;
pixelShiftSmoothFactor = 0.7;
pixelShiftExp0 = false;
+ pixelShiftLmmse = false;
pixelShiftNonGreenCross = true;
pixelShiftNonGreenCross2 = false;
pixelShiftNonGreenAmaze = false;
@@ -3492,6 +3493,10 @@ int ProcParams::save (const Glib::ustring &fname, const Glib::ustring &fname2, b
keyFile.set_boolean ("RAW Bayer", "pixelShiftExp0", raw.bayersensor.pixelShiftExp0 );
}
+ if (!pedited || pedited->raw.bayersensor.pixelShiftLmmse) {
+ keyFile.set_boolean ("RAW Bayer", "pixelShiftLmmse", raw.bayersensor.pixelShiftLmmse );
+ }
+
if (!pedited || pedited->raw.bayersensor.pixelShiftNonGreenCross) {
keyFile.set_boolean ("RAW Bayer", "pixelShiftNonGreenCross", raw.bayersensor.pixelShiftNonGreenCross );
}
@@ -7752,6 +7757,14 @@ int ProcParams::load (const Glib::ustring &fname, ParamsEdited* pedited)
}
}
+ if (keyFile.has_key ("RAW Bayer", "pixelShiftLmmse")) {
+ raw.bayersensor.pixelShiftLmmse = keyFile.get_boolean("RAW Bayer", "pixelShiftLmmse");
+
+ if (pedited) {
+ pedited->raw.bayersensor.pixelShiftLmmse = true;
+ }
+ }
+
if (keyFile.has_key ("RAW Bayer", "pixelShiftNonGreenCross")) {
raw.bayersensor.pixelShiftNonGreenCross = keyFile.get_boolean("RAW Bayer", "pixelShiftNonGreenCross");
@@ -8237,6 +8250,7 @@ bool ProcParams::operator== (const ProcParams& other)
&& raw.bayersensor.pixelShiftBlur == other.raw.bayersensor.pixelShiftBlur
&& raw.bayersensor.pixelShiftSmoothFactor == other.raw.bayersensor.pixelShiftSmoothFactor
&& raw.bayersensor.pixelShiftExp0 == other.raw.bayersensor.pixelShiftExp0
+ && raw.bayersensor.pixelShiftLmmse == other.raw.bayersensor.pixelShiftLmmse
&& raw.bayersensor.pixelShiftNonGreenCross == other.raw.bayersensor.pixelShiftNonGreenCross
&& raw.bayersensor.pixelShiftNonGreenCross2 == other.raw.bayersensor.pixelShiftNonGreenCross2
&& raw.bayersensor.pixelShiftNonGreenAmaze == other.raw.bayersensor.pixelShiftNonGreenAmaze
diff --git a/rtengine/procparams.h b/rtengine/procparams.h
index 21fe97855..096decd90 100644
--- a/rtengine/procparams.h
+++ b/rtengine/procparams.h
@@ -1231,6 +1231,7 @@ public:
bool pixelShiftBlur;
double pixelShiftSmoothFactor;
bool pixelShiftExp0;
+ bool pixelShiftLmmse;
bool pixelShiftNonGreenCross;
bool pixelShiftNonGreenCross2;
bool pixelShiftNonGreenAmaze;
diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc
index e5cce8f57..327c6e3ba 100644
--- a/rtengine/rawimagesource.cc
+++ b/rtengine/rawimagesource.cc
@@ -2039,12 +2039,20 @@ void RawImageSource::demosaic(const RAWParams &raw)
if((bayerParams.pixelShiftMotion > 0 || bayerParams.pixelShiftAutomatic) && numFrames == 4) {
if(bayerParams.pixelShiftMedian) { // We need the amaze demosaiced frames for motion correction
if(!bayerParams.pixelShiftMedian3) {
- amaze_demosaic_RT (0, 0, W, H, *(rawDataFrames[0]), red, green, blue);
+ if(bayerParams.pixelShiftLmmse) {
+ lmmse_interpolate_omp(W, H, *(rawDataFrames[0]), red, green, blue, raw.bayersensor.lmmse_iterations);
+ } else {
+ amaze_demosaic_RT (0, 0, W, H, *(rawDataFrames[0]), red, green, blue);
+ }
multi_array2D redTmp(W,H);
multi_array2D greenTmp(W,H);
multi_array2D blueTmp(W,H);
for(int i=0;i<3;i++) {
- amaze_demosaic_RT (0, 0, W, H, *(rawDataFrames[i+1]), redTmp[i], greenTmp[i], blueTmp[i]);
+ if(bayerParams.pixelShiftLmmse) {
+ lmmse_interpolate_omp(W, H, *(rawDataFrames[i+1]), redTmp[i], greenTmp[i], blueTmp[i], raw.bayersensor.lmmse_iterations);
+ } else {
+ amaze_demosaic_RT (0, 0, W, H, *(rawDataFrames[i+1]), redTmp[i], greenTmp[i], blueTmp[i]);
+ }
}
#pragma omp parallel for schedule(dynamic,16)
for(int i=border;i blueTmp(W,H);
for(int i=0, frameIndex = 0;i<4;++i) {
if(i != currFrame) {
- amaze_demosaic_RT (0, 0, W, H, *(rawDataFrames[i]), redTmp[frameIndex], greenTmp[frameIndex], blueTmp[frameIndex]);
+ if(bayerParams.pixelShiftLmmse) {
+ lmmse_interpolate_omp(W, H, *(rawDataFrames[i]), redTmp[frameIndex], greenTmp[frameIndex], blueTmp[frameIndex], raw.bayersensor.lmmse_iterations);
+ } else {
+ amaze_demosaic_RT (0, 0, W, H, *(rawDataFrames[i]), redTmp[frameIndex], greenTmp[frameIndex], blueTmp[frameIndex]);
+ }
++frameIndex;
}
}
@@ -2124,10 +2136,18 @@ void RawImageSource::demosaic(const RAWParams &raw)
}
}
} else {
- amaze_demosaic_RT (0, 0, W, H, rawData, red, green, blue); // for non pixelshift files use amaze if pixelshift is selected. We need it also for motion correction
+ if(bayerParams.pixelShiftLmmse) {
+ lmmse_interpolate_omp(W, H, rawData, red, green, blue, raw.bayersensor.lmmse_iterations);
+ } else {
+ amaze_demosaic_RT (0, 0, W, H, rawData, red, green, blue); // for non pixelshift files use amaze if pixelshift is selected. We need it also for motion correction
+ }
}
} else {
- amaze_demosaic_RT (0, 0, W, H, rawData, red, green, blue); // for non pixelshift files use amaze if pixelshift is selected. We need it also for motion correction
+ if(bayerParams.pixelShiftLmmse) {
+ lmmse_interpolate_omp(W, H, rawData, red, green, blue, raw.bayersensor.lmmse_iterations);
+ } else {
+ amaze_demosaic_RT (0, 0, W, H, rawData, red, green, blue); // for non pixelshift files use amaze if pixelshift is selected. We need it also for motion correction
+ }
}
}
pixelshift(0, 0, W, H, bayerParams, currFrame, ri->get_model(), raw.expos);
@@ -2139,7 +2159,7 @@ void RawImageSource::demosaic(const RAWParams &raw)
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::igv]) {
igv_interpolate(W, H);
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::lmmse]) {
- lmmse_interpolate_omp(W, H, raw.bayersensor.lmmse_iterations);
+ lmmse_interpolate_omp(W, H, rawData, red, green, blue, raw.bayersensor.lmmse_iterations);
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::fast] ) {
fast_demosaic (0, 0, W, H);
} else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::mono] ) {
diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h
index d54bcd49d..280b546f4 100644
--- a/rtengine/rawimagesource.h
+++ b/rtengine/rawimagesource.h
@@ -236,7 +236,7 @@ protected:
void ppg_demosaic();
void jdl_interpolate_omp();
void igv_interpolate(int winw, int winh);
- void lmmse_interpolate_omp(int winw, int winh, int iterations);
+ void lmmse_interpolate_omp(int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue, int iterations);
void amaze_demosaic_RT(int winx, int winy, int winw, int winh, array2D &rawData, array2D &red, array2D &green, array2D &blue);//Emil's code for AMaZE
void fast_demosaic(int winx, int winy, int winw, int winh );//Emil's code for fast demosaicing
void dcb_demosaic(int iterations, bool dcb_enhance);
diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc
index 891f191b2..d759f6866 100644
--- a/rtengine/refreshmap.cc
+++ b/rtengine/refreshmap.cc
@@ -497,7 +497,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
DEMOSAIC, // EvPixelShiftMedian
DEMOSAIC, // EvPixelShiftMedian3
DEMOSAIC, // EvPixelShiftMotionMethod
- DEMOSAIC // EvPixelShiftSmooth
+ DEMOSAIC, // EvPixelShiftSmooth
+ DEMOSAIC // EvPixelShiftLmmse
};
diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc
index ef2905f8d..dbf41781a 100644
--- a/rtgui/bayerprocess.cc
+++ b/rtgui/bayerprocess.cc
@@ -169,6 +169,9 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftExp0 = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTEXP0")));
pixelShiftOptions->pack_start(*pixelShiftExp0);
+ pixelShiftLmmse = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTLMMSE")));
+ pixelShiftOptions->pack_start(*pixelShiftLmmse);
+
pixelShiftMotion = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTMOTION"), 0, 100, 1, 70));
pixelShiftMotion->setAdjusterListener (this);
pixelShiftMotion->set_tooltip_text (M("TP_RAW_PIXELSHIFTMOTION_TOOLTIP"));
@@ -313,6 +316,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
pixelShiftGreenconn = pixelShiftGreen->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftGreenChanged), true);
pixelShiftBlurconn = pixelShiftBlur->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftBlurChanged), true);
pixelShiftExp0conn = pixelShiftExp0->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftExp0Changed), true);
+ pixelShiftLmmseconn = pixelShiftLmmse->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftLmmseChanged), true);
pixelShiftNonGreenCrossconn = pixelShiftNonGreenCross->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenCrossChanged), true);
pixelShiftNonGreenCross2conn = pixelShiftNonGreenCross2->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenCross2Changed), true);
pixelShiftNonGreenAmazeconn = pixelShiftNonGreenAmaze->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenAmazeChanged), true);
@@ -355,6 +359,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params
pixelShiftBlur->set_inconsistent(!pedited->raw.bayersensor.pixelShiftBlur);
pixelShiftSmooth->setEditedState ( pedited->raw.bayersensor.pixelShiftSmooth ? Edited : UnEdited);
pixelShiftExp0->set_inconsistent(!pedited->raw.bayersensor.pixelShiftExp0);
+ pixelShiftLmmse->set_inconsistent(!pedited->raw.bayersensor.pixelShiftLmmse);
pixelShiftNonGreenCross->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenCross);
pixelShiftNonGreenCross2->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenCross2);
pixelShiftNonGreenAmaze->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenAmaze);
@@ -400,6 +405,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params
pixelShiftBlur->set_active(pp->raw.bayersensor.pixelShiftBlur);
pixelShiftSmooth->setValue (pp->raw.bayersensor.pixelShiftSmoothFactor);
pixelShiftExp0->set_active(pp->raw.bayersensor.pixelShiftExp0);
+ pixelShiftLmmse->set_active(pp->raw.bayersensor.pixelShiftLmmse);
pixelShiftNonGreenCross->set_active(pp->raw.bayersensor.pixelShiftNonGreenCross);
pixelShiftNonGreenCross2->set_active(pp->raw.bayersensor.pixelShiftNonGreenCross2);
pixelShiftNonGreenAmaze->set_active(pp->raw.bayersensor.pixelShiftNonGreenAmaze);
@@ -499,6 +505,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe
pp->raw.bayersensor.pixelShiftBlur = pixelShiftBlur->get_active();
pp->raw.bayersensor.pixelShiftSmoothFactor = pixelShiftSmooth->getValue();
pp->raw.bayersensor.pixelShiftExp0 = pixelShiftExp0->get_active();
+ pp->raw.bayersensor.pixelShiftLmmse = pixelShiftLmmse->get_active();
pp->raw.bayersensor.pixelShiftNonGreenCross = pixelShiftNonGreenCross->get_active();
pp->raw.bayersensor.pixelShiftNonGreenCross2 = pixelShiftNonGreenCross2->get_active();
pp->raw.bayersensor.pixelShiftNonGreenAmaze = pixelShiftNonGreenAmaze->get_active();
@@ -546,6 +553,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe
pedited->raw.bayersensor.pixelShiftBlur = !pixelShiftBlur->get_inconsistent();
pedited->raw.bayersensor.pixelShiftSmooth = pixelShiftSmooth->getEditedState();
pedited->raw.bayersensor.pixelShiftExp0 = !pixelShiftExp0->get_inconsistent();
+ pedited->raw.bayersensor.pixelShiftLmmse = !pixelShiftLmmse->get_inconsistent();
pedited->raw.bayersensor.pixelShiftNonGreenCross = !pixelShiftNonGreenCross->get_inconsistent();
pedited->raw.bayersensor.pixelShiftNonGreenCross2 = !pixelShiftNonGreenCross2->get_inconsistent();
pedited->raw.bayersensor.pixelShiftNonGreenAmaze = !pixelShiftNonGreenAmaze->get_inconsistent();
@@ -1018,6 +1026,26 @@ void BayerProcess::pixelShiftExp0Changed ()
}
}
+void BayerProcess::pixelShiftLmmseChanged ()
+{
+ if (batchMode) {
+ if (pixelShiftLmmse->get_inconsistent()) {
+ pixelShiftLmmse->set_inconsistent (false);
+ pixelShiftLmmseconn.block (true);
+ pixelShiftLmmse->set_active (false);
+ pixelShiftLmmseconn.block (false);
+ } else if (lastDCBen) {
+ pixelShiftLmmse->set_inconsistent (true);
+ }
+
+ lastDCBen = pixelShiftLmmse->get_active ();
+ }
+
+ if (listener) {
+ listener->panelChanged (EvPixelShiftLmmse, pixelShiftLmmse->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED"));
+ }
+}
+
void BayerProcess::pixelShiftNonGreenCrossChanged ()
{
if (batchMode) {
diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h
index def4021ce..c8658f5bf 100644
--- a/rtgui/bayerprocess.h
+++ b/rtgui/bayerprocess.h
@@ -60,6 +60,7 @@ protected:
Gtk::CheckButton* pixelShiftHoleFill;
Gtk::CheckButton* pixelShiftMedian;
Gtk::CheckButton* pixelShiftMedian3;
+ Gtk::CheckButton* pixelShiftLmmse;
Adjuster* pixelShiftSmooth;
Adjuster* pixelShiftStddevFactorGreen;
Adjuster* pixelShiftStddevFactorRed;
@@ -76,7 +77,7 @@ protected:
sigc::connection methodconn, imagenumberconn, psmcconn, dcbEnhconn,
pixelShiftShowMotionconn, pixelShiftShowMotionMaskOnlyconn, pixelShiftAutomaticconn,
pixelShiftNonGreenHorizontalconn, pixelShiftNonGreenVerticalconn, pixelShiftHoleFillconn, pixelShiftMedianconn, pixelShiftMedian3conn, pixelShiftNonGreenCrossconn,
- pixelShiftNonGreenCross2conn, pixelShiftNonGreenAmazeconn, pixelShiftGreenconn, pixelShiftBlurconn, pixelShiftSmoothconn, pixelShiftExp0conn, pixelShiftMotionMethodConn;
+ pixelShiftNonGreenCross2conn, pixelShiftNonGreenAmazeconn, pixelShiftGreenconn, pixelShiftBlurconn, pixelShiftSmoothconn, pixelShiftExp0conn, pixelShiftLmmseconn, pixelShiftMotionMethodConn;
public:
BayerProcess ();
@@ -102,6 +103,7 @@ public:
void pixelShiftGreenChanged();
void pixelShiftBlurChanged();
void pixelShiftExp0Changed();
+ void pixelShiftLmmseChanged();
void pixelShiftNonGreenCrossChanged();
void pixelShiftNonGreenCross2Changed();
void pixelShiftNonGreenAmazeChanged();
diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc
index e1303095a..939413f18 100644
--- a/rtgui/paramsedited.cc
+++ b/rtgui/paramsedited.cc
@@ -394,6 +394,7 @@ void ParamsEdited::set (bool v)
raw.bayersensor.pixelShiftBlur = v;
raw.bayersensor.pixelShiftSmooth = v;
raw.bayersensor.pixelShiftExp0 = v;
+ raw.bayersensor.pixelShiftLmmse = v;
raw.bayersensor.pixelShiftNonGreenCross = v;
raw.bayersensor.pixelShiftNonGreenCross2 = v;
raw.bayersensor.pixelShiftNonGreenAmaze = v;
@@ -917,6 +918,7 @@ void ParamsEdited::initFrom (const std::vector
raw.bayersensor.pixelShiftBlur = raw.bayersensor.pixelShiftBlur && p.raw.bayersensor.pixelShiftBlur == other.raw.bayersensor.pixelShiftBlur;
raw.bayersensor.pixelShiftSmooth = raw.bayersensor.pixelShiftSmooth && p.raw.bayersensor.pixelShiftSmoothFactor == other.raw.bayersensor.pixelShiftSmoothFactor;
raw.bayersensor.pixelShiftExp0 = raw.bayersensor.pixelShiftExp0 && p.raw.bayersensor.pixelShiftExp0 == other.raw.bayersensor.pixelShiftExp0;
+ raw.bayersensor.pixelShiftLmmse = raw.bayersensor.pixelShiftLmmse && p.raw.bayersensor.pixelShiftLmmse == other.raw.bayersensor.pixelShiftLmmse;
raw.bayersensor.pixelShiftNonGreenCross = raw.bayersensor.pixelShiftNonGreenCross && p.raw.bayersensor.pixelShiftNonGreenCross == other.raw.bayersensor.pixelShiftNonGreenCross;
raw.bayersensor.pixelShiftNonGreenCross2 = raw.bayersensor.pixelShiftNonGreenCross2 && p.raw.bayersensor.pixelShiftNonGreenCross2 == other.raw.bayersensor.pixelShiftNonGreenCross2;
raw.bayersensor.pixelShiftNonGreenAmaze = raw.bayersensor.pixelShiftNonGreenAmaze && p.raw.bayersensor.pixelShiftNonGreenAmaze == other.raw.bayersensor.pixelShiftNonGreenAmaze;
@@ -2428,6 +2430,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
toEdit.raw.bayersensor.pixelShiftExp0 = mods.raw.bayersensor.pixelShiftExp0;
}
+ if (raw.bayersensor.pixelShiftLmmse) {
+ toEdit.raw.bayersensor.pixelShiftLmmse = mods.raw.bayersensor.pixelShiftLmmse;
+ }
+
if (raw.bayersensor.pixelShiftNonGreenCross) {
toEdit.raw.bayersensor.pixelShiftNonGreenCross = mods.raw.bayersensor.pixelShiftNonGreenCross;
}
@@ -2952,7 +2958,7 @@ bool RAWParamsEdited::BayerSensor::isUnchanged() const
return method && imageNum && dcbIterations && dcbEnhance && lmmseIterations/*&& allEnhance*/ && greenEq
&& pixelShiftMotion && pixelShiftMotionCorrection && pixelShiftMotionCorrectionMethod && pixelShiftStddevFactorGreen && pixelShiftStddevFactorRed && pixelShiftStddevFactorBlue && pixelShiftEperIso
&& pixelShiftNreadIso && pixelShiftPrnu && pixelShiftSigma && pixelShiftSum && pixelShiftRedBlueWeight && pixelshiftShowMotion && pixelshiftShowMotionMaskOnly
- && pixelShiftAutomatic && pixelShiftNonGreenHorizontal && pixelShiftNonGreenVertical && pixelShiftHoleFill && pixelShiftMedian && pixelShiftMedian3 && pixelShiftNonGreenCross && pixelShiftNonGreenCross2 && pixelShiftNonGreenAmaze && pixelShiftGreen && pixelShiftBlur && pixelShiftSmooth && pixelShiftExp0
+ && pixelShiftAutomatic && pixelShiftNonGreenHorizontal && pixelShiftNonGreenVertical && pixelShiftHoleFill && pixelShiftMedian && pixelShiftMedian3 && pixelShiftNonGreenCross && pixelShiftNonGreenCross2 && pixelShiftNonGreenAmaze && pixelShiftGreen && pixelShiftBlur && pixelShiftSmooth && pixelShiftExp0 && pixelShiftLmmse
&& linenoise && exBlack0 && exBlack1 && exBlack2 && exBlack3 && exTwoGreen;
}
diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h
index 23b0e240b..5f66c3d18 100644
--- a/rtgui/paramsedited.h
+++ b/rtgui/paramsedited.h
@@ -716,6 +716,7 @@ public:
bool pixelShiftBlur;
bool pixelShiftSmooth;
bool pixelShiftExp0;
+ bool pixelShiftLmmse;
bool pixelShiftNonGreenCross;
bool pixelShiftNonGreenCross2;
bool pixelShiftNonGreenAmaze;