diff --git a/rtdata/languages/default b/rtdata/languages/default index 5fe1a7f30..f15ee1a38 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1656,6 +1656,7 @@ TP_RAW_LMMSEITERATIONS;LMMSE enhancement steps TP_RAW_LMMSE_TOOLTIP;Adds gamma (step 1), median (steps 2-4) and refinement (steps 5-6) to reduce artifacts and improve the signal-to-noise ratio. TP_RAW_PIXELSHIFTADAPTIVE;Adaptive detection TP_RAW_PIXELSHIFTNONGREENHORIZONTAL;Check red/blue horizontal +TP_RAW_PIXELSHIFTNONGREENVERTICAL;Check red/blue vertical TP_RAW_PIXELSHIFTMOTION;Pixelshift motion detection TP_RAW_PIXELSHIFTMOTION_TOOLTIP;0 means no motion detection\n1 - 99 means motion will be detected according to this value. Increase value to increase detection rate\n100 means the Amaze demosaiced frame will be used TP_RAW_PIXELSHIFTMOTIONCORRECTION;Pixelshift motion correction diff --git a/rtengine/pixelshift.cc b/rtengine/pixelshift.cc index 16757057d..09a1cb8d0 100644 --- a/rtengine/pixelshift.cc +++ b/rtengine/pixelshift.cc @@ -68,7 +68,7 @@ float colourDiff(float a, float b, bool adaptive, float stddevFactor, float eper using namespace std; using namespace rtengine; -void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool detectMotion, int motion, bool showMotion, bool showOnlyMask, unsigned int frame, unsigned int gridSize, bool adaptive, float stddevFactor, float eperIso, float nreadIso, float prnu, bool checkNonGreenHorizontal) +void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool detectMotion, int motion, bool showMotion, bool showOnlyMask, unsigned int frame, unsigned int gridSize, bool adaptive, float stddevFactor, float eperIso, float nreadIso, float prnu, bool checkNonGreenHorizontal, bool checkNonGreenVertical) { BENCHFUN @@ -260,10 +260,6 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det // do not set the motion pixel values. They have already been set by demosaicer or showMotion continue; } -// } else if(showMotion && showOnlyMask) { -// greenDest[j + offsX] = nonGreenDest0[j + offsX] = nonGreenDest1[j + offsX] = 0.f; -// continue; -// } if(adaptive && checkNonGreenHorizontal) { float ng1 = riFrames[(offset << 1) + offset]->data[i][j + offset]; @@ -272,14 +268,13 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det float diff0 = ng0 - ng1; float diff2 = ng2 - ng1; if(diff0 * diff2 >= 0.f) { -// float val = std::abs(diff0) > std::abs(diff2) ? ng0 : ng2; float val = (ng0 + ng2) / 2.f; float gridMax = colourDiff(ng1, val, true, stddevFactor, eperIsoNonGreen0, nreadIso, prnu, showMotion); if(gridMax > 0.f) { if(showMotion) { float blend = gridMax * blendFactor; if(!showOnlyMask) { - // if showMotion is enabled make the pixel green + // if showMotion is enabled colourize the pixel nonGreenDest0[j + offsX] = 1000.f + 25000.f * blend; nonGreenDest1[j + offsX] = greenDest[j + offsX] = 0.f; } else { @@ -289,19 +284,20 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det continue; } } + ng1 = riFrames[2 - offset]->data[i + 1][j - offset + 1]; ng0 = riFrames[2 - (offset^1)]->data[i + 1][j - (offset^1) + 2]; ng2 = riFrames[2 - (offset^1)]->data[i + 1][j - (offset^1)]; diff0 = ng0 - ng1; diff2 = ng2 - ng1; if(diff0 * diff2 >= 0.f) { -// float val = std::abs(diff0) > std::abs(diff2) ? ng0 : ng2; float val = (ng0 + ng2) / 2.f; float gridMax = colourDiff(ng1, val, true, stddevFactor, eperIsoNonGreen2, nreadIso, prnu, showMotion); if(gridMax > 0.f) { if(showMotion) { float blend = gridMax * blendFactor; if(!showOnlyMask) { + // if showMotion is enabled colourize the pixel nonGreenDest1[j + offsX] = 1000.f + 25000.f * blend; nonGreenDest0[j + offsX] = greenDest[j + offsX] = 0.f; } else { @@ -311,121 +307,58 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, bool det continue; } } + } + if(adaptive && checkNonGreenVertical) { + float ng1 = riFrames[(offset << 1) + offset]->data[i][j + offset]; + float ng0 = riFrames[((offset << 1) + offset)^1]->data[i][j + offset]; + float ng2 = riFrames[((offset << 1) + offset)^1]->data[i+2][j + offset]; -// float ngDiff = nonGreenDiff(ng0,ng1,ng2); -// float korr = log2Lut[((int)(riFrames[(offset << 1) + offset]->data[i][j + offset] * scaleNonGreen0))>>1]; -// if(ngDiff > 0.5f - korr) { -// if(showMotion) { -// if(!showOnlyMask) { -// // if showMotion is enabled make the pixel green -// nonGreenDest0[j + offsX] = 1000.f + 25000.f; -// nonGreenDest1[j + offsX] = greenDest[j + offsX] = 0.f; -// } else { -// greenDest[j + offsX] = nonGreenDest0[j + offsX] = nonGreenDest1[j + offsX] = 1000.f + 25000.f; -// } -// } -// continue; -// } -// -// ng1 = riFrames[2 - offset]->data[i + 1][j - offset + 1]; -// ng0 = riFrames[2 - (offset^1)]->data[i + 1][j - (offset^1) + 2]; -// ng2 = riFrames[2 - (offset^1)]->data[i + 1][j - (offset^1)]; -// ngDiff = nonGreenDiff(ng0,ng1,ng2); -// korr = log2Lut[((int)(riFrames[2 - offset]->data[i + 1][j - offset + 1] * scaleNonGreen2))>>1]; -// if(ngDiff > 0.5f - korr) { -// if(showMotion) { -// if(!showOnlyMask) { -// // if showMotion is enabled make the pixel green -// nonGreenDest0[j + offsX] = 1000.f + 25000.f; -// nonGreenDest1[j + offsX] = greenDest[j + offsX] = 0.f; -// } else { -// greenDest[j + offsX] = nonGreenDest0[j + offsX] = nonGreenDest1[j + offsX] = 1000.f + 25000.f; -// } -// } -// continue; -// } + float diff0 = ng0 - ng1; + float diff2 = ng2 - ng1; + if(diff0 * diff2 >= 0.f) { + float val = (ng0 + ng2) / 2.f; + float gridMax = colourDiff(ng1, val, true, stddevFactor, eperIsoNonGreen0, nreadIso, prnu, showMotion); + if(gridMax > 0.f) { + if(showMotion) { + float blend = gridMax * blendFactor; + if(!showOnlyMask) { + // if showMotion is enabled colourize the pixel + nonGreenDest0[j + offsX] = 1000.f + 25000.f * blend; + nonGreenDest1[j + offsX] = greenDest[j + offsX] = 0.f; + } else { + greenDest[j + offsX] = nonGreenDest0[j + offsX] = nonGreenDest1[j + offsX] = 1000.f + 25000.f * blend; + } + } + continue; + } + } + + ng1 = riFrames[2 - offset]->data[i + 1][j - offset + 1]; + ng0 = riFrames[3 - ((offset<<1) + offset)]->data[i - 1][j - offset + 1]; + ng2 = riFrames[3 - ((offset<<1) + offset)]->data[i + 1][j - offset + 1]; + + diff0 = ng0 - ng1; + diff2 = ng2 - ng1; + if(diff0 * diff2 >= 0.f) { + float val = (ng0 + ng2) / 2.f; + float gridMax = colourDiff(ng1, val, true, stddevFactor, eperIsoNonGreen2, nreadIso, prnu, showMotion); + if(gridMax > 0.f) { + if(showMotion) { + float blend = gridMax * blendFactor; + if(!showOnlyMask) { + // if showMotion is enabled colourize the pixel + nonGreenDest1[j + offsX] = 1000.f + 25000.f * blend; + nonGreenDest0[j + offsX] = greenDest[j + offsX] = 0.f; + } else { + greenDest[j + offsX] = nonGreenDest0[j + offsX] = nonGreenDest1[j + offsX] = 1000.f + 25000.f * blend; + } + } + continue; + } + } } } -// if(false && detectMotion && checkRedBlue) { -// float ng1 = riFrames[(offset << 1) + offset]->data[i][j + offset]; -// float ng0 = riFrames[((offset^1) << 1) + (offset^1)]->data[i][j + (offset^1)+1]; -// float ng2 = riFrames[((offset^1) << 1) + (offset^1)]->data[i][j + (offset^1)-1]; -// float diff0 = ng1 - ng0; -// float diff2 = ng1 - ng2; -// float gridMax; -// if(diff0 * diff2 > 0.f) { -//// if(colourDiff(ng1, fabsf(diff0) < fabsf(diff2) ? ng0 : ng2) > motionThreshold ) { -// gridMax = colourDiff(ng1, std::max(ng0, ng2)); -//// gridMax = colourDiff(ng1, ((ng0 + ng2) / 2.f)); -// if(gridMax > motionThreshold ) { -// float factor = 1.f / (1.f - motionThreshold); -// float blend = (gridMax - motionThreshold) * factor; -// if(showMotion) { -// // if showMotion is enabled make the pixel green -// greenDest[j + offsX] = nonGreenDest1[j + offsX] = 0.f; -// nonGreenDest0[j + offsX] = 20000.f; -// continue; -//// greenDest[j + offsX+1] = nonGreenDest1[j + offsX+1] = 0.f; -//// nonGreenDest0[j + offsX+1] = 20000.f; -// } -// greenDest[j + offsX] = (riFrames[1 - offset]->data[i - offset + 1][j] + riFrames[3 - offset]->data[i + offset][j + 1]) / 2.f; -// -//// greenDest[j + offsX] = intp(blend, greenDest[j + offsX],(riFrames[1 - offset]->data[i - offset + 1][j] + riFrames[3 - offset]->data[i + offset][j + 1]) / 2.f); -//// nonGreenDest0[j + offsX] = (ng1 + (diff0 < diff2 ? ng0 : ng2)) / 2.f; -// nonGreenDest0[j + offsX] = intp(blend, nonGreenDest0[j + offsX], riFrames[(offset << 1) + offset]->data[i][j + offset]); -//// nonGreenDest0[j + offsX] = intp(blend, nonGreenDest0[j + offsX], riFrames[(offset << 1) + offset]->data[i][j + offset]); -// nonGreenDest1[j + offsX] = riFrames[2 - offset]->data[i + 1][j - offset + 1]; -// -//// nonGreenDest1[j + offsX] = intp(blend, nonGreenDest1[j + offsX], riFrames[2 - offset]->data[i + 1][j - offset + 1]); -// -//// if(skipNext) { -//// // treat the horizontally next pixel also as motion -//// j++; -//// offset ^= 1; -//// } -// // do not set the motion pixel values. They have already been set by demosaicer or showMotion -// continue; -// } -// } -// ng1 = riFrames[2 - offset]->data[i + 1][j - offset + 1]; -// ng0 = riFrames[2 - (offset^1)]->data[i + 1][j - (offset^1) + 2]; -// ng2 = riFrames[2 - (offset^1)]->data[i + 1][j - (offset^1)]; -// diff0 = ng1 - ng0; -// diff2 = ng1 - ng2; -// if(signbit(diff0) == signbit(diff2)) { -//// if(colourDiff(ng1, fabsf(diff0) < fabsf(diff2) ? ng0 : ng2) > motionThreshold ) { -// gridMax = colourDiff(ng1, std::max(ng0, ng2)); -//// gridMax = colourDiff(ng1, ((ng0 + ng2) / 2.f)); -// if(gridMax > motionThreshold ) { -// float factor = 1.f / (1.f - motionThreshold); -// float blend = (gridMax - motionThreshold) * factor; -// if(showMotion) { -// // if showMotion is enabled make the pixel green -// greenDest[j + offsX] = nonGreenDest0[j + offsX] = 0.f; -// nonGreenDest1[j + offsX] = 20000.f; -//// greenDest[j + offsX+1] = nonGreenDest0[j + offsX+1] = 0.f; -//// nonGreenDest1[j + offsX+1] = 20000.f; -//continue; -// } -// greenDest[j + offsX] = (riFrames[1 - offset]->data[i - offset + 1][j] + riFrames[3 - offset]->data[i + offset][j + 1]) / 2.f; -//// greenDest[j + offsX] = intp(blend, greenDest[j + offsX],(riFrames[1 - offset]->data[i - offset + 1][j] + riFrames[3 - offset]->data[i + offset][j + 1]) / 2.f); -//// nonGreenDest0[j + offsX] = intp(blend, nonGreenDest0[j + offsX], riFrames[(offset << 1) + offset]->data[i][j + offset]); -// nonGreenDest0[j + offsX] = riFrames[(offset << 1) + offset]->data[i][j + offset]; -// -//// nonGreenDest1[j + offsX] = (ng1 + (diff0 < diff2 ? ng0 : ng2)) / 2.f; -// nonGreenDest1[j + offsX] = intp(blend, nonGreenDest1[j + offsX], riFrames[2 - offset]->data[i + 1][j - offset + 1]); -//// if(skipNext) { -//// // treat the horizontally next pixel also as motion -//// j++; -//// offset ^= 1; -//// } -// // do not set the motion pixel values. They have already been set by demosaicer or showMotion -// continue; -// } -// } -// } - if(showMotion && showOnlyMask) { greenDest[j + offsX] = nonGreenDest0[j + offsX] = nonGreenDest1[j + offsX] = 0.f; continue; diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index b8c475be4..3671b2c71 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -895,6 +895,7 @@ void RAWParams::setDefaults() bayersensor.pixelshiftShowMotionMaskOnly = false; bayersensor.pixelShiftAutomatic = true; bayersensor.pixelShiftNonGreenHorizontal = false; + bayersensor.pixelShiftNonGreenVertical = false; bayersensor.black0 = 0.0; bayersensor.black1 = 0.0; bayersensor.black2 = 0.0; @@ -3414,6 +3415,10 @@ int ProcParams::save (const Glib::ustring &fname, const Glib::ustring &fname2, b keyFile.set_boolean ("RAW Bayer", "pixelShiftNonGreenHorizontal", raw.bayersensor.pixelShiftNonGreenHorizontal ); } + if (!pedited || pedited->raw.bayersensor.pixelShiftNonGreenVertical) { + keyFile.set_boolean ("RAW Bayer", "pixelShiftNonGreenVertical", raw.bayersensor.pixelShiftNonGreenVertical ); + } + //if (!pedited || pedited->raw.bayersensor.allEnhance) keyFile.set_boolean ("RAW Bayer", "ALLEnhance", raw.bayersensor.all_enhance ); if (!pedited || pedited->raw.xtranssensor.method) { @@ -7551,6 +7556,15 @@ int ProcParams::load (const Glib::ustring &fname, ParamsEdited* pedited) pedited->raw.bayersensor.pixelShiftNonGreenHorizontal = true; } } + + if (keyFile.has_key ("RAW Bayer", "pixelShiftNonGreenVertical")) { + raw.bayersensor.pixelShiftNonGreenVertical = keyFile.get_boolean("RAW Bayer", "pixelShiftNonGreenVertical"); + + if (pedited) { + pedited->raw.bayersensor.pixelShiftNonGreenVertical = true; + } + } + //if (keyFile.has_key ("RAW Bayer", "ALLEnhance")) { raw.bayersensor.all_enhance = keyFile.get_boolean("RAW Bayer", "ALLEnhance"); if (pedited) pedited->raw.bayersensor.allEnhance = true; } } diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 20fda6c88..747afc250 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1192,6 +1192,7 @@ public: bool pixelshiftShowMotionMaskOnly; bool pixelShiftAutomatic; bool pixelShiftNonGreenHorizontal; + bool pixelShiftNonGreenVertical; bool dcb_enhance; //bool all_enhance; }; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 44b1221fa..35a24085e 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1966,7 +1966,7 @@ void RawImageSource::demosaic(const RAWParams &raw) amaze_demosaic_RT (0, 0, W, H); // for non pixelshift files use amaze if pixelshift is selected. We need it also for motion correction } if(numFrames == 4) { - pixelshift(0, 0, W, H, raw.bayersensor.pixelshiftMotion > 0, raw.bayersensor.pixelshiftMotion, raw.bayersensor.pixelshiftShowMotion, raw.bayersensor.pixelshiftShowMotionMaskOnly, currFrame, raw.bayersensor.pixelshiftMotionCorrection, raw.bayersensor.pixelShiftAutomatic, raw.bayersensor.pixelShiftStddevFactor, raw.bayersensor.pixelShiftEperIso, raw.bayersensor.pixelShiftNreadIso, raw.bayersensor.pixelShiftPrnu, raw.bayersensor.pixelShiftNonGreenHorizontal); + pixelshift(0, 0, W, H, raw.bayersensor.pixelshiftMotion > 0, raw.bayersensor.pixelshiftMotion, raw.bayersensor.pixelshiftShowMotion, raw.bayersensor.pixelshiftShowMotionMaskOnly, currFrame, raw.bayersensor.pixelshiftMotionCorrection, raw.bayersensor.pixelShiftAutomatic, raw.bayersensor.pixelShiftStddevFactor, raw.bayersensor.pixelShiftEperIso, raw.bayersensor.pixelShiftNreadIso, raw.bayersensor.pixelShiftPrnu, raw.bayersensor.pixelShiftNonGreenHorizontal, raw.bayersensor.pixelShiftNonGreenVertical); } } else if (raw.bayersensor.method == RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::dcb] ) { dcb_demosaic(raw.bayersensor.dcb_iterations, raw.bayersensor.dcb_enhance); diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index 3bf44ad8c..ce0e75f49 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -263,7 +263,7 @@ protected: void xtransborder_interpolate (int border); void xtrans_interpolate (const int passes, const bool useCieLab); void fast_xtrans_interpolate (); - void pixelshift(int winx, int winy, int winw, int winh, bool detectMotion, int motion, bool showMotion, bool showOnlyMask, unsigned int frame, unsigned int gridSize, bool adaptive, float stddevFactor, float eperIso, float nreadIso, float prnu, bool checkNonGreenHorizontal); + void pixelshift(int winx, int winy, int winw, int winh, bool detectMotion, int motion, bool showMotion, bool showOnlyMask, unsigned int frame, unsigned int gridSize, bool adaptive, float stddevFactor, float eperIso, float nreadIso, float prnu, bool checkNonGreenHorizontal, bool checkNonGreenVertical); void hflip (Imagefloat* im); void vflip (Imagefloat* im); diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index db34ba8f9..87900cead 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -95,6 +95,9 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA pixelShiftNonGreenHorizontal = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTNONGREENHORIZONTAL"))); pixelShiftOptions->pack_start(*pixelShiftNonGreenHorizontal); + pixelShiftNonGreenVertical = Gtk::manage (new Gtk::CheckButton(M("TP_RAW_PIXELSHIFTNONGREENVERTICAL"))); + pixelShiftOptions->pack_start(*pixelShiftNonGreenVertical); + pixelShiftMotion = Gtk::manage (new Adjuster (M("TP_RAW_PIXELSHIFTMOTION"), 0, 100, 1, 70)); pixelShiftMotion->setAdjusterListener (this); pixelShiftMotion->set_tooltip_markup (M("TP_RAW_PIXELSHIFTMOTION_TOOLTIP")); @@ -189,6 +192,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA pixelShiftShowMotionMaskOnlyconn = pixelShiftShowMotionMaskOnly->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftShowMotionMaskOnlyChanged), true); pixelShiftAutomaticconn = pixelShiftAutomatic->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftAutomaticChanged), true); pixelShiftNonGreenHorizontalconn = pixelShiftNonGreenHorizontal->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenHorizontalChanged), true); + pixelShiftNonGreenVerticalconn = pixelShiftNonGreenVertical->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::pixelShiftNonGreenVerticalChanged), true); //allEnhconn = allEnhance->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::allEnhanceChanged), true); } @@ -220,6 +224,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params pixelShiftShowMotionMaskOnly->set_inconsistent(!pedited->raw.bayersensor.pixelshiftShowMotionMaskOnly); pixelShiftAutomatic->set_inconsistent(!pedited->raw.bayersensor.pixelShiftAutomatic); pixelShiftNonGreenHorizontal->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenHorizontal); + pixelShiftNonGreenVertical->set_inconsistent(!pedited->raw.bayersensor.pixelShiftNonGreenVertical); //allEnhance->set_inconsistent(!pedited->raw.bayersensor.allEnhance); lmmseIterations->setEditedState ( pedited->raw.bayersensor.lmmseIterations ? Edited : UnEdited); pixelShiftMotion->setEditedState ( pedited->raw.bayersensor.pixelshiftMotion ? Edited : UnEdited); @@ -245,6 +250,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params pixelShiftShowMotionMaskOnly->set_active(pp->raw.bayersensor.pixelshiftShowMotionMaskOnly); pixelShiftAutomatic->set_active(pp->raw.bayersensor.pixelShiftAutomatic); pixelShiftNonGreenHorizontal->set_active(pp->raw.bayersensor.pixelShiftNonGreenHorizontal); + pixelShiftNonGreenVertical->set_active(pp->raw.bayersensor.pixelShiftNonGreenVertical); ccSteps->setValue (pp->raw.bayersensor.ccSteps); lmmseIterations->setValue (pp->raw.bayersensor.lmmse_iterations); pixelShiftMotion->setValue (pp->raw.bayersensor.pixelshiftMotion); @@ -311,6 +317,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe pp->raw.bayersensor.pixelshiftShowMotionMaskOnly = pixelShiftShowMotionMaskOnly->get_active(); pp->raw.bayersensor.pixelShiftAutomatic = pixelShiftAutomatic->get_active(); pp->raw.bayersensor.pixelShiftNonGreenHorizontal = pixelShiftNonGreenHorizontal->get_active(); + pp->raw.bayersensor.pixelShiftNonGreenVertical = pixelShiftNonGreenVertical->get_active(); int currentRow = method->get_active_row_number(); if( currentRow >= 0 && currentRow < procparams::RAWParams::BayerSensor::numMethods) { @@ -341,6 +348,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe pedited->raw.bayersensor.pixelshiftShowMotionMaskOnly = !pixelShiftShowMotionMaskOnly->get_inconsistent(); pedited->raw.bayersensor.pixelShiftAutomatic = !pixelShiftAutomatic->get_inconsistent(); pedited->raw.bayersensor.pixelShiftNonGreenHorizontal = !pixelShiftNonGreenHorizontal->get_inconsistent(); + pedited->raw.bayersensor.pixelShiftNonGreenVertical = !pixelShiftNonGreenVertical->get_inconsistent(); } } @@ -552,6 +560,7 @@ void BayerProcess::pixelShiftAutomaticChanged () pixelShiftPrnu->set_sensitive(pixelShiftAutomatic->get_active ()); pixelShiftStddevFactor->set_sensitive(pixelShiftAutomatic->get_active ()); pixelShiftNonGreenHorizontal->set_sensitive(pixelShiftAutomatic->get_active ()); + pixelShiftNonGreenVertical->set_sensitive(pixelShiftAutomatic->get_active ()); if (listener) { listener->panelChanged (EvDemosaicPixelshiftMotion, pixelShiftAutomatic->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); @@ -579,6 +588,25 @@ void BayerProcess::pixelShiftNonGreenHorizontalChanged () } } +void BayerProcess::pixelShiftNonGreenVerticalChanged () +{ + if (batchMode) { + if (pixelShiftNonGreenVertical->get_inconsistent()) { + pixelShiftNonGreenVertical->set_inconsistent (false); + pixelShiftNonGreenVerticalconn.block (true); + pixelShiftNonGreenVertical->set_active (false); + pixelShiftNonGreenVerticalconn.block (false); + } else if (lastDCBen) { + pixelShiftNonGreenVertical->set_inconsistent (true); + } + + lastDCBen = pixelShiftNonGreenVertical->get_active (); + } + + if (listener) { + listener->panelChanged (EvDemosaicPixelshiftMotion, pixelShiftNonGreenVertical->get_active() ? M("GENERAL_ENABLED") : M("GENERAL_DISABLED")); + } +} /*void BayerProcess::allEnhanceChanged () { diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h index de1c99cdf..68dab3f95 100644 --- a/rtgui/bayerprocess.h +++ b/rtgui/bayerprocess.h @@ -48,6 +48,7 @@ protected: Gtk::CheckButton* pixelShiftShowMotionMaskOnly; Gtk::CheckButton* pixelShiftAutomatic; Gtk::CheckButton* pixelShiftNonGreenHorizontal; + Gtk::CheckButton* pixelShiftNonGreenVertical; Adjuster* pixelShiftStddevFactor; Adjuster* pixelShiftEperIso; Adjuster* pixelShiftNreadIso; @@ -55,7 +56,7 @@ protected: bool lastDCBen; int oldMethod; //bool lastALLen; - sigc::connection methodconn, imagenumberconn, dcbEnhconn, pixelShiftShowMotionconn, pixelShiftShowMotionMaskOnlyconn, pixelShiftAutomaticconn, pixelShiftNonGreenHorizontalconn; //,allEnhconn; + sigc::connection methodconn, imagenumberconn, dcbEnhconn, pixelShiftShowMotionconn, pixelShiftShowMotionMaskOnlyconn, pixelShiftAutomaticconn, pixelShiftNonGreenHorizontalconn, pixelShiftNonGreenVerticalconn; //,allEnhconn; public: BayerProcess (); @@ -73,6 +74,7 @@ public: void pixelShiftShowMotionMaskOnlyChanged(); void pixelShiftAutomaticChanged(); void pixelShiftNonGreenHorizontalChanged(); + void pixelShiftNonGreenVerticalChanged(); //void allEnhanceChanged(); }; diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index ad3e11d69..d7d101f0a 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -380,6 +380,7 @@ void ParamsEdited::set (bool v) raw.bayersensor.pixelshiftShowMotionMaskOnly = v; raw.bayersensor.pixelShiftAutomatic = v; raw.bayersensor.pixelShiftNonGreenHorizontal = v; + raw.bayersensor.pixelShiftNonGreenVertical = v; raw.bayersensor.greenEq = v; raw.bayersensor.linenoise = v; raw.xtranssensor.method = v; @@ -886,6 +887,7 @@ void ParamsEdited::initFrom (const std::vector raw.bayersensor.pixelshiftShowMotionMaskOnly = raw.bayersensor.pixelshiftShowMotionMaskOnly && p.raw.bayersensor.pixelshiftShowMotionMaskOnly == other.raw.bayersensor.pixelshiftShowMotionMaskOnly; raw.bayersensor.pixelShiftAutomatic = raw.bayersensor.pixelShiftAutomatic && p.raw.bayersensor.pixelShiftAutomatic == other.raw.bayersensor.pixelShiftAutomatic; raw.bayersensor.pixelShiftNonGreenHorizontal = raw.bayersensor.pixelShiftNonGreenHorizontal && p.raw.bayersensor.pixelShiftNonGreenHorizontal == other.raw.bayersensor.pixelShiftNonGreenHorizontal; + raw.bayersensor.pixelShiftNonGreenVertical = raw.bayersensor.pixelShiftNonGreenVertical && p.raw.bayersensor.pixelShiftNonGreenVertical == other.raw.bayersensor.pixelShiftNonGreenVertical; raw.bayersensor.greenEq = raw.bayersensor.greenEq && p.raw.bayersensor.greenthresh == other.raw.bayersensor.greenthresh; raw.bayersensor.linenoise = raw.bayersensor.linenoise && p.raw.bayersensor.linenoise == other.raw.bayersensor.linenoise; raw.xtranssensor.method = raw.xtranssensor.method && p.raw.xtranssensor.method == other.raw.xtranssensor.method; @@ -2338,6 +2340,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.raw.bayersensor.pixelShiftNonGreenHorizontal = mods.raw.bayersensor.pixelShiftNonGreenHorizontal; } + if (raw.bayersensor.pixelShiftNonGreenVertical) { + toEdit.raw.bayersensor.pixelShiftNonGreenVertical = mods.raw.bayersensor.pixelShiftNonGreenVertical; + } + //if (raw.bayersensor.allEnhance) toEdit.raw.bayersensor.all_enhance = mods.raw.bayersensor.all_enhance; if (raw.bayersensor.greenEq) { toEdit.raw.bayersensor.greenthresh = dontforceSet && options.baBehav[ADDSET_PREPROCESS_GREENEQUIL] ? toEdit.raw.bayersensor.greenthresh + mods.raw.bayersensor.greenthresh : mods.raw.bayersensor.greenthresh; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 305c99880..9fe0d6b9b 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -702,6 +702,7 @@ public: bool pixelshiftShowMotionMaskOnly; bool pixelShiftAutomatic; bool pixelShiftNonGreenHorizontal; + bool pixelShiftNonGreenVertical; //bool allEnhance; bool greenEq;