diff --git a/rtdata/languages/default b/rtdata/languages/default
index df9aaec7c..c66c3a64d 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -675,6 +675,7 @@ HISTORY_MSG_440;CbDL - Method
HISTORY_MSG_441;Retinex - Gain transmission
HISTORY_MSG_442;Retinex - Scale
HISTORY_MSG_443;Output Black Point Compensation
+HISTORY_MSG_444;Raw Sub-Image
HISTORY_NEWSNAPSHOT;Add
HISTORY_NEWSNAPSHOT_TOOLTIP;Shortcut: Alt-s
HISTORY_SNAPSHOT;Snapshot
@@ -864,6 +865,7 @@ PARTIALPASTE_RAW_DCBENHANCE;DCB enhancement
PARTIALPASTE_RAW_DCBITERATIONS;DCB iterations
PARTIALPASTE_RAW_DMETHOD;Demosaic method
PARTIALPASTE_RAW_FALSECOLOR;False color suppression
+PARTIALPASTE_RAW_IMAGENUM;Sub-image
PARTIALPASTE_RAW_LMMSEITERATIONS;LMMSE enhancement steps
PARTIALPASTE_RESIZE;Resize
PARTIALPASTE_RETINEX;Retinex
@@ -1647,6 +1649,8 @@ TP_RAW_DMETHOD_TOOLTIP;Note: IGV and LMMSE are dedicated to high ISO images to a
TP_RAW_FALSECOLOR;False color suppression steps
TP_RAW_HD;Threshold
TP_RAW_HD_TOOLTIP;Lower values make hot/dead pixel detection more aggressive, but false positives may lead to artifacts. If you notice any artifacts appearing when enabling the Hot/Dead Pixel Filters, gradually increase the threshold value until they disappear.
+TP_RAW_IMAGENUM;Sub-image
+TP_RAW_IMAGENUM;Some raw files might embed several sub-images (HDR, Pixel-Shift, Dual Sensitivity). Use this button to select the sub-image.\n\nThe last sub-image will be used if you select a value beyond the real sub-image count.
TP_RAW_LABEL;Demosaicing
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.
diff --git a/rtengine/imagesource.h b/rtengine/imagesource.h
index 59d46035b..4acffef6c 100644
--- a/rtengine/imagesource.h
+++ b/rtengine/imagesource.h
@@ -66,7 +66,7 @@ public:
embProfile(nullptr), idata(nullptr), dirpyrdenoiseExpComp(INFINITY) {}
virtual ~ImageSource () {}
- virtual int load (const Glib::ustring &fname, bool batch = false) = 0;
+ virtual int load (const Glib::ustring &fname, int imageNum = 0, bool batch = false) = 0;
virtual void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse, bool prepareDenoise = true) {};
virtual void demosaic (const RAWParams &raw) {};
virtual void retinex (ColorManagementParams cmp, RetinexParams deh, ToneCurveParams Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI) {};
diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc
index ca1d44cbf..741370813 100644
--- a/rtengine/improccoordinator.cc
+++ b/rtengine/improccoordinator.cc
@@ -214,7 +214,7 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall)
if (settings->verbose) {
if (imgsrc->getSensorType() == ST_BAYER) {
- printf("Demosaic Bayer image using method: %s\n", rp.bayersensor.method.c_str());
+ printf("Demosaic Bayer image n.%d using method: %s\n", rp.bayersensor.imageNum + 1, rp.bayersensor.method.c_str());
} else if (imgsrc->getSensorType() == ST_FUJI_XTRANS) {
printf("Demosaic X-Trans image with using method: %s\n", rp.xtranssensor.method.c_str());
}
diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc
index 586243391..4860648da 100644
--- a/rtengine/improcfun.cc
+++ b/rtengine/improcfun.cc
@@ -6902,7 +6902,7 @@ double ImProcFunctions::getAutoDistor (const Glib::ustring &fname, int thumb_si
return 0.0;
}
- Thumbnail* raw = rtengine::Thumbnail::loadFromRaw (fname, ri, w_raw, h_raw, 1, 1.0, FALSE);
+ Thumbnail* raw = rtengine::Thumbnail::loadFromRaw (fname, ri, w_raw, h_raw, 1, 1.0, FALSE, 0);
if (!raw) {
delete thumb;
diff --git a/rtengine/procevents.h b/rtengine/procevents.h
index 52517e527..69cda228a 100644
--- a/rtengine/procevents.h
+++ b/rtengine/procevents.h
@@ -470,6 +470,7 @@ enum ProcEvent {
EvRetinexgaintransmission = 440,
EvLskal = 441,
EvOBPCompens = 442,
+ EvRawImageNum = 443,
NUMOFEVENTS
};
diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc
index 5a8ee39a6..fe0d450c9 100644
--- a/rtengine/procparams.cc
+++ b/rtengine/procparams.cc
@@ -879,6 +879,7 @@ void CoarseTransformParams::setDefaults()
void RAWParams::setDefaults()
{
bayersensor.method = RAWParams::BayerSensor::methodstring[RAWParams::BayerSensor::amaze];
+ bayersensor.imageNum = 0;
bayersensor.ccSteps = 0;
bayersensor.dcb_iterations = 2;
bayersensor.dcb_enhance = true;
@@ -3315,6 +3316,10 @@ int ProcParams::save (const Glib::ustring &fname, const Glib::ustring &fname2, b
keyFile.set_string ("RAW Bayer", "Method", raw.bayersensor.method );
}
+ if (!pedited || pedited->raw.bayersensor.imageNum) {
+ keyFile.set_integer ("RAW Bayer", "ImageNum", raw.bayersensor.imageNum + 1 );
+ }
+
if (!pedited || pedited->raw.bayersensor.ccSteps) {
keyFile.set_integer ("RAW Bayer", "CcSteps", raw.bayersensor.ccSteps);
}
@@ -7321,6 +7326,14 @@ int ProcParams::load (const Glib::ustring &fname, ParamsEdited* pedited)
}
}
+ if (keyFile.has_key ("RAW Bayer", "ImageNum")) {
+ raw.bayersensor.imageNum = keyFile.get_integer ("RAW Bayer", "ImageNum") - 1;
+
+ if (pedited) {
+ pedited->raw.bayersensor.imageNum = true;
+ }
+ }
+
if (keyFile.has_key ("RAW Bayer", "CcSteps")) {
raw.bayersensor.ccSteps = keyFile.get_integer ("RAW Bayer", "CcSteps");
@@ -7837,6 +7850,7 @@ bool ProcParams::operator== (const ProcParams& other)
&& resize.width == other.resize.width
&& resize.height == other.resize.height
&& raw.bayersensor.method == other.raw.bayersensor.method
+ && raw.bayersensor.imageNum == other.raw.bayersensor.imageNum
&& raw.bayersensor.ccSteps == other.raw.bayersensor.ccSteps
&& raw.bayersensor.black0 == other.raw.bayersensor.black0
&& raw.bayersensor.black1 == other.raw.bayersensor.black1
diff --git a/rtengine/procparams.h b/rtengine/procparams.h
index c65e89e24..fc539144b 100644
--- a/rtengine/procparams.h
+++ b/rtengine/procparams.h
@@ -1171,6 +1171,7 @@ public:
static const char *methodstring[numMethods];
Glib::ustring method;
+ int imageNum;
int ccSteps;
double black0;
double black1;
diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc
index b4add328b..0ec9f548c 100644
--- a/rtengine/rawimage.cc
+++ b/rtengine/rawimage.cc
@@ -398,7 +398,7 @@ skip_block:
}
}
-int RawImage::loadRaw (bool loadData, bool closeFile, ProgressListener *plistener, double progressRange, unsigned int frameNum)
+int RawImage::loadRaw (bool loadData, unsigned int imageNum, bool closeFile, ProgressListener *plistener, double progressRange)
{
ifname = filename.c_str();
image = nullptr;
@@ -423,7 +423,7 @@ int RawImage::loadRaw (bool loadData, bool closeFile, ProgressListener *plistene
//***************** Read ALL raw file info
// set the number of the frame to extract. If the number is larger then number of existing frames - 1, dcraw will handle that correctly
- shot_select = frameNum;
+ shot_select = imageNum;
identify ();
diff --git a/rtengine/rawimage.h b/rtengine/rawimage.h
index 2ba434960..4f39ac855 100644
--- a/rtengine/rawimage.h
+++ b/rtengine/rawimage.h
@@ -106,7 +106,7 @@ public:
explicit RawImage( const Glib::ustring &name );
~RawImage();
- int loadRaw (bool loadData = true, bool closeFile = true, ProgressListener *plistener = nullptr, double progressRange = 1.0, unsigned int frameNum = 0);
+ int loadRaw (bool loadData = true, unsigned int imageNum = 0, bool closeFile = true, ProgressListener *plistener = nullptr, double progressRange = 1.0);
void get_colorsCoeff( float* pre_mul_, float* scale_mul_, float* cblack_, bool forceAutoWB );
void set_prefilters()
{
diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc
index b2e3e5e56..737e733cd 100644
--- a/rtengine/rawimagesource.cc
+++ b/rtengine/rawimagesource.cc
@@ -1494,7 +1494,7 @@ void RawImageSource::vflip (Imagefloat* image)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-int RawImageSource::load (const Glib::ustring &fname, bool batch)
+int RawImageSource::load (const Glib::ustring &fname, int imageNum, bool batch)
{
MyTime t1, t2;
@@ -1507,7 +1507,7 @@ int RawImageSource::load (const Glib::ustring &fname, bool batch)
}
ri = new RawImage(fname);
- int errCode = ri->loadRaw (true, true, plistener, 0.8);
+ int errCode = ri->loadRaw (true, imageNum, true, plistener, 0.8);
if (errCode) {
return errCode;
diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h
index 151edf959..cec3d78b7 100644
--- a/rtengine/rawimagesource.h
+++ b/rtengine/rawimagesource.h
@@ -107,7 +107,7 @@ public:
RawImageSource ();
~RawImageSource ();
- int load (const Glib::ustring &fname, bool batch = false);
+ int load (const Glib::ustring &fname, int imageNum = 0, bool batch = false);
void preprocess (const RAWParams &raw, const LensProfParams &lensProf, const CoarseTransformParams& coarse, bool prepareDenoise = true);
void demosaic (const RAWParams &raw);
void retinex (ColorManagementParams cmp, RetinexParams deh, ToneCurveParams Tc, LUTf & cdcurve, LUTf & mapcurve, const RetinextransmissionCurve & dehatransmissionCurve, const RetinexgaintransmissionCurve & dehagaintransmissionCurve, multi_array2D &conversionBuffer, bool dehacontlutili, bool mapcontlutili, bool useHsl, float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax, LUTu &histLRETI);
diff --git a/rtengine/refreshmap.cc b/rtengine/refreshmap.cc
index 025265e0a..8325ac17d 100644
--- a/rtengine/refreshmap.cc
+++ b/rtengine/refreshmap.cc
@@ -469,7 +469,8 @@ int refreshmap[rtengine::NUMOFEVENTS] = {
ALLNORAW, // EvcbdlMethod
RETINEX, // EvRetinexgaintransmission
RETINEX, // EvLskal
- OUTPUTPROFILE // EvOBPCompens
+ OUTPUTPROFILE, // EvOBPCompens
+ DEMOSAIC // EvRawImageNum
};
diff --git a/rtengine/rtthumbnail.cc b/rtengine/rtthumbnail.cc
index c135acc39..afe60d5a0 100644
--- a/rtengine/rtthumbnail.cc
+++ b/rtengine/rtthumbnail.cc
@@ -281,10 +281,10 @@ RawMetaDataLocation Thumbnail::loadMetaDataFromRaw (const Glib::ustring& fname)
return rml;
}
-Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, int &w, int &h, int fixwh, double wbEq, bool rotate)
+Thumbnail* Thumbnail::loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, int &w, int &h, int fixwh, double wbEq, bool rotate, int imageNum)
{
RawImage *ri = new RawImage (fname);
- int r = ri->loadRaw(1, 0);
+ int r = ri->loadRaw(1, imageNum, 0);
if( r ) {
delete ri;
diff --git a/rtengine/rtthumbnail.h b/rtengine/rtthumbnail.h
index 18e72fc19..da1c96f8d 100644
--- a/rtengine/rtthumbnail.h
+++ b/rtengine/rtthumbnail.h
@@ -78,7 +78,7 @@ public:
void getDimensions (int& w, int& h, double& scaleFac);
static Thumbnail* loadQuickFromRaw (const Glib::ustring& fname, rtengine::RawMetaDataLocation& rml, int &w, int &h, int fixwh, bool rotate, bool inspectorMode = false);
- static Thumbnail* loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, int &w, int &h, int fixwh, double wbEq, bool rotate);
+ static Thumbnail* loadFromRaw (const Glib::ustring& fname, RawMetaDataLocation& rml, int &w, int &h, int fixwh, double wbEq, bool rotate, int imageNum);
static Thumbnail* loadFromImage (const Glib::ustring& fname, int &w, int &h, int fixwh, double wbEq, bool inspectorMode = false);
static RawMetaDataLocation loadMetaDataFromRaw (const Glib::ustring& fname);
diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc
index 6017a1ca6..2eda4b512 100644
--- a/rtengine/stdimagesource.cc
+++ b/rtengine/stdimagesource.cc
@@ -110,7 +110,7 @@ void StdImageSource::getSampleFormat (const Glib::ustring &fname, IIOSampleForma
* and RT's image data type (Image8, Image16 and Imagefloat), then it will
* load the image into it
*/
-int StdImageSource::load (const Glib::ustring &fname, bool batch)
+int StdImageSource::load (const Glib::ustring &fname, int imageNum, bool batch)
{
fileName = fname;
diff --git a/rtengine/stdimagesource.h b/rtengine/stdimagesource.h
index 0ef487a75..38b6952b0 100644
--- a/rtengine/stdimagesource.h
+++ b/rtengine/stdimagesource.h
@@ -42,7 +42,7 @@ public:
StdImageSource ();
~StdImageSource ();
- int load (const Glib::ustring &fname, bool batch = false);
+ int load (const Glib::ustring &fname, int imageNum = 0, bool batch = false);
void getImage (const ColorTemp &ctemp, int tran, Imagefloat* image, const PreviewProps &pp, const ToneCurveParams &hrp, const ColorManagementParams &cmp, const RAWParams &raw);
ColorTemp getWB () const
{
diff --git a/rtgui/bayerprocess.cc b/rtgui/bayerprocess.cc
index 14c542172..3a4f2898a 100644
--- a/rtgui/bayerprocess.cc
+++ b/rtgui/bayerprocess.cc
@@ -38,6 +38,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);
+ imageNumberBox = Gtk::manage (new Gtk::HBox ());
+ hb1->pack_start (*Gtk::manage (new Gtk::Label ( M("TP_RAW_IMAGENUM") + ": ")), Gtk::PACK_SHRINK, 4);
+ imageNumber = Gtk::manage (new MyComboBoxText ());
+ imageNumber->append_text("1");
+ imageNumber->append_text("2");
+ imageNumber->append_text("3");
+ imageNumber->append_text("4");
+ imageNumber->set_active(0);
+ imageNumberBox->set_tooltip_text(M("TP_RAW_IMAGENUM_TOOLTIP"));
+ imageNumberBox->pack_end (*imageNumber, Gtk::PACK_EXPAND_WIDGET, 4);
+ pack_start( *imageNumberBox, Gtk::PACK_SHRINK, 4);
+
dcbOptions = Gtk::manage (new Gtk::VBox ());
dcbOptions->set_border_width(4);
@@ -88,6 +100,7 @@ BayerProcess::BayerProcess () : FoldableToolPanel(this, "bayerprocess", M("TP_RA
//pack_start( *allOptions, Gtk::PACK_SHRINK, 4);
methodconn = method->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::methodChanged) );
+ imagenumberconn = imageNumber->signal_changed().connect( sigc::mem_fun(*this, &BayerProcess::imageNumberChanged) );
dcbEnhconn = dcbEnhance->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::dcbEnhanceChanged), true);
//allEnhconn = allEnhance->signal_toggled().connect ( sigc::mem_fun(*this, &BayerProcess::allEnhanceChanged), true);
}
@@ -98,27 +111,33 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params
disableListener ();
methodconn.block (true);
dcbEnhconn.block (true);
+ imagenumberconn.block (true);
//allEnhconn.block (true);
method->set_active(procparams::RAWParams::BayerSensor::numMethods);
+ imageNumber->set_active(pp->raw.bayersensor.imageNum);
- for( size_t i = 0; i < procparams::RAWParams::BayerSensor::numMethods; i++)
+ for( size_t i = 0; i < procparams::RAWParams::BayerSensor::numMethods; i++) {
if( pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[i]) {
method->set_active(i);
- oldSelection = i;
+ oldMethod = i;
break;
}
+ }
- if(pedited ) {
+ if(pedited) {
ccSteps->setEditedState (pedited->raw.bayersensor.ccSteps ? Edited : UnEdited);
dcbIterations->setEditedState ( pedited->raw.bayersensor.dcbIterations ? Edited : UnEdited);
dcbEnhance->set_inconsistent(!pedited->raw.bayersensor.dcbEnhance);
//allEnhance->set_inconsistent(!pedited->raw.bayersensor.allEnhance);
lmmseIterations->setEditedState ( pedited->raw.bayersensor.lmmseIterations ? Edited : UnEdited);
- if( !pedited->raw.bayersensor.method ) {
+ if(!pedited->raw.bayersensor.method) {
method->set_active(procparams::RAWParams::BayerSensor::numMethods); // No name
}
+ if(!pedited->raw.bayersensor.imageNum) {
+ imageNumber->set_active(4);
+ }
}
//allEnhance->set_active(pp->raw.bayersensor.all_enhance);
@@ -126,35 +145,36 @@ void BayerProcess::read(const rtengine::procparams::ProcParams* pp, const Params
dcbIterations->setValue (pp->raw.bayersensor.dcb_iterations);
dcbEnhance->set_active(pp->raw.bayersensor.dcb_enhance);
ccSteps->setValue (pp->raw.bayersensor.ccSteps);
-
- if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::dcb] ||
- method->get_active_row_number() == procparams::RAWParams::BayerSensor::numMethods) {
- dcbOptions->show();
- } else {
- dcbOptions->hide();
- }
-
lmmseIterations->setValue (pp->raw.bayersensor.lmmse_iterations);
- if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::lmmse] ||
- method->get_active_row_number() == procparams::RAWParams::BayerSensor::numMethods) {
- lmmseOptions->show();
- } else {
- lmmseOptions->hide();
- }
+ if (!batchMode) {
+ if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::dcb] ||
+ method->get_active_row_number() == procparams::RAWParams::BayerSensor::numMethods) {
+ dcbOptions->show();
+ } else {
+ dcbOptions->hide();
+ }
+ if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::lmmse] ||
+ method->get_active_row_number() == procparams::RAWParams::BayerSensor::numMethods) {
+ lmmseOptions->show();
+ } else {
+ lmmseOptions->hide();
+ }
- // Flase color suppression is applied to all demozaicing method, so don't hide anything
- /*if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::eahd] ||
- pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::hphd] ||
- pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::vng4])
- ccSteps->show();
- else
- ccSteps->hide();*/
+ // Flase color suppression is applied to all demozaicing method, so don't hide anything
+ /*if (pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::eahd] ||
+ pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::hphd] ||
+ pp->raw.bayersensor.method == procparams::RAWParams::BayerSensor::methodstring[procparams::RAWParams::BayerSensor::vng4])
+ ccSteps->show();
+ else
+ ccSteps->hide();*/
+ }
lastDCBen = pp->raw.bayersensor.dcb_enhance;
//lastALLen = pp->raw.bayersensor.all_enhance;
methodconn.block (false);
+ imagenumberconn.block (false);
dcbEnhconn.block (false);
//allEnhconn.block (false);
@@ -170,19 +190,24 @@ void BayerProcess::write( rtengine::procparams::ProcParams* pp, ParamsEdited* pe
pp->raw.bayersensor.lmmse_iterations = lmmseIterations->getIntValue();
int currentRow = method->get_active_row_number();
-
if( currentRow >= 0 && currentRow < procparams::RAWParams::BayerSensor::numMethods) {
pp->raw.bayersensor.method = procparams::RAWParams::BayerSensor::methodstring[currentRow];
}
+ currentRow = imageNumber->get_active_row_number();
+ if (currentRow < 4) {
+ pp->raw.bayersensor.imageNum = currentRow;
+ }
+
+
if (pedited) {
pedited->raw.bayersensor.ccSteps = ccSteps->getEditedState ();
pedited->raw.bayersensor.method = method->get_active_row_number() != procparams::RAWParams::BayerSensor::numMethods;
+ pedited->raw.bayersensor.imageNum = imageNumber->get_active_row_number() < 4;
pedited->raw.bayersensor.dcbIterations = dcbIterations->getEditedState ();
pedited->raw.bayersensor.dcbEnhance = !dcbEnhance->get_inconsistent();
//pedited->raw.bayersensor.allEnhance = !allEnhance->get_inconsistent();
pedited->raw.bayersensor.lmmseIterations = lmmseIterations->getEditedState ();
-
}
}
@@ -190,6 +215,8 @@ void BayerProcess::setBatchMode(bool batchMode)
{
method->append_text (M("GENERAL_UNCHANGED"));
method->set_active(procparams::RAWParams::BayerSensor::numMethods); // No name
+ imageNumber->append_text (M("GENERAL_UNCHANGED"));
+ imageNumber->set_active(4);
dcbOptions->hide();
lmmseOptions->hide();
ToolPanel::setBatchMode (batchMode);
@@ -250,18 +277,25 @@ void BayerProcess::methodChanged ()
if( curSelection >= 0 && curSelection < procparams::RAWParams::BayerSensor::numMethods) {
methodName = procparams::RAWParams::BayerSensor::methodstring[curSelection];
- if (curSelection == procparams::RAWParams::BayerSensor::mono || oldSelection == procparams::RAWParams::BayerSensor::mono) {
+ if (curSelection == procparams::RAWParams::BayerSensor::mono || oldMethod == procparams::RAWParams::BayerSensor::mono) {
ppreq = true;
}
}
- oldSelection = curSelection;
+ oldMethod = curSelection;
if (listener) {
listener->panelChanged (ppreq ? EvDemosaicMethodPreProc : EvDemosaicMethod, methodName);
}
}
+void BayerProcess::imageNumberChanged ()
+{
+ if (listener) {
+ listener->panelChanged (EvRawImageNum, imageNumber->get_active_text());
+ }
+}
+
void BayerProcess::dcbEnhanceChanged ()
{
if (batchMode) {
diff --git a/rtgui/bayerprocess.h b/rtgui/bayerprocess.h
index b78002ea3..bba4bd51d 100644
--- a/rtgui/bayerprocess.h
+++ b/rtgui/bayerprocess.h
@@ -31,6 +31,8 @@ class BayerProcess : public ToolParamBlock, public AdjusterListener, public Fold
protected:
MyComboBoxText* method;
+ Gtk::HBox *imageNumberBox;
+ MyComboBoxText* imageNumber;
Adjuster* ccSteps;
Gtk::VBox *dcbOptions;
Adjuster* dcbIterations;
@@ -41,9 +43,9 @@ protected:
Adjuster* lmmseIterations;
bool lastDCBen;
- int oldSelection;
+ int oldMethod;
//bool lastALLen;
- sigc::connection methodconn, dcbEnhconn; //,allEnhconn;
+ sigc::connection methodconn, imagenumberconn, dcbEnhconn; //,allEnhconn;
public:
BayerProcess ();
@@ -54,6 +56,7 @@ public:
void setDefaults (const rtengine::procparams::ProcParams* defParams, const ParamsEdited* pedited = nullptr);
void methodChanged ();
+ void imageNumberChanged ();
void adjusterChanged (Adjuster* a, double newval);
void dcbEnhanceChanged();
//void allEnhanceChanged();
diff --git a/rtgui/paramsedited.cc b/rtgui/paramsedited.cc
index ff3e4c0b1..ebb31ef1d 100644
--- a/rtgui/paramsedited.cc
+++ b/rtgui/paramsedited.cc
@@ -359,6 +359,7 @@ void ParamsEdited::set (bool v)
icm.gampos = v;
icm.slpos = v;
raw.bayersensor.method = v;
+ raw.bayersensor.imageNum = v;
raw.bayersensor.ccSteps = v;
raw.bayersensor.exBlack0 = v;
raw.bayersensor.exBlack1 = v;
@@ -854,6 +855,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.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;
raw.bayersensor.exBlack1 = raw.bayersensor.exBlack1 && p.raw.bayersensor.black1 == other.raw.bayersensor.black1;
@@ -2236,6 +2238,10 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
toEdit.raw.bayersensor.method = mods.raw.bayersensor.method;
}
+ if (raw.bayersensor.imageNum) {
+ toEdit.raw.bayersensor.imageNum = mods.raw.bayersensor.imageNum;
+ }
+
if (raw.bayersensor.ccSteps) {
toEdit.raw.bayersensor.ccSteps = mods.raw.bayersensor.ccSteps;
}
@@ -2782,7 +2788,7 @@ void ParamsEdited::combine (rtengine::procparams::ProcParams& toEdit, const rten
bool RAWParamsEdited::BayerSensor::isUnchanged() const
{
- return method && dcbIterations && dcbEnhance && lmmseIterations/*&& allEnhance*/ && greenEq
+ return method && imageNum && dcbIterations && dcbEnhance && lmmseIterations/*&& allEnhance*/ && greenEq
&& linenoise && exBlack0 && exBlack1 && exBlack2 && exBlack3 && exTwoGreen;
}
diff --git a/rtgui/paramsedited.h b/rtgui/paramsedited.h
index 19d143398..4e9fa4eb4 100644
--- a/rtgui/paramsedited.h
+++ b/rtgui/paramsedited.h
@@ -682,6 +682,7 @@ public:
public:
bool method;
+ bool imageNum;
bool ccSteps;
bool exBlack0;
bool exBlack1;
diff --git a/rtgui/partialpastedlg.cc b/rtgui/partialpastedlg.cc
index 78631b725..19a83381e 100644
--- a/rtgui/partialpastedlg.cc
+++ b/rtgui/partialpastedlg.cc
@@ -112,6 +112,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title)
raw_linenoise = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_LINEDENOISE")));
raw_greenthresh = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_PREPROCESS_GREENEQUIL")));
raw_method = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_DMETHOD")));
+ raw_imagenum = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_IMAGENUM")));
raw_ccSteps = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_FALSECOLOR")));
raw_dcb_iterations = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_DCBITERATIONS")));
raw_dcb_enhance = Gtk::manage (new Gtk::CheckButton (M("PARTIALPASTE_RAW_DCBENHANCE")));
@@ -201,6 +202,7 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title)
vboxes[6]->pack_start (*raw, Gtk::PACK_SHRINK, 2);
vboxes[6]->pack_start (*hseps[6], Gtk::PACK_SHRINK, 2);
vboxes[6]->pack_start (*raw_method, Gtk::PACK_SHRINK, 2);
+ vboxes[6]->pack_start (*raw_imagenum, Gtk::PACK_SHRINK, 2);
vboxes[6]->pack_start (*raw_ccSteps, Gtk::PACK_SHRINK, 2);
vboxes[6]->pack_start (*raw_dcb_iterations, Gtk::PACK_SHRINK, 2);
vboxes[6]->pack_start (*raw_dcb_enhance, Gtk::PACK_SHRINK, 2);
@@ -340,7 +342,8 @@ PartialPasteDlg::PartialPasteDlg (const Glib::ustring &title)
exifchConn = exifch->signal_toggled().connect (sigc::bind (sigc::mem_fun(*meta, &Gtk::CheckButton::set_inconsistent), true));
iptcConn = iptc->signal_toggled().connect (sigc::bind (sigc::mem_fun(*meta, &Gtk::CheckButton::set_inconsistent), true));
- raw_methodConn = raw_method->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
+ raw_methodConn = raw_method->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_ccStepsConn = raw_ccSteps->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
raw_dcb_iterationsConn = raw_dcb_iterations->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
raw_dcb_enhanceConn = raw_dcb_enhance->signal_toggled().connect (sigc::bind (sigc::mem_fun(*raw, &Gtk::CheckButton::set_inconsistent), true));
@@ -420,6 +423,7 @@ void PartialPasteDlg::rawToggled ()
{
raw_methodConn.block (true);
+ raw_imagenumConn.block (true);
raw_ccStepsConn.block (true);
raw_dcb_iterationsConn.block (true);
raw_dcb_enhanceConn.block (true);
@@ -446,6 +450,7 @@ void PartialPasteDlg::rawToggled ()
raw->set_inconsistent (false);
raw_method->set_active (raw->get_active ());
+ raw_imagenum->set_active (raw->get_active ());
raw_ccSteps->set_active (raw->get_active ());
raw_dcb_iterations->set_active (raw->get_active ());
raw_dcb_enhance->set_active (raw->get_active ());
@@ -470,6 +475,7 @@ void PartialPasteDlg::rawToggled ()
ff_ClipControl->set_active (raw->get_active ());
raw_methodConn.block (false);
+ raw_imagenumConn.block (false);
raw_ccStepsConn.block (false);
raw_dcb_iterationsConn.block (false);
raw_dcb_enhanceConn.block (false);
@@ -849,6 +855,10 @@ void PartialPasteDlg::applyPaste (rtengine::procparams::ProcParams* dstPP, Param
filterPE.raw.xtranssensor.method = falsePE.raw.xtranssensor.method;
}
+ if (!raw_imagenum->get_active ()) {
+ filterPE.raw.bayersensor.imageNum = falsePE.raw.bayersensor.imageNum;
+ }
+
if (!raw_ccSteps->get_active ()) {
filterPE.raw.bayersensor.ccSteps = falsePE.raw.bayersensor.ccSteps;
filterPE.raw.xtranssensor.ccSteps = falsePE.raw.xtranssensor.ccSteps;
diff --git a/rtgui/partialpastedlg.h b/rtgui/partialpastedlg.h
index d22f50fad..8c9118755 100644
--- a/rtgui/partialpastedlg.h
+++ b/rtgui/partialpastedlg.h
@@ -107,6 +107,7 @@ public:
Gtk::CheckButton* raw_linenoise;
Gtk::CheckButton* raw_greenthresh;
Gtk::CheckButton* raw_method;
+ Gtk::CheckButton* raw_imagenum;
Gtk::CheckButton* raw_ccSteps;
Gtk::CheckButton* raw_dcb_iterations;
Gtk::CheckButton* raw_dcb_enhance;
@@ -129,7 +130,7 @@ public:
sigc::connection coarserotConn, finerotConn, cropConn, resizeConn, prsharpeningConn, perspectiveConn, commonTransConn;
sigc::connection exifchConn, iptcConn, icmConn;
sigc::connection df_fileConn, df_AutoSelectConn, ff_fileConn, ff_AutoSelectConn, ff_BlurRadiusConn, ff_BlurTypeConn, ff_ClipControlConn;
- sigc::connection raw_caredConn, raw_cablueConn, raw_ca_autocorrectConn, raw_hotpix_filtConn, raw_deadpix_filtConn, raw_linenoiseConn, raw_greenthreshConn, raw_ccStepsConn, raw_methodConn, raw_dcb_iterationsConn, raw_lmmse_iterationsConn, raw_dcb_enhanceConn, raw_exposConn, raw_preserConn, raw_blackConn;
+ sigc::connection raw_caredConn, raw_cablueConn, raw_ca_autocorrectConn, raw_hotpix_filtConn, raw_deadpix_filtConn, raw_linenoiseConn, raw_greenthreshConn, raw_ccStepsConn, raw_methodConn, raw_imagenumConn, raw_dcb_iterationsConn, raw_lmmse_iterationsConn, raw_dcb_enhanceConn, raw_exposConn, raw_preserConn, raw_blackConn;
public:
explicit PartialPasteDlg (const Glib::ustring &title);
diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc
index 71aeab0ab..300f61e09 100644
--- a/rtgui/thumbnail.cc
+++ b/rtgui/thumbnail.cc
@@ -137,7 +137,7 @@ void Thumbnail::_generateThumbnailImage ()
if ( tpp == nullptr ) {
quick = false;
- tpp = rtengine::Thumbnail::loadFromRaw (fname, ri, tw, th, 1, pparams.wb.equal, TRUE);
+ tpp = rtengine::Thumbnail::loadFromRaw (fname, ri, tw, th, 1, pparams.wb.equal, TRUE, pparams.raw.bayersensor.imageNum);
}
if (tpp) {