diff --git a/link.png b/link.png
new file mode 100644
index 0000000..b11d3ba
Binary files /dev/null and b/link.png differ
diff --git a/resources.qrc b/resources.qrc
index a2e2a7b..b71d1ce 100644
--- a/resources.qrc
+++ b/resources.qrc
@@ -18,6 +18,7 @@
shaders/debayer.frag
shaders/debayer.vert
falsecolor.png
+ link.png
about/help_en
diff --git a/stretchtoolbar.cpp b/stretchtoolbar.cpp
index b4ee306..ade2411 100644
--- a/stretchtoolbar.cpp
+++ b/stretchtoolbar.cpp
@@ -23,7 +23,7 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar")
m_stfSlider = new STFSlider(Qt::white, this);
vbox1->addWidget(m_stfSlider);
- /*m_stfSliderR = new STFSlider(Qt::red, this);
+ m_stfSliderR = new STFSlider(Qt::red, this);
m_stfSliderG = new STFSlider(Qt::green, this);
m_stfSliderB = new STFSlider(Qt::blue, this);
QWidget *rgb = new QWidget(this);
@@ -31,12 +31,12 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar")
vbox2->setSpacing(0);
vbox2->addWidget(m_stfSliderR);
vbox2->addWidget(m_stfSliderG);
- vbox2->addWidget(m_stfSliderB);*/
+ vbox2->addWidget(m_stfSliderB);
m_stack = new QStackedWidget(this);
m_stack->addWidget(lum);
- //m_stack->addWidget(rgb);
- //m_stack->setCurrentIndex(0);
+ m_stack->addWidget(rgb);
+ m_stack->setCurrentIndex(0);
addWidget(m_stack);
connect(m_stfSlider, &STFSlider::paramChanged, [this](float blackPoint, float midPoint, float whitePoint){
@@ -45,7 +45,7 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar")
m_mtfParam.whitePoint[0] = m_mtfParam.whitePoint[1] = m_mtfParam.whitePoint[2] = whitePoint;
emit paramChanged(m_mtfParam);
});
- /*connect(m_stfSliderR, &STFSlider::paramChanged, [this](float blackPoint, float midPoint, float whitePoint){
+ connect(m_stfSliderR, &STFSlider::paramChanged, [this](float blackPoint, float midPoint, float whitePoint){
m_mtfParam.blackPoint[0] = blackPoint;
m_mtfParam.midPoint[0] = midPoint;
m_mtfParam.whitePoint[0] = whitePoint;
@@ -62,7 +62,11 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar")
m_mtfParam.midPoint[2] = midPoint;
m_mtfParam.whitePoint[2] = whitePoint;
emit paramChanged(m_mtfParam);
- });*/
+ });
+
+ QAction *rgbStretch = addAction(QIcon(":/link.png"), tr("Linked stretch"));
+ rgbStretch->setCheckable(true);
+ connect(rgbStretch, &QAction::toggled, this, &StretchToolbar::unlinkStretch);
QAction *autoStretchButton = addAction(QIcon(":/nuke.png"), tr("Auto Stretch F12"));
autoStretchButton->setShortcut(Qt::Key_F12);
@@ -74,15 +78,15 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar")
QAction *invertButton = addAction(QIcon(":/invert.png"), tr("Invert colors"));
invertButton->setCheckable(true);
- connect(invertButton, SIGNAL(toggled(bool)), this, SIGNAL(invert(bool)));
+ connect(invertButton, &QAction::toggled, this, &StretchToolbar::invert);
QAction *falseColorButton = addAction(QIcon(":/falsecolor.png"), tr("False color"));
falseColorButton->setCheckable(true);
- connect(falseColorButton, SIGNAL(toggled(bool)), this, SIGNAL(falseColor(bool)));
+ connect(falseColorButton, &QAction::toggled, this, &StretchToolbar::falseColor);
QAction *superPixelButton = addAction(QIcon(":/bayer.png"), tr("Debayer CFA"));
superPixelButton->setCheckable(true);
- connect(superPixelButton, SIGNAL(toggled(bool)), this, SIGNAL(superPixel(bool)));
+ connect(superPixelButton, &QAction::toggled, this, &StretchToolbar::superPixel);
m_autoStretchOnLoad = addAction(QIcon(":/nuke_a.png"), tr("Apply auto stretch on load"));
m_autoStretchOnLoad->setCheckable(true);
@@ -90,49 +94,52 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar")
void StretchToolbar::stretchImage(Image *img)
{
- if(img)
+ if(img && img->rawImage())
{
- if(img->rawImage())
+ const RawImage::Stats &stats = img->rawImage()->imageStats();
+ int ch = img->rawImage()->channels() == 1 ? 1 : 3;
+ float bp2 = 0;
+ float mid2 = 0;
+ float max2 = 0;
+ for(int i=0; i < ch; i++)
{
- const RawImage::Stats &stats = img->rawImage()->imageStats();
- int ch = img->rawImage()->channels() == 1 ? 1 : 3;
- float bp2 = 0;
- float mid2 = 0;
- float max2 = 0;
- for(int i=0; i < ch; i++)
- {
- double median, mad, max;
- median = stats.m_median[i];
- mad = stats.m_mad[i];
- max = stats.m_max[i];
- median /= img->rawImage()->norm();
- mad /= img->rawImage()->norm();
- max /= img->rawImage()->norm();
- if(max>1.0f)max = 1.0f;
- float bp = median + mad * BLACK_POINT_SIGMA * MAD_TO_SIGMA;
- float mid = MTF(median - bp, TARGET_BACKGROUND);
- m_mtfParam.blackPoint[i] = bp;
- m_mtfParam.midPoint[i] = mid;
- m_mtfParam.whitePoint[i] = max;
- bp2 += bp;
- mid2 += mid;
- max2 += max;
- }
- if(m_stack->currentIndex() == 0)
- {
- m_mtfParam.blackPoint[0] = m_mtfParam.blackPoint[1] = m_mtfParam.blackPoint[2] = bp2 / ch;
- m_mtfParam.midPoint[0] = m_mtfParam.midPoint[1] = m_mtfParam.midPoint[2] = mid2 / ch;
- m_mtfParam.whitePoint[0] = m_mtfParam.whitePoint[1] = m_mtfParam.whitePoint[2] = max2 / ch;
- m_stfSlider->setMTFParams(m_mtfParam.blackPoint[0], m_mtfParam.midPoint[0], m_mtfParam.whitePoint[0]);
- }
- else
- {
- m_stfSliderR->setMTFParams(m_mtfParam.blackPoint[0], m_mtfParam.midPoint[0], m_mtfParam.whitePoint[0]);
- m_stfSliderG->setMTFParams(m_mtfParam.blackPoint[1], m_mtfParam.midPoint[1], m_mtfParam.whitePoint[1]);
- m_stfSliderB->setMTFParams(m_mtfParam.blackPoint[2], m_mtfParam.midPoint[2], m_mtfParam.whitePoint[2]);
- }
- emit paramChanged(m_mtfParam);
+ double median, mad, max;
+ median = stats.m_median[i];
+ mad = stats.m_mad[i];
+ max = stats.m_max[i];
+ median /= img->rawImage()->norm();
+ mad /= img->rawImage()->norm();
+ max /= img->rawImage()->norm();
+ if(max>1.0f)max = 1.0f;
+ float bp = median + mad * BLACK_POINT_SIGMA * MAD_TO_SIGMA;
+ float mid = MTF(median - bp, TARGET_BACKGROUND);
+ m_mtfParam.blackPoint[i] = bp;
+ m_mtfParam.midPoint[i] = mid;
+ m_mtfParam.whitePoint[i] = max;
+ bp2 += bp;
+ mid2 += mid;
+ max2 += max;
}
+ if(ch == 1)
+ {
+ m_mtfParam.blackPoint[1] = m_mtfParam.blackPoint[2] = m_mtfParam.blackPoint[0];
+ m_mtfParam.midPoint[1] = m_mtfParam.midPoint[2] = m_mtfParam.midPoint[0];
+ m_mtfParam.whitePoint[1] = m_mtfParam.whitePoint[2] = m_mtfParam.whitePoint[0];
+ }
+ if(m_stack->currentIndex() == 0)
+ {
+ m_mtfParam.blackPoint[0] = m_mtfParam.blackPoint[1] = m_mtfParam.blackPoint[2] = bp2 / ch;
+ m_mtfParam.midPoint[0] = m_mtfParam.midPoint[1] = m_mtfParam.midPoint[2] = mid2 / ch;
+ m_mtfParam.whitePoint[0] = m_mtfParam.whitePoint[1] = m_mtfParam.whitePoint[2] = max2 / ch;
+ m_stfSlider->setMTFParams(m_mtfParam.blackPoint[0], m_mtfParam.midPoint[0], m_mtfParam.whitePoint[0]);
+ }
+ else
+ {
+ m_stfSliderR->setMTFParams(m_mtfParam.blackPoint[0], m_mtfParam.midPoint[0], m_mtfParam.whitePoint[0]);
+ m_stfSliderG->setMTFParams(m_mtfParam.blackPoint[1], m_mtfParam.midPoint[1], m_mtfParam.whitePoint[1]);
+ m_stfSliderB->setMTFParams(m_mtfParam.blackPoint[2], m_mtfParam.midPoint[2], m_mtfParam.whitePoint[2]);
+ }
+ emit paramChanged(m_mtfParam);
}
}
@@ -140,10 +147,16 @@ void StretchToolbar::resetMTF()
{
MTFParam params;
m_mtfParam = params;
- m_stfSlider->setMTFParams(0, 0.5, 1);
- m_stfSliderR->setMTFParams(0, 0.5, 1);
- m_stfSliderG->setMTFParams(0, 0.5, 1);
- m_stfSliderB->setMTFParams(0, 0.5, 1);
+ if(m_stack->currentIndex() == 0)
+ {
+ m_stfSlider->setMTFParams(0, 0.5, 1);
+ }
+ else
+ {
+ m_stfSliderR->setMTFParams(0, 0.5, 1);
+ m_stfSliderG->setMTFParams(0, 0.5, 1);
+ m_stfSliderB->setMTFParams(0, 0.5, 1);
+ }
emit paramChanged(params);
}
@@ -152,3 +165,22 @@ void StretchToolbar::imageLoaded(Image *img)
if(m_autoStretchOnLoad->isChecked())
stretchImage(img);
}
+
+void StretchToolbar::unlinkStretch(bool enable)
+{
+ if(enable)
+ {
+ m_stack->setCurrentIndex(1);
+ m_mtfParam.blackPoint[0] = m_stfSliderR->blackPoint(); m_mtfParam.midPoint[0] = m_stfSliderR->midPoint(); m_mtfParam.whitePoint[0] = m_stfSliderR->whitePoint();
+ m_mtfParam.blackPoint[1] = m_stfSliderG->blackPoint(); m_mtfParam.midPoint[1] = m_stfSliderG->midPoint(); m_mtfParam.whitePoint[1] = m_stfSliderG->whitePoint();
+ m_mtfParam.blackPoint[2] = m_stfSliderB->blackPoint(); m_mtfParam.midPoint[2] = m_stfSliderB->midPoint(); m_mtfParam.whitePoint[2] = m_stfSliderB->whitePoint();
+ }
+ else
+ {
+ m_stack->setCurrentIndex(0);
+ m_mtfParam.blackPoint[0] = m_mtfParam.blackPoint[1] = m_mtfParam.blackPoint[2] = m_stfSlider->blackPoint();
+ m_mtfParam.midPoint[0] = m_mtfParam.midPoint[1] = m_mtfParam.midPoint[2] = m_stfSlider->midPoint();
+ m_mtfParam.whitePoint[0] = m_mtfParam.whitePoint[1] = m_mtfParam.whitePoint[2] = m_mtfParam.whitePoint[2] = m_stfSlider->whitePoint();
+ }
+ emit paramChanged(m_mtfParam);
+}
diff --git a/stretchtoolbar.h b/stretchtoolbar.h
index 3ec895d..8b35b9d 100644
--- a/stretchtoolbar.h
+++ b/stretchtoolbar.h
@@ -30,6 +30,7 @@ public slots:
void stretchImage(Image *img);
void resetMTF();
void imageLoaded(Image *img);
+ void unlinkStretch(bool enable);
signals:
void paramChanged(const MTFParam ¶ms);
void autoStretch();