From 3fb3b2a760d71dd31a8d92d0b3e5adc0305298f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Sat, 16 May 2020 22:38:38 +0200 Subject: [PATCH] Add ability to set param of stretch --- image.frag | 5 ++++- imagescrollareagl.cpp | 8 +++++++- imagescrollareagl.h | 2 ++ mainwindow.cpp | 1 + stretchpanel.cpp | 35 ++++++++++++++++++++++++++++++----- stretchpanel.h | 6 ++++++ 6 files changed, 50 insertions(+), 7 deletions(-) diff --git a/image.frag b/image.frag index 4262e9a..71b2eaf 100644 --- a/image.frag +++ b/image.frag @@ -24,7 +24,10 @@ void main(void) color = log(a*color + 1.0) / log(vec4(a+1)); break; case 4: - color = asinh(color / a) / asinh(1 / a); + { + float l = color.r*0.2126f + color.g*0.7152f + color.b*0.7152f; + color *= asinh(l / a) / asinh(1 / a); + } break; } diff --git a/imagescrollareagl.cpp b/imagescrollareagl.cpp index c2f67ca..3aa5f7c 100644 --- a/imagescrollareagl.cpp +++ b/imagescrollareagl.cpp @@ -111,6 +111,12 @@ void ImageWidget::setStrech(int stretch) update(); } +void ImageWidget::setStretchParam(float param) +{ + m_param = param; + update(); +} + void ImageWidget::setOffset(int dx, int dy) { m_dx = dx; @@ -137,7 +143,7 @@ void ImageWidget::paintGL() m_program->setUniformValue("viewport", (float)width(), (float)height()); m_program->setUniformValue("offset", dx, dy); m_program->setUniformValue("stretch", m_stretch); - m_program->setUniformValue("a", 0.1f); + m_program->setUniformValue("a", m_param); m_program->setUniformValue("zoom", 1.0f/m_scale); m_image->bind(0); diff --git a/imagescrollareagl.h b/imagescrollareagl.h index 077f232..9389243 100644 --- a/imagescrollareagl.h +++ b/imagescrollareagl.h @@ -37,6 +37,7 @@ class ImageWidget : public QOpenGLWidget float m_range; float m_dx, m_dy; float m_scale; + float m_param; bool m_blockRepaint; public: explicit ImageWidget(QWidget *parent = nullptr); @@ -49,6 +50,7 @@ public slots: void setLow(int low); void setHigh(int high); void setStrech(int stretch); + void setStretchParam(float param); void setOffset(int dx, int dy); protected: void paintGL(); diff --git a/mainwindow.cpp b/mainwindow.cpp index f8d70dc..69b7db3 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -52,6 +52,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) connect(stretchPanel, SIGNAL(lowChanged(int)), m_imageGL->imageWidget(), SLOT(setLow(int))); connect(stretchPanel, SIGNAL(highChanged(int)), m_imageGL->imageWidget(), SLOT(setHigh(int))); connect(stretchPanel, SIGNAL(stretchChanged(int)), m_imageGL->imageWidget(), SLOT(setStrech(int))); + connect(stretchPanel, SIGNAL(paramChanged(float)), m_imageGL->imageWidget(), SLOT(setStretchParam(float))); QDockWidget *stretchDock = new QDockWidget(tr("Stretch"), this); stretchDock->setWidget(stretchPanel); diff --git a/stretchpanel.cpp b/stretchpanel.cpp index b09ada7..a049fec 100644 --- a/stretchpanel.cpp +++ b/stretchpanel.cpp @@ -1,6 +1,5 @@ #include "stretchpanel.h" #include -#include StretchPanel::StretchPanel(QWidget *parent) : QWidget(parent) { @@ -9,19 +8,45 @@ StretchPanel::StretchPanel(QWidget *parent) : QWidget(parent) m_lowSlider = new QSlider(Qt::Horizontal, this); m_highSlider = new QSlider(Qt::Horizontal, this); + m_paramSlider = new QSlider(Qt::Horizontal, this); m_lowSlider->setRange(0, UINT16_MAX); m_highSlider->setRange(0, UINT16_MAX); m_highSlider->setValue(UINT16_MAX); + m_paramSlider->setRange(0, UINT16_MAX); - QComboBox *stretchSelect = new QComboBox(this); - stretchSelect->addItems({tr("Linear"), tr("Square root"), tr("Power"), tr("Logarithm"), tr("Asinh")}); + m_stretchSelect = new QComboBox(this); + m_stretchSelect->addItems({tr("Linear"), tr("Square root"), tr("Power"), tr("Logarithm"), tr("Asinh")}); layout->addWidget(m_lowSlider); layout->addWidget(m_highSlider); - layout->addWidget(stretchSelect); + layout->addWidget(m_paramSlider); + layout->addWidget(m_stretchSelect); connect(m_lowSlider, SIGNAL(valueChanged(int)), this, SIGNAL(lowChanged(int))); connect(m_highSlider, SIGNAL(valueChanged(int)), this, SIGNAL(highChanged(int))); - connect(stretchSelect, SIGNAL(activated(int)), this, SIGNAL(stretchChanged(int))); + connect(m_paramSlider, SIGNAL(valueChanged(int)), this, SLOT(calculateParam())); + connect(m_stretchSelect, SIGNAL(activated(int)), this, SIGNAL(stretchChanged(int))); + connect(m_stretchSelect, SIGNAL(activated(int)), this, SLOT(calculateParam())); +} + +void StretchPanel::calculateParam() +{ + float val = m_paramSlider->value(); + float param; + switch(m_stretchSelect->currentIndex()) + { + case 2: + param = val*10/UINT16_MAX; + break; + case 3: + param = val; + break; + case 4: + param = 1.001-val/UINT16_MAX; + break; + default: + return; + } + emit paramChanged(param); } diff --git a/stretchpanel.h b/stretchpanel.h index 9b8b42a..eeb0bc5 100644 --- a/stretchpanel.h +++ b/stretchpanel.h @@ -3,18 +3,24 @@ #include #include +#include class StretchPanel : public QWidget { Q_OBJECT QSlider *m_lowSlider; QSlider *m_highSlider; + QSlider *m_paramSlider; + QComboBox *m_stretchSelect; public: explicit StretchPanel(QWidget *parent = nullptr); signals: void lowChanged(int low); void highChanged(int high); void stretchChanged(int stretch); + void paramChanged(float param); +private slots: + void calculateParam(); }; #endif // STRETCHPANEL_H