From 5c04e6308f5af947d28106f0918098eab22aebc0 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Wed, 27 Jun 2018 22:34:53 +0200 Subject: [PATCH 1/8] First steps to allow border = 0, issue #4642 --- rtdata/languages/default | 2 ++ rtengine/demosaic_algos.cc | 6 +++--- rtengine/imagesource.h | 1 + rtengine/improccoordinator.cc | 4 ++++ rtengine/procparams.cc | 4 ++++ rtengine/procparams.h | 1 + rtengine/rawimagesource.cc | 4 ++-- rtengine/rawimagesource.h | 4 ++-- rtengine/rcd_demosaic.cc | 2 +- rtengine/simpleprocess.cc | 4 ++++ rtengine/vng4_demosaic_RT.cc | 1 + rtgui/bayerprocess.cc | 25 ++++++++++++++++++++++++- rtgui/bayerprocess.h | 5 +++++ rtgui/paramsedited.cc | 8 +++++++- rtgui/paramsedited.h | 1 + rtgui/partialpastedlg.cc | 9 +++++++++ rtgui/partialpastedlg.h | 3 ++- 17 files changed, 73 insertions(+), 11 deletions(-) diff --git a/rtdata/languages/default b/rtdata/languages/default index c26b0d302..75c22d080 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -740,6 +740,7 @@ HISTORY_MSG_PIXELSHIFT_DEMOSAIC;PS - Demosaic method for motion HISTORY_MSG_PREPROCESS_LINEDENOISE_DIRECTION;Line noise filter direction HISTORY_MSG_PREPROCESS_PDAFLINESFILTER;PDAF lines filter HISTORY_MSG_PRSHARPEN_CONTRAST;PRS - Contrast threshold +HISTORY_MSG_RAW_BORDER;Raw border HISTORY_MSG_SHARPENING_CONTRAST;Sharpening - Contrast threshold HISTORY_MSG_TM_FATTAL_ANCHOR;DRC - Anchor HISTORY_NEWSNAPSHOT;Add @@ -1769,6 +1770,7 @@ TP_RAW_4PASS;3-pass+fast TP_RAW_AHD;AHD TP_RAW_AMAZE;AMaZE TP_RAW_AMAZEVNG4;AMaZE+VNG4 +TP_RAW_BORDER;Border TP_RAW_DCB;DCB TP_RAW_DCBVNG4;DCB+VNG4 TP_RAW_DCBENHANCE;DCB enhancement diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index f94f6bad6..e57823a44 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -714,7 +714,7 @@ void RawImageSource::border_interpolate(unsigned int border, float (*image)[4], } } -void RawImageSource::border_interpolate2( int winw, int winh, int lborders) +void RawImageSource::border_interpolate2( int winw, int winh, int lborders, const array2D &rawData, array2D &red, array2D &green, array2D &blue) { int bord = lborders; int width = winw; @@ -1657,7 +1657,7 @@ void RawImageSource::igv_interpolate(int winw, int winh) chr[2] = hdif; chr[3] = vdif; - border_interpolate2(winw, winh, 7); + border_interpolate2(winw, winh, 7, rawData, red, green, blue); if (plistener) { plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::IGV))); @@ -2047,7 +2047,7 @@ void RawImageSource::igv_interpolate(int winw, int winh) vdif = (float (*)) calloc(width * height / 2, sizeof * vdif); hdif = (float (*)) calloc(width * height / 2, sizeof * hdif); - border_interpolate2(winw, winh, 7); + border_interpolate2(winw, winh, 7, rawData, red, green, blue); if (plistener) { plistener->setProgressStr (Glib::ustring::compose(M("TP_RAW_DMETHOD_PROGRESSBAR"), RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::IGV))); diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h index c62a0ac96..e01f22b16 100644 --- a/rtengine/imagesource.h +++ b/rtengine/imagesource.h @@ -80,6 +80,7 @@ public: virtual bool isRGBSourceModified () const = 0; // tracks whether cached rgb output of demosaic has been modified + virtual void setBorder (unsigned int border) {} virtual void setCurrentFrame (unsigned int frameNum) = 0; virtual int getFrameCount () = 0; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 927394d4f..cdd5c2e75 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -243,6 +243,10 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) highDetailRawComputed = false; } + if(imgsrc->getSensorType() == ST_BAYER && params.raw.bayersensor.method != RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { + imgsrc->setBorder(params.raw.bayersensor.border); + } + if (params.retinex.enabled) { lhist16RETI (32768); lhist16RETI.clear(); diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index 2acc2a5a3..2c884e676 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -2345,6 +2345,7 @@ bool FilmSimulationParams::operator !=(const FilmSimulationParams& other) const RAWParams::BayerSensor::BayerSensor() : method(getMethodString(Method::AMAZE)), + border(4), imageNum(0), ccSteps(0), black0(0.0), @@ -2381,6 +2382,7 @@ bool RAWParams::BayerSensor::operator ==(const BayerSensor& other) const { return method == other.method + && border == other.border && imageNum == other.imageNum && ccSteps == other.ccSteps && black0 == other.black0 @@ -3345,6 +3347,7 @@ int ProcParams::save(const Glib::ustring& fname, const Glib::ustring& fname2, bo saveToKeyfile(!pedited || pedited->raw.deadPixelFilter, "RAW", "DeadPixelFilter", raw.deadPixelFilter, keyFile); saveToKeyfile(!pedited || pedited->raw.hotdeadpix_thresh, "RAW", "HotDeadPixelThresh", raw.hotdeadpix_thresh, keyFile); saveToKeyfile(!pedited || pedited->raw.bayersensor.method, "RAW Bayer", "Method", raw.bayersensor.method, keyFile); + saveToKeyfile(!pedited || pedited->raw.bayersensor.border, "RAW Bayer", "Border", raw.bayersensor.border, keyFile); saveToKeyfile(!pedited || pedited->raw.bayersensor.imageNum, "RAW Bayer", "ImageNum", raw.bayersensor.imageNum + 1, keyFile); saveToKeyfile(!pedited || pedited->raw.bayersensor.ccSteps, "RAW Bayer", "CcSteps", raw.bayersensor.ccSteps, keyFile); saveToKeyfile(!pedited || pedited->raw.bayersensor.exBlack0, "RAW Bayer", "PreBlack0", raw.bayersensor.black0, keyFile); @@ -4673,6 +4676,7 @@ int ProcParams::load(const Glib::ustring& fname, ParamsEdited* pedited) if (keyFile.has_group ("RAW Bayer")) { assignFromKeyfile(keyFile, "RAW Bayer", "Method", pedited, raw.bayersensor.method, pedited->raw.bayersensor.method); + assignFromKeyfile(keyFile, "RAW Bayer", "Border", pedited, raw.bayersensor.border, pedited->raw.bayersensor.border); if (keyFile.has_key ("RAW Bayer", "ImageNum")) { raw.bayersensor.imageNum = keyFile.get_integer ("RAW Bayer", "ImageNum") - 1; diff --git a/rtengine/procparams.h b/rtengine/procparams.h index 7e14a8255..a65705bc4 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -1255,6 +1255,7 @@ struct RAWParams { }; Glib::ustring method; + int border; int imageNum; int ccSteps; double black0; diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 197d7df84..9233eb2cf 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -590,8 +590,8 @@ void RawImageSource::transformRect (const PreviewProps &pp, int tran, int &ssx1, } else { ssx1 = sx1; ssy1 = sy1; - width = (sx2 - sx1) / pp.getSkip() + ((sx2 - sx1) % pp.getSkip() > 0); - height = (sy2 - sy1) / pp.getSkip() + ((sy2 - sy1) % pp.getSkip() > 0); + width = (sx2 + 1 - sx1) / pp.getSkip() + ((sx2 - sx1) % pp.getSkip() > 0); + height = (sy2 + 1 - sy1) / pp.getSkip() + ((sy2 - sy1) % pp.getSkip() > 0); } } diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h index e0cf5e90c..53d3e0dc1 100644 --- a/rtengine/rawimagesource.h +++ b/rtengine/rawimagesource.h @@ -130,7 +130,7 @@ public: void HLRecovery_Global (ToneCurveParams hrp); void refinement_lassus (int PassCount); void refinement(int PassCount); - + void setBorder(unsigned int rawBorder) {border = rawBorder;} bool isRGBSourceModified() const { return rgbSourceModified; // tracks whether cached rgb output of demosaic has been modified @@ -274,7 +274,7 @@ protected: void ahd_demosaic(); void rcd_demosaic(); void border_interpolate(unsigned int border, float (*image)[4], unsigned int start = 0, unsigned int end = 0); - void border_interpolate2(int winw, int winh, int lborders); + void border_interpolate2(int winw, int winh, int lborders, const array2D &rawData, array2D &red, array2D &green, array2D &blue); void dcb_initTileLimits(int &colMin, int &rowMin, int &colMax, int &rowMax, int x0, int y0, int border); void fill_raw( float (*cache )[3], int x0, int y0, float** rawData); void fill_border( float (*cache )[3], int border, int x0, int y0); diff --git a/rtengine/rcd_demosaic.cc b/rtengine/rcd_demosaic.cc index f131bc87e..01430a894 100644 --- a/rtengine/rcd_demosaic.cc +++ b/rtengine/rcd_demosaic.cc @@ -291,7 +291,7 @@ void RawImageSource::rcd_demosaic() free(PQ_Dir); } - border_interpolate2(W, H, rcdBorder); + border_interpolate2(W, H, rcdBorder, rawData, red, green, blue); if (plistener) { plistener->setProgress(1); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 9fb7e42a8..bdfb36ccc 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -206,6 +206,10 @@ private: double contrastThresholdDummy; imgsrc->demosaic (params.raw, false, contrastThresholdDummy); + if(imgsrc->getSensorType() == ST_BAYER && params.raw.bayersensor.method != RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { + imgsrc->setBorder(params.raw.bayersensor.border); + } + if (pl) { pl->setProgress (0.30); } diff --git a/rtengine/vng4_demosaic_RT.cc b/rtengine/vng4_demosaic_RT.cc index d6520607e..8ed05dd09 100644 --- a/rtengine/vng4_demosaic_RT.cc +++ b/rtengine/vng4_demosaic_RT.cc @@ -336,6 +336,7 @@ void RawImageSource::vng4_demosaic (const array2D &rawData, array2DsetProgress (1.0); diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index c267b3777..6af86a1b8 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -28,6 +28,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA { auto m = ProcEventMapper::getInstance(); + EvDemosaicBorder = m->newEvent(DEMOSAIC, "HISTORY_MSG_RAW_BORDER"); EvDemosaicContrast = m->newEvent(DEMOSAIC, "HISTORY_MSG_DUALDEMOSAIC_CONTRAST"); EvDemosaicPixelshiftDemosaicMethod = m->newEvent(DEMOSAIC, "HISTORY_MSG_PIXELSHIFT_DEMOSAIC"); @@ -45,6 +46,18 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA hb1->pack_end (*method, Gtk::PACK_EXPAND_WIDGET, 4); pack_start( *hb1, Gtk::PACK_SHRINK, 4); + Gtk::HBox* borderbox = Gtk::manage (new Gtk::HBox ()); + border = Gtk::manage (new MySpinButton ()); + borderbox->set_spacing(3); + borderbox->pack_start (*Gtk::manage (new Gtk::Label (M("TP_RAW_BORDER"))), Gtk::PACK_SHRINK, 0); + borderbox->pack_start (*border); + border->set_digits (0); + border->set_increments (1, 2); + border->set_value (4); + border->set_range (0, 16); + + pack_start( *borderbox, Gtk::PACK_SHRINK, 4); + imageNumberBox = Gtk::manage (new Gtk::HBox ()); imageNumberBox->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_IMAGENUM") + ": ")), Gtk::PACK_SHRINK, 4); imageNumber = Gtk::manage (new MyComboBoxText ()); @@ -234,6 +247,8 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA imageNumber->connect(imageNumber->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::imageNumberChanged) )); pixelShiftMotionMethod->connect(pixelShiftMotionMethod->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::pixelShiftMotionMethodChanged) )); pixelShiftDemosaicMethod->connect(pixelShiftDemosaicMethod->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::pixelShiftDemosaicMethodChanged) )); + borderconn = border->signal_value_changed().connect ( sigc::mem_fun(*this, &BayerProcess::borderChanged), true); + } @@ -242,9 +257,11 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params disableListener (); method->block (true); imageNumber->block (true); + borderconn.block(true); pixelShiftDemosaicMethod->block(true); //allEnhconn.block (true); + border->set_value (pp->raw.bayersensor.border); imageNumber->set_active(pp->raw.bayersensor.imageNum); for (size_t i = 0; i < procparams::RAWParams::BayerSensor::getMethodStrings().size(); ++i) { @@ -356,6 +373,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params method->block (false); imageNumber->block (false); + borderconn.block (false); pixelShiftDemosaicMethod->block(false); //allEnhconn.block (false); @@ -367,7 +385,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe pp->raw.bayersensor.ccSteps = ccSteps->getIntValue(); pp->raw.bayersensor.dcb_iterations = dcbIterations->getIntValue(); pp->raw.bayersensor.dcb_enhance = dcbEnhance->getLastActive (); - //pp->raw.bayersensor.all_enhance = allEnhance->getLastActive (); + pp->raw.bayersensor.border = border->get_value (); pp->raw.bayersensor.lmmse_iterations = lmmseIterations->getIntValue(); pp->raw.bayersensor.dualDemosaicContrast = dualDemosaicContrast->getValue(); pp->raw.bayersensor.pixelShiftMotionCorrectionMethod = (RAWParams::BayerSensor::PSMotionCorrectionMethod)pixelShiftMotionMethod->get_active_row_number(); @@ -705,3 +723,8 @@ void BayerProcess::FrameCountChanged(int n, int frameNum) // } // imageNumber->block (false); } + +void BayerProcess::borderChanged () +{ + listener->panelChanged (EvDemosaicBorder, Glib::ustring::format (border->get_value_as_int())); +} \ No newline at end of file diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h index 2b3e420bc..996a4be90 100644 --- a/rtgui/bayerprocess.h +++ b/rtgui/bayerprocess.h @@ -32,6 +32,7 @@ protected: MyComboBoxText* method; Gtk::HBox *imageNumberBox; + MySpinButton* border; MyComboBoxText* imageNumber; Adjuster* ccSteps; Gtk::VBox *dcbOptions; @@ -60,6 +61,9 @@ protected: int oldMethod; IdleRegister idle_register; + sigc::connection borderconn; + + rtengine::ProcEvent EvDemosaicBorder; rtengine::ProcEvent EvDemosaicContrast; rtengine::ProcEvent EvDemosaicPixelshiftDemosaicMethod; public: @@ -80,6 +84,7 @@ public: void pixelShiftMotionMethodChanged(); void pixelShiftDemosaicMethodChanged(); void FrameCountChanged(int n, int frameNum); + void borderChanged(); }; #endif diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc index d14635d10..8cabba1cb 100644 --- a/rtgui/paramsedited.cc +++ b/rtgui/paramsedited.cc @@ -392,6 +392,7 @@ void ParamsEdited::set (bool v) icm.gampos = v; icm.slpos = v; raw.bayersensor.method = v; + raw.bayersensor.border = v; raw.bayersensor.imageNum = v; raw.bayersensor.ccSteps = v; raw.bayersensor.exBlack0 = v; @@ -943,6 +944,7 @@ void ParamsEdited::initFrom (const std::vector icm.gampos = icm.gampos && p.icm.gampos == other.icm.gampos; icm.slpos = icm.slpos && p.icm.slpos == other.icm.slpos; raw.bayersensor.method = raw.bayersensor.method && p.raw.bayersensor.method == other.raw.bayersensor.method; + raw.bayersensor.border = raw.bayersensor.border && p.raw.bayersensor.border == other.raw.bayersensor.border; raw.bayersensor.imageNum = raw.bayersensor.imageNum && p.raw.bayersensor.imageNum == other.raw.bayersensor.imageNum; raw.bayersensor.ccSteps = raw.bayersensor.ccSteps && p.raw.bayersensor.ccSteps == other.raw.bayersensor.ccSteps; raw.bayersensor.exBlack0 = raw.bayersensor.exBlack0 && p.raw.bayersensor.black0 == other.raw.bayersensor.black0; @@ -2460,6 +2462,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten toEdit.raw.bayersensor.method = mods.raw.bayersensor.method; } + if (raw.bayersensor.border) { + toEdit.raw.bayersensor.border = mods.raw.bayersensor.border; + } + if (raw.bayersensor.imageNum) { toEdit.raw.bayersensor.imageNum = mods.raw.bayersensor.imageNum; } @@ -3084,7 +3090,7 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten bool RAWParamsEdited::BayerSensor::isUnchanged() const { - return method && imageNum && dcbIterations && dcbEnhance && lmmseIterations && dualDemosaicContrast /*&& allEnhance*/ && greenEq + return method && border && imageNum && dcbIterations && dcbEnhance && lmmseIterations && dualDemosaicContrast /*&& allEnhance*/ && greenEq && pixelShiftMotionCorrectionMethod && pixelShiftEperIso && pixelShiftSigma && pixelShiftShowMotion && pixelShiftShowMotionMaskOnly && pixelShiftHoleFill && pixelShiftMedian && pixelShiftNonGreenCross && pixelShiftDemosaicMethod && pixelShiftGreen && pixelShiftBlur && pixelShiftSmooth && pixelShiftEqualBright && pixelShiftEqualBrightChannel && linenoise && linenoiseDirection && pdafLinesFilter && exBlack0 && exBlack1 && exBlack2 && exBlack3 && exTwoGreen; diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h index 546a5c333..5bad6c9e4 100644 --- a/rtgui/paramsedited.h +++ b/rtgui/paramsedited.h @@ -721,6 +721,7 @@ public: public: bool method; + bool border; bool imageNum; bool ccSteps; bool exBlack0; diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc index 99411e46c..c73958bce 100644 --- a/rtgui/partialpastedlg.cc +++ b/rtgui/partialpastedlg.cc @@ -104,6 +104,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren // Raw Settings: raw_method = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_DMETHOD"))); raw_imagenum = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_IMAGENUM"))); + raw_border = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_BORDER"))); raw_pixelshift = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_PIXELSHIFT"))); raw_ccSteps = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_FALSECOLOR"))); raw_dcb_iterations = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_DCBITERATIONS"))); @@ -215,6 +216,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren vboxes[7]->pack_start (*raw, Gtk::PACK_SHRINK, 2); vboxes[7]->pack_start (*hseps[7], Gtk::PACK_SHRINK, 2); vboxes[7]->pack_start (*raw_method, Gtk::PACK_SHRINK, 2); + vboxes[7]->pack_start (*raw_border, Gtk::PACK_SHRINK, 2); vboxes[7]->pack_start (*raw_imagenum, Gtk::PACK_SHRINK, 2); vboxes[7]->pack_start (*raw_pixelshift, Gtk::PACK_SHRINK, 2); vboxes[7]->pack_start (*raw_ccSteps, Gtk::PACK_SHRINK, 2); @@ -359,6 +361,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title, Gtk::Window* paren // Raw Settings: raw_methodConn = raw_method->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); + raw_borderConn = raw_border->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_imagenumConn = raw_imagenum->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_pixelshiftConn = raw_pixelshift->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); raw_ccStepsConn = raw_ccSteps->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true)); @@ -434,6 +437,7 @@ void PartialPasteDlg::rawToggled () { ConnectionBlocker raw_methodBlocker(raw_methodConn); + ConnectionBlocker raw_borderBlocker(raw_borderConn); ConnectionBlocker raw_imagenumBlocker(raw_imagenumConn); ConnectionBlocker raw_pixelshiftBlocker(raw_pixelshiftConn); ConnectionBlocker raw_ccStepsBlocker(raw_ccStepsConn); @@ -461,6 +465,7 @@ void PartialPasteDlg::rawToggled () raw->set_inconsistent (false); raw_method->set_active (raw->get_active ()); + raw_border->set_active (raw->get_active ()); raw_imagenum->set_active (raw->get_active ()); raw_pixelshift->set_active (raw->get_active ()); raw_ccSteps->set_active (raw->get_active ()); @@ -812,6 +817,10 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param filterPE.raw.xtranssensor.method = falsePE.raw.xtranssensor.method; } + if (!raw_border->get_active ()) { + filterPE.raw.bayersensor.border = falsePE.raw.bayersensor.border; + } + if (!raw_imagenum->get_active ()) { filterPE.raw.bayersensor.imageNum = falsePE.raw.bayersensor.imageNum; } diff --git a/rtgui/partialpastedlg.h b/rtgui/partialpastedlg.h index b404db156..f6b6ebde7 100644 --- a/rtgui/partialpastedlg.h +++ b/rtgui/partialpastedlg.h @@ -110,6 +110,7 @@ public: Gtk::CheckButton* raw_linenoise; Gtk::CheckButton* raw_greenthresh; Gtk::CheckButton* raw_method; + Gtk::CheckButton* raw_border; Gtk::CheckButton* raw_imagenum; Gtk::CheckButton* raw_ccSteps; Gtk::CheckButton* raw_dcb_iterations; @@ -134,7 +135,7 @@ public: sigc::connection coarserotConn, finerotConn, cropConn, resizeConn, prsharpeningConn, perspectiveConn, commonTransConn; sigc::connection metadataConn, exifchConn, iptcConn, icmConn; sigc::connection df_fileConn, df_AutoSelectConn, ff_fileConn, ff_AutoSelectConn, ff_BlurRadiusConn, ff_BlurTypeConn, ff_ClipControlConn; - sigc::connection raw_caredblueConn, raw_ca_autocorrectConn, raw_hotpix_filtConn, raw_deadpix_filtConn, raw_pdaf_lines_filterConn, raw_linenoiseConn, raw_greenthreshConn, raw_ccStepsConn, raw_methodConn, raw_imagenumConn, raw_dcb_iterationsConn, raw_lmmse_iterationsConn, raw_pixelshiftConn, raw_dcb_enhanceConn, raw_exposConn, raw_preserConn, raw_blackConn; + sigc::connection raw_caredblueConn, raw_ca_autocorrectConn, raw_hotpix_filtConn, raw_deadpix_filtConn, raw_pdaf_lines_filterConn, raw_linenoiseConn, raw_greenthreshConn, raw_ccStepsConn, raw_methodConn, raw_borderConn, raw_imagenumConn, raw_dcb_iterationsConn, raw_lmmse_iterationsConn, raw_pixelshiftConn, raw_dcb_enhanceConn, raw_exposConn, raw_preserConn, raw_blackConn; public: PartialPasteDlg (const Glib::ustring &title, Gtk::Window* parent); From cb1f2968abb4122c182212134e5c4648d1df4455 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 28 Jun 2018 12:59:22 +0200 Subject: [PATCH 2/8] hphd demosaic border interpolation --- rtengine/demosaic_algos.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index e57823a44..83439ba52 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -553,6 +553,8 @@ void RawImageSource::hphd_demosaic () } } + border_interpolate2(W, H, 4, rawData, red, green, blue); + if (plistener) { plistener->setProgress (1.0); } From a3d932786efeb055533cdbd0be3b887c1e25001a Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 28 Jun 2018 13:37:43 +0200 Subject: [PATCH 3/8] When using zero border, last row and last column were doubled, #4642 --- rtengine/rawimagesource.cc | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 9233eb2cf..77cb6a522 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -590,8 +590,8 @@ void RawImageSource::transformRect (const PreviewProps &pp, int tran, int &ssx1, } else { ssx1 = sx1; ssy1 = sy1; - width = (sx2 + 1 - sx1) / pp.getSkip() + ((sx2 - sx1) % pp.getSkip() > 0); - height = (sy2 + 1 - sy1) / pp.getSkip() + ((sy2 - sy1) % pp.getSkip() > 0); + width = (sx2 + 1 - sx1) / pp.getSkip() + ((sx2 + 1 - sx1) % pp.getSkip() > 0); + height = (sy2 + 1 - sy1) / pp.getSkip() + ((sy2 + 1 - sy1) % pp.getSkip() > 0); } } @@ -746,14 +746,11 @@ void RawImageSource::getImage (const ColorTemp &ctemp, int tran, Imagefloat* ima for (int ix = 0; ix < imheight; ix++) { int i = sy1 + skip * ix; - - if (i >= maxy - skip) { - i = maxy - skip - 1; // avoid trouble - } + i = std::min(i, maxy - skip); // avoid trouble if (ri->getSensorType() == ST_BAYER || ri->getSensorType() == ST_FUJI_XTRANS || ri->get_colors() == 1) { for (int j = 0, jx = sx1; j < imwidth; j++, jx += skip) { - jx = std::min(jx, maxx - skip - 1); // avoid trouble + jx = std::min(jx, maxx - skip); // avoid trouble float rtot = 0.f, gtot = 0.f, btot = 0.f; From 00cc9372d82107bb742a41218f4a67b935b5ca62 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 28 Jun 2018 14:49:07 +0200 Subject: [PATCH 4/8] Changed raw border from spinbox to adjuster --- rtgui/bayerprocess.cc | 37 ++++++++++++++++++++----------------- rtgui/bayerprocess.h | 4 +--- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index 6af86a1b8..683a05403 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -47,15 +47,15 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA pack_start( *hb1, Gtk::PACK_SHRINK, 4); Gtk::HBox* borderbox = Gtk::manage (new Gtk::HBox ()); - border = Gtk::manage (new MySpinButton ()); - borderbox->set_spacing(3); - borderbox->pack_start (*Gtk::manage (new Gtk::Label (M("TP_RAW_BORDER"))), Gtk::PACK_SHRINK, 0); - borderbox->pack_start (*border); - border->set_digits (0); - border->set_increments (1, 2); - border->set_value (4); - border->set_range (0, 16); + border = Gtk::manage (new Adjuster (M("TP_RAW_BORDER"), 0, 16, 1, 4 )); + border->setAdjusterListener (this); + if (border->delay < options.adjusterMaxDelay) { + border->delay = options.adjusterMaxDelay; + } + + border->show(); + borderbox->pack_start (*border); pack_start( *borderbox, Gtk::PACK_SHRINK, 4); imageNumberBox = Gtk::manage (new Gtk::HBox ()); @@ -247,7 +247,6 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA imageNumber->connect(imageNumber->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::imageNumberChanged) )); pixelShiftMotionMethod->connect(pixelShiftMotionMethod->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::pixelShiftMotionMethodChanged) )); pixelShiftDemosaicMethod->connect(pixelShiftDemosaicMethod->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::pixelShiftDemosaicMethodChanged) )); - borderconn = border->signal_value_changed().connect ( sigc::mem_fun(*this, &BayerProcess::borderChanged), true); } @@ -257,11 +256,10 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params disableListener (); method->block (true); imageNumber->block (true); - borderconn.block(true); pixelShiftDemosaicMethod->block(true); //allEnhconn.block (true); - border->set_value (pp->raw.bayersensor.border); + border->setValue(pp->raw.bayersensor.border); imageNumber->set_active(pp->raw.bayersensor.imageNum); for (size_t i = 0; i < procparams::RAWParams::BayerSensor::getMethodStrings().size(); ++i) { @@ -311,6 +309,7 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params } if(pedited) { + border->setEditedState (pedited->raw.bayersensor.border ? Edited : UnEdited); ccSteps->setEditedState (pedited->raw.bayersensor.ccSteps ? Edited : UnEdited); dcbIterations->setEditedState ( pedited->raw.bayersensor.dcbIterations ? Edited : UnEdited); dcbEnhance->setEdited (pedited->raw.bayersensor.dcbEnhance); @@ -373,7 +372,6 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params method->block (false); imageNumber->block (false); - borderconn.block (false); pixelShiftDemosaicMethod->block(false); //allEnhconn.block (false); @@ -385,7 +383,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe pp->raw.bayersensor.ccSteps = ccSteps->getIntValue(); pp->raw.bayersensor.dcb_iterations = dcbIterations->getIntValue(); pp->raw.bayersensor.dcb_enhance = dcbEnhance->getLastActive (); - pp->raw.bayersensor.border = border->get_value (); + pp->raw.bayersensor.border = border->getIntValue(); pp->raw.bayersensor.lmmse_iterations = lmmseIterations->getIntValue(); pp->raw.bayersensor.dualDemosaicContrast = dualDemosaicContrast->getValue(); pp->raw.bayersensor.pixelShiftMotionCorrectionMethod = (RAWParams::BayerSensor::PSMotionCorrectionMethod)pixelShiftMotionMethod->get_active_row_number(); @@ -419,6 +417,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe if (pedited) { + pedited->raw.bayersensor.border = border->getEditedState (); pedited->raw.bayersensor.ccSteps = ccSteps->getEditedState (); pedited->raw.bayersensor.method = method->get_active_text() != M("GENERAL_UNCHANGED"); pedited->raw.bayersensor.imageNum = imageNumber->get_active_text() != M("GENERAL_UNCHANGED"); @@ -446,6 +445,7 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe void BayerProcess::setAdjusterBehavior (bool falsecoloradd, bool iteradd, bool dualdemozecontrastadd, bool pssigmaadd, bool pssmoothadd, bool pseperisoadd) { + border->setAddMode(false); ccSteps->setAddMode(falsecoloradd); dcbIterations->setAddMode(iteradd); lmmseIterations->setAddMode(iteradd); @@ -457,6 +457,7 @@ void BayerProcess::setAdjusterBehavior (bool falsecoloradd, bool iteradd, bool d void BayerProcess::trimValues (rtengine::procparams::ProcParams* pp) { + border->trimValue(pp->raw.bayersensor.border); ccSteps->trimValue(pp->raw.bayersensor.ccSteps); dcbIterations->trimValue(pp->raw.bayersensor.dcb_iterations); lmmseIterations->trimValue(pp->raw.bayersensor.lmmse_iterations); @@ -477,6 +478,7 @@ void BayerProcess::setBatchMode(bool batchMode) imageNumber->append (M("GENERAL_UNCHANGED")); imageNumber->set_active_text (M("GENERAL_UNCHANGED")); ToolPanel::setBatchMode (batchMode); + border->showEditedCB (); ccSteps->showEditedCB (); dcbIterations->showEditedCB (); lmmseIterations->showEditedCB (); @@ -492,6 +494,7 @@ void BayerProcess::setDefaults(const rtengine::procparams::ProcParams* defParams dualDemosaicContrast->setDefault( defParams->raw.bayersensor.dualDemosaicContrast); pixelShiftEperIso->setDefault( defParams->raw.bayersensor.pixelShiftEperIso); pixelShiftSigma->setDefault( defParams->raw.bayersensor.pixelShiftSigma); + border->setDefault (defParams->raw.bayersensor.border); ccSteps->setDefault (defParams->raw.bayersensor.ccSteps); if (pedited) { @@ -500,6 +503,7 @@ void BayerProcess::setDefaults(const rtengine::procparams::ProcParams* defParams dualDemosaicContrast->setDefaultEditedState( pedited->raw.bayersensor.dualDemosaicContrast ? Edited : UnEdited); pixelShiftEperIso->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftEperIso ? Edited : UnEdited); pixelShiftSigma->setDefaultEditedState( pedited->raw.bayersensor.pixelShiftSigma ? Edited : UnEdited); + border->setDefaultEditedState(pedited->raw.bayersensor.border ? Edited : UnEdited); ccSteps->setDefaultEditedState(pedited->raw.bayersensor.ccSteps ? Edited : UnEdited); } else { dcbIterations->setDefaultEditedState( Irrelevant ); @@ -507,6 +511,7 @@ void BayerProcess::setDefaults(const rtengine::procparams::ProcParams* defParams dualDemosaicContrast->setDefaultEditedState( Irrelevant ); pixelShiftEperIso->setDefaultEditedState( Irrelevant ); pixelShiftSigma->setDefaultEditedState( Irrelevant ); + border->setDefaultEditedState(Irrelevant); ccSteps->setDefaultEditedState(Irrelevant ); } } @@ -528,6 +533,8 @@ void BayerProcess::adjusterChanged (Adjuster* a, double newval) listener->panelChanged (EvPixelShiftSigma, a->getTextValue() ); } else if (a == pixelShiftSmooth) { listener->panelChanged (EvPixelShiftSmooth, a->getTextValue() ); + } else if (a == border) { + listener->panelChanged (EvDemosaicBorder, a->getTextValue() ); } } } @@ -724,7 +731,3 @@ void BayerProcess::FrameCountChanged(int n, int frameNum) // imageNumber->block (false); } -void BayerProcess::borderChanged () -{ - listener->panelChanged (EvDemosaicBorder, Glib::ustring::format (border->get_value_as_int())); -} \ No newline at end of file diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h index 996a4be90..253494e58 100644 --- a/rtgui/bayerprocess.h +++ b/rtgui/bayerprocess.h @@ -32,7 +32,7 @@ protected: MyComboBoxText* method; Gtk::HBox *imageNumberBox; - MySpinButton* border; + Adjuster* border; MyComboBoxText* imageNumber; Adjuster* ccSteps; Gtk::VBox *dcbOptions; @@ -61,7 +61,6 @@ protected: int oldMethod; IdleRegister idle_register; - sigc::connection borderconn; rtengine::ProcEvent EvDemosaicBorder; rtengine::ProcEvent EvDemosaicContrast; @@ -84,7 +83,6 @@ public: void pixelShiftMotionMethodChanged(); void pixelShiftDemosaicMethodChanged(); void FrameCountChanged(int n, int frameNum); - void borderChanged(); }; #endif From e7010e6a4ddf89f54308f2647663c26dcd2768d8 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 28 Jun 2018 15:18:51 +0200 Subject: [PATCH 5/8] Hide raw border adjuster when method pixelshift is selected --- rtgui/bayerprocess.cc | 12 ++++++++---- rtgui/bayerprocess.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc index 683a05403..dc211995e 100644 --- a/rtgui/bayerprocess.cc +++ b/rtgui/bayerprocess.cc @@ -46,8 +46,8 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA hb1->pack_end (*method, Gtk::PACK_EXPAND_WIDGET, 4); pack_start( *hb1, Gtk::PACK_SHRINK, 4); - Gtk::HBox* borderbox = Gtk::manage (new Gtk::HBox ()); - border = Gtk::manage (new Adjuster (M("TP_RAW_BORDER"), 0, 16, 1, 4 )); + borderbox = Gtk::manage(new Gtk::HBox()); + border = Gtk::manage(new Adjuster(M("TP_RAW_BORDER"), 0, 16, 1, 4)); border->setAdjusterListener (this); if (border->delay < options.adjusterMaxDelay) { @@ -55,8 +55,8 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA } border->show(); - borderbox->pack_start (*border); - pack_start( *borderbox, Gtk::PACK_SHRINK, 4); + borderbox->pack_start(*border); + pack_start(*borderbox, Gtk::PACK_SHRINK, 4); imageNumberBox = Gtk::manage (new Gtk::HBox ()); imageNumberBox->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_IMAGENUM") + ": ")), Gtk::PACK_SHRINK, 4); @@ -353,9 +353,11 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params || pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::DCBVNG4) || pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::RCDVNG4)); if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::getMethodString(procparams::RAWParams::BayerSensor::Method::PIXELSHIFT)) { + borderbox->hide(); pixelShiftOptions->set_visible(pp->raw.bayersensor.pixelShiftMotionCorrectionMethod == RAWParams::BayerSensor::PSMotionCorrectionMethod::CUSTOM); pixelShiftFrame->show(); } else { + borderbox->show(); pixelShiftFrame->hide(); } @@ -564,6 +566,7 @@ void BayerProcess::methodChanged () } if (currentMethod == procparams::RAWParams::BayerSensor::Method::PIXELSHIFT) { + borderbox->hide(); if(pixelShiftMotionMethod->get_active_row_number() == 2) { pixelShiftOptions->show(); } else { @@ -571,6 +574,7 @@ void BayerProcess::methodChanged () } pixelShiftFrame->show(); } else { + borderbox->show(); pixelShiftFrame->hide(); } } diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h index 253494e58..cfd063ca9 100644 --- a/rtgui/bayerprocess.h +++ b/rtgui/bayerprocess.h @@ -31,6 +31,7 @@ class BayerProcess : public ToolParamBlock, public AdjusterListener, public Chec protected: MyComboBoxText* method; + Gtk::HBox* borderbox; Gtk::HBox *imageNumberBox; Adjuster* border; MyComboBoxText* imageNumber; From f55d89e576bcf8fb920dbbd5e4177c9ec09c70d0 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 28 Jun 2018 15:19:37 +0200 Subject: [PATCH 6/8] Call setBorder() before demosaic --- rtengine/improccoordinator.cc | 11 +++++++---- rtengine/simpleprocess.cc | 10 +++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index cdd5c2e75..2cd43de07 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -230,6 +230,13 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) printf ("Demosaic X-Trans image with using method: %s\n", rp.xtranssensor.method.c_str()); } } + if(imgsrc->getSensorType() == ST_BAYER) { + if(params.raw.bayersensor.method!= RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { + imgsrc->setBorder(params.raw.bayersensor.border); + } else { + imgsrc->setBorder(4); + } + } bool autoContrast = false; double contrastThreshold = 0.f; imgsrc->demosaic (rp, autoContrast, contrastThreshold); //enabled demosaic @@ -243,10 +250,6 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) highDetailRawComputed = false; } - if(imgsrc->getSensorType() == ST_BAYER && params.raw.bayersensor.method != RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { - imgsrc->setBorder(params.raw.bayersensor.border); - } - if (params.retinex.enabled) { lhist16RETI (32768); lhist16RETI.clear(); diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index bdfb36ccc..11e98cf10 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -203,12 +203,16 @@ private: if (pl) { pl->setProgress (0.20); } + if(imgsrc->getSensorType() == ST_BAYER) { + if(params.raw.bayersensor.method!= RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { + imgsrc->setBorder(params.raw.bayersensor.border); + } else { + imgsrc->setBorder(4); + } + } double contrastThresholdDummy; imgsrc->demosaic (params.raw, false, contrastThresholdDummy); - if(imgsrc->getSensorType() == ST_BAYER && params.raw.bayersensor.method != RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { - imgsrc->setBorder(params.raw.bayersensor.border); - } if (pl) { pl->setProgress (0.30); From 8cfbd28ad84c7644e90e129dc799a41b211434c9 Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 28 Jun 2018 19:18:19 +0200 Subject: [PATCH 7/8] Full processing ignored custom raw border, #4642 --- rtengine/simpleprocess.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 11e98cf10..ac134f98d 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -159,6 +159,13 @@ private: imgsrc = ii->getImageSource (); tr = getCoarseBitMask (params.coarse); + if(imgsrc->getSensorType() == ST_BAYER) { + if(params.raw.bayersensor.method!= RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { + imgsrc->setBorder(params.raw.bayersensor.border); + } else { + imgsrc->setBorder(4); + } + } imgsrc->getFullSize (fw, fh, tr); // check the crop params @@ -196,20 +203,12 @@ private: ipf_p.reset (new ImProcFunctions (¶ms, true)); ImProcFunctions &ipf = * (ipf_p.get()); - pp = PreviewProps (0, 0, fw, fh, 1); imgsrc->setCurrentFrame (params.raw.bayersensor.imageNum); imgsrc->preprocess ( params.raw, params.lensProf, params.coarse, params.dirpyrDenoise.enabled); if (pl) { pl->setProgress (0.20); } - if(imgsrc->getSensorType() == ST_BAYER) { - if(params.raw.bayersensor.method!= RAWParams::BayerSensor::getMethodString(RAWParams::BayerSensor::Method::PIXELSHIFT)) { - imgsrc->setBorder(params.raw.bayersensor.border); - } else { - imgsrc->setBorder(4); - } - } double contrastThresholdDummy; imgsrc->demosaic (params.raw, false, contrastThresholdDummy); @@ -217,6 +216,7 @@ private: if (pl) { pl->setProgress (0.30); } + pp = PreviewProps (0, 0, fw, fh, 1); if (params.retinex.enabled) { //enabled Retinex LUTf cdcurve (65536, 0); From a79b53f5f170c0c7f6993c1425e9cae185919f2c Mon Sep 17 00:00:00 2001 From: heckflosse Date: Thu, 28 Jun 2018 19:23:17 +0200 Subject: [PATCH 8/8] Changed border interpolation for amaze demosaic, #4642 --- rtengine/amaze_demosaic_RT.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rtengine/amaze_demosaic_RT.cc b/rtengine/amaze_demosaic_RT.cc index 1e1b97768..f9137c18d 100644 --- a/rtengine/amaze_demosaic_RT.cc +++ b/rtengine/amaze_demosaic_RT.cc @@ -1585,6 +1585,8 @@ void RawImageSource::amaze_demosaic_RT(int winx, int winy, int winw, int winh, c free(buffer); } + border_interpolate2(W, H, 3, rawData, red, green, blue); + if(plistener) { plistener->setProgress(1.0); }