Merge pull request #4891 from Beep6581/show_flatfield_autoclip_in_gui

Flat field: Show auto calculated clip control value in ui
This commit is contained in:
Ingo Weyrich 2018-10-24 15:40:57 +02:00 committed by GitHub
commit eee6837385
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 52 additions and 8 deletions

View File

@ -83,6 +83,7 @@ public:
virtual void setBorder (unsigned int border) {} virtual void setBorder (unsigned int border) {}
virtual void setCurrentFrame (unsigned int frameNum) = 0; virtual void setCurrentFrame (unsigned int frameNum) = 0;
virtual int getFrameCount () = 0; virtual int getFrameCount () = 0;
virtual int getFlatFieldAutoClipValue () = 0;
// use right after demosaicing image, add coarse transformation and put the result in the provided Imagefloat* // use right after demosaicing image, add coarse transformation and put the result in the provided Imagefloat*

View File

@ -93,7 +93,7 @@ ImProcCoordinator::ImProcCoordinator()
fw(0), fh(0), tr(0), fw(0), fh(0), tr(0),
fullw(1), fullh(1), fullw(1), fullh(1),
pW(-1), pH(-1), pW(-1), pH(-1),
plistener(nullptr), imageListener(nullptr), aeListener(nullptr), acListener(nullptr), abwListener(nullptr), awbListener(nullptr), bayerAutoContrastListener(nullptr), xtransAutoContrastListener(nullptr), frameCountListener(nullptr), imageTypeListener(nullptr), actListener(nullptr), adnListener(nullptr), awavListener(nullptr), dehaListener(nullptr), hListener(nullptr), plistener(nullptr), imageListener(nullptr), aeListener(nullptr), acListener(nullptr), abwListener(nullptr), awbListener(nullptr), flatFieldAutoClipListener(nullptr), bayerAutoContrastListener(nullptr), xtransAutoContrastListener(nullptr), frameCountListener(nullptr), imageTypeListener(nullptr), actListener(nullptr), adnListener(nullptr), awavListener(nullptr), dehaListener(nullptr), hListener(nullptr),
resultValid(false), lastOutputProfile("BADFOOD"), lastOutputIntent(RI__COUNT), lastOutputBPC(false), thread(nullptr), changeSinceLast(0), updaterRunning(false), destroying(false), utili(false), autili(false), resultValid(false), lastOutputProfile("BADFOOD"), lastOutputIntent(RI__COUNT), lastOutputBPC(false), thread(nullptr), changeSinceLast(0), updaterRunning(false), destroying(false), utili(false), autili(false),
butili(false), ccutili(false), cclutili(false), clcutili(false), opautili(false), wavcontlutili(false), colourToningSatLimit(0.f), colourToningSatLimitOpacity(0.f), highQualityComputed(false) butili(false), ccutili(false), cclutili(false), clcutili(false), opautili(false), wavcontlutili(false), colourToningSatLimit(0.f), colourToningSatLimitOpacity(0.f), highQualityComputed(false)
{} {}
@ -199,6 +199,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
imgsrc->setCurrentFrame(params.raw.bayersensor.imageNum); imgsrc->setCurrentFrame(params.raw.bayersensor.imageNum);
imgsrc->preprocess(rp, params.lensProf, params.coarse); imgsrc->preprocess(rp, params.lensProf, params.coarse);
if (flatFieldAutoClipListener && rp.ff_AutoClipControl) {
flatFieldAutoClipListener->flatFieldAutoClipValueChanged(imgsrc->getFlatFieldAutoClipValue());
}
imgsrc->getRAWHistogram(histRedRaw, histGreenRaw, histBlueRaw); imgsrc->getRAWHistogram(histRedRaw, histGreenRaw, histBlueRaw);
highDetailPreprocessComputed = highDetailNeeded; highDetailPreprocessComputed = highDetailNeeded;

View File

@ -158,6 +158,7 @@ protected:
AutoCamListener* acListener; AutoCamListener* acListener;
AutoBWListener* abwListener; AutoBWListener* abwListener;
AutoWBListener* awbListener; AutoWBListener* awbListener;
FlatFieldAutoClipListener *flatFieldAutoClipListener;
AutoContrastListener *bayerAutoContrastListener; AutoContrastListener *bayerAutoContrastListener;
AutoContrastListener *xtransAutoContrastListener; AutoContrastListener *xtransAutoContrastListener;
FrameCountListener *frameCountListener; FrameCountListener *frameCountListener;
@ -346,6 +347,10 @@ public:
frameCountListener = fcl; frameCountListener = fcl;
} }
void setFlatFieldAutoClipListener (FlatFieldAutoClipListener* ffacl)
{
flatFieldAutoClipListener = ffacl;
}
void setBayerAutoContrastListener (AutoContrastListener* acl) void setBayerAutoContrastListener (AutoContrastListener* acl)
{ {
bayerAutoContrastListener = acl; bayerAutoContrastListener = acl;

View File

@ -2872,8 +2872,6 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile
float limitFactor = 1.f; float limitFactor = 1.f;
if(raw.ff_AutoClipControl) { if(raw.ff_AutoClipControl) {
// int clipControlGui = 0;
for (int m = 0; m < 2; m++) for (int m = 0; m < 2; m++)
for (int n = 0; n < 2; n++) { for (int n = 0; n < 2; n++) {
float maxval = 0.f; float maxval = 0.f;
@ -2917,7 +2915,7 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile
} }
} }
// clipControlGui = (1.f - limitFactor) * 100.f; // this value can be used to set the clip control slider in gui flatFieldAutoClipValue = (1.f - limitFactor) * 100.f; // this value can be used to set the clip control slider in gui
} else { } else {
limitFactor = max((float)(100 - raw.ff_clipControl) / 100.f, 0.01f); limitFactor = max((float)(100 - raw.ff_clipControl) / 100.f, 0.01f);
} }
@ -3003,7 +3001,6 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile
if(raw.ff_AutoClipControl) { if(raw.ff_AutoClipControl) {
// determine maximum calculated value to avoid clipping // determine maximum calculated value to avoid clipping
// int clipControlGui = 0;
float maxval = 0.f; float maxval = 0.f;
// xtrans files have only one black level actually, so we can simplify the code a bit // xtrans files have only one black level actually, so we can simplify the code a bit
#ifdef _OPENMP #ifdef _OPENMP
@ -3038,7 +3035,7 @@ void RawImageSource::processFlatField(const RAWParams &raw, RawImage *riFlatFile
// there's only one white level for xtrans // there's only one white level for xtrans
if(maxval + black[0] > ri->get_white(0)) { if(maxval + black[0] > ri->get_white(0)) {
limitFactor = ri->get_white(0) / (maxval + black[0]); limitFactor = ri->get_white(0) / (maxval + black[0]);
// clipControlGui = (1.f - limitFactor) * 100.f; // this value can be used to set the clip control slider in gui flatFieldAutoClipValue = (1.f - limitFactor) * 100.f; // this value can be used to set the clip control slider in gui
} }
} else { } else {
limitFactor = max((float)(100 - raw.ff_clipControl) / 100.f, 0.01f); limitFactor = max((float)(100 - raw.ff_clipControl) / 100.f, 0.01f);

View File

@ -74,7 +74,7 @@ protected:
RawImage* riFrames[4] = {nullptr}; RawImage* riFrames[4] = {nullptr};
unsigned int currFrame = 0; unsigned int currFrame = 0;
unsigned int numFrames = 0; unsigned int numFrames = 0;
int flatFieldAutoClipValue = 0;
array2D<float> rawData; // holds preprocessed pixel values, rowData[i][j] corresponds to the ith row and jth column array2D<float> rawData; // holds preprocessed pixel values, rowData[i][j] corresponds to the ith row and jth column
array2D<float> *rawDataFrames[4] = {nullptr}; array2D<float> *rawDataFrames[4] = {nullptr};
array2D<float> *rawDataBuffer[3] = {nullptr}; array2D<float> *rawDataBuffer[3] = {nullptr};
@ -212,6 +212,7 @@ public:
ri = riFrames[currFrame]; ri = riFrames[currFrame];
} }
int getFrameCount() {return numFrames;} int getFrameCount() {return numFrames;}
int getFlatFieldAutoClipValue() {return flatFieldAutoClipValue;}
class GreenEqulibrateThreshold { class GreenEqulibrateThreshold {
public: public:

View File

@ -371,6 +371,13 @@ public:
virtual void FrameCountChanged(int n, int frameNum) = 0; virtual void FrameCountChanged(int n, int frameNum) = 0;
}; };
class FlatFieldAutoClipListener
{
public:
virtual ~FlatFieldAutoClipListener() = default;
virtual void flatFieldAutoClipValueChanged(int n) = 0;
};
class ImageTypeListener class ImageTypeListener
{ {
public: public:
@ -488,6 +495,7 @@ public:
virtual void setHistogramListener (HistogramListener *l) = 0; virtual void setHistogramListener (HistogramListener *l) = 0;
virtual void setPreviewImageListener (PreviewImageListener* l) = 0; virtual void setPreviewImageListener (PreviewImageListener* l) = 0;
virtual void setAutoCamListener (AutoCamListener* l) = 0; virtual void setAutoCamListener (AutoCamListener* l) = 0;
virtual void setFlatFieldAutoClipListener (FlatFieldAutoClipListener* l) = 0;
virtual void setFrameCountListener (FrameCountListener* l) = 0; virtual void setFrameCountListener (FrameCountListener* l) = 0;
virtual void setBayerAutoContrastListener (AutoContrastListener* l) = 0; virtual void setBayerAutoContrastListener (AutoContrastListener* l) = 0;
virtual void setXtransAutoContrastListener (AutoContrastListener* l) = 0; virtual void setXtransAutoContrastListener (AutoContrastListener* l) = 0;

View File

@ -100,6 +100,7 @@ public:
} }
void setCurrentFrame(unsigned int frameNum) {} void setCurrentFrame(unsigned int frameNum) {}
int getFrameCount() {return 1;} int getFrameCount() {return 1;}
int getFlatFieldAutoClipValue() {return 0;}
void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) { R = G = B = 0;} void getRawValues(int x, int y, int rotate, int &R, int &G, int &B) { R = G = B = 0;}

View File

@ -104,6 +104,11 @@ FlatField::FlatField () : FoldableToolPanel(this, "flatfield", M("TP_FLATFIELD_L
} }
} }
FlatField::~FlatField ()
{
idle_register.destroy();
}
void FlatField::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited) void FlatField::read(const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited)
{ {
disableListener (); disableListener ();
@ -403,3 +408,22 @@ void FlatField::setShortcutPath(const Glib::ustring& path)
} catch (Glib::Error&) {} } catch (Glib::Error&) {}
} }
void FlatField::flatFieldAutoClipValueChanged(int n)
{
struct Data {
FlatField *me;
int n;
};
const auto func = [](gpointer data) -> gboolean {
Data *d = static_cast<Data *>(data);
FlatField *me = d->me;
me->disableListener();
me->flatFieldClipControl->setValue (d->n);
me->enableListener();
delete d;
return FALSE;
};
idle_register.add(func, new Data { this, n });
}

View File

@ -35,7 +35,7 @@ public:
// add other info here // add other info here
}; };
class FlatField : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel class FlatField : public ToolParamBlock, public AdjusterListener, public FoldableToolPanel, public rtengine::FlatFieldAutoClipListener
{ {
protected: protected:
@ -58,9 +58,11 @@ protected:
bool b_filter_asCurrent; bool b_filter_asCurrent;
bool israw; bool israw;
IdleRegister idle_register;
public: public:
FlatField (); FlatField ();
~FlatField ();
void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr); void read (const rtengine::procparams::ProcParams* pp, const ParamsEdited* pedited = nullptr);
void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr); void write (rtengine::procparams::ProcParams* pp, ParamsEdited* pedited = nullptr);
@ -80,6 +82,7 @@ public:
{ {
ffp = p; ffp = p;
}; };
void flatFieldAutoClipValueChanged(int n = 0);
}; };
#endif #endif

View File

@ -521,6 +521,7 @@ void ToolPanelCoordinator::initImage (rtengine::StagedImageProcessor* ipc_, bool
ipc->setAutoCamListener (colorappearance); ipc->setAutoCamListener (colorappearance);
ipc->setAutoBWListener (blackwhite); ipc->setAutoBWListener (blackwhite);
ipc->setFrameCountListener (bayerprocess); ipc->setFrameCountListener (bayerprocess);
ipc->setFlatFieldAutoClipListener (flatfield);
ipc->setBayerAutoContrastListener (bayerprocess); ipc->setBayerAutoContrastListener (bayerprocess);
ipc->setXtransAutoContrastListener (xtransprocess); ipc->setXtransAutoContrastListener (xtransprocess);
ipc->setAutoWBListener (whitebalance); ipc->setAutoWBListener (whitebalance);