diff --git a/bayer.svg b/bayer.svg
new file mode 100644
index 0000000..a80e1b9
--- /dev/null
+++ b/bayer.svg
@@ -0,0 +1,101 @@
+
+
+
+
diff --git a/image.frag b/image.frag
index 6375e10..b538d56 100644
--- a/image.frag
+++ b/image.frag
@@ -4,6 +4,7 @@ uniform sampler2D qt_Texture0;
in vec2 qt_TexCoord0;
uniform vec3 mtf_param;
uniform bool bw;
+uniform bool invert;
out vec4 color;
vec4 MTF(vec4 x, vec3 m)
@@ -19,6 +20,8 @@ void main(void)
if(bw)color = color.rrra;
color = MTF(color, mtf_param);
+ if(invert)color = vec4(1.0) - color;
+
if(any(lessThan(qt_TexCoord0, vec2(0.0))) || any(greaterThan(qt_TexCoord0, vec2(1.0))))
color = vec4(0.0);
}
diff --git a/imagescrollareagl.cpp b/imagescrollareagl.cpp
index 8b3d3f8..d76564b 100644
--- a/imagescrollareagl.cpp
+++ b/imagescrollareagl.cpp
@@ -53,6 +53,7 @@ ImageWidget::ImageWidget(QWidget *parent) : QOpenGLWidget(parent)
m_blockRepaint = false;
m_range = UINT16_MAX;
m_imgWidth = m_imgHeight = -1;
+ m_superpixel = m_invert = false;
}
ImageWidget::~ImageWidget()
@@ -60,7 +61,7 @@ ImageWidget::~ImageWidget()
makeCurrent();
}
-void ImageWidget::setImage(RawImage *image)
+void ImageWidget::setImage(const RawImage *image)
{
if(image == nullptr)return;
@@ -78,6 +79,7 @@ void ImageWidget::setImage(RawImage *image)
m_image->setWrapMode(QOpenGLTexture::ClampToEdge);
m_image->setBorderColor(0, 0, 0, 0);
m_image->setData(0, rawImageType.pixelFormat, rawImageType.dataType, image->data(), m_transferOptions.get());
+ m_image->setLevelOfDetailRange(m_superpixel ? 1 : 0, m_image->mipMaxLevel());
m_image->generateMipMaps();
m_bwImg = rawImageType.bw;
update();
@@ -126,6 +128,19 @@ void ImageWidget::setOffset(int dx, int dy)
update();
}
+void ImageWidget::superPixel(bool enable)
+{
+ m_superpixel = enable;
+ m_image->setLevelOfDetailRange(enable ? 1 : 0, m_image->mipMaxLevel());
+ update();
+}
+
+void ImageWidget::invert(bool enable)
+{
+ m_invert = enable;
+ update();
+}
+
QImage ImageWidget::renderToImage()
{
if(m_imgWidth < 0)return QImage();
@@ -164,6 +179,7 @@ void ImageWidget::paintGL()
m_program->setUniformValue("mtf_param", m_low, m_mid, m_high);
m_program->setUniformValue("zoom", 1.0f/m_scale);
m_program->setUniformValue("bw", m_bwImg);
+ m_program->setUniformValue("invert", m_invert);
m_image->bind(0);
f->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
diff --git a/imagescrollareagl.h b/imagescrollareagl.h
index 942585b..686afca 100644
--- a/imagescrollareagl.h
+++ b/imagescrollareagl.h
@@ -40,16 +40,20 @@ class ImageWidget : public QOpenGLWidget
float m_scale;
bool m_blockRepaint;
bool m_bwImg;
+ bool m_invert;
+ bool m_superpixel;
public:
explicit ImageWidget(QWidget *parent = nullptr);
~ImageWidget();
- void setImage(RawImage *image);
+ void setImage(const RawImage *image);
void setImage(const QPixmap &pixmap);
void setScale(float scale);
void blockRepaint(bool block);
public slots:
void setMTFParams(float low, float mid, float high);
void setOffset(int dx, int dy);
+ void superPixel(bool enable);
+ void invert(bool enable);
QImage renderToImage();
protected:
void paintGL();
diff --git a/invert.png b/invert.png
new file mode 100644
index 0000000..904fbef
Binary files /dev/null and b/invert.png differ
diff --git a/mainwindow.cpp b/mainwindow.cpp
index 04fac6f..a36d27f 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -44,6 +44,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
m_stretchPanel = new StretchPanel(this);
connect(m_stretchPanel, SIGNAL(paramChanged(float,float,float)), m_imageGL->imageWidget(), SLOT(setMTFParams(float,float,float)));
connect(m_stretchPanel, &StretchPanel::autoStretch, [&](){ m_stretchPanel->stretchImage(m_ringList->currentImage().get()); });
+ connect(m_stretchPanel, &StretchPanel::invert, m_imageGL->imageWidget(), &ImageWidget::invert);
+ connect(m_stretchPanel, &StretchPanel::superPixel, m_imageGL->imageWidget(), &ImageWidget::superPixel);
m_ringList = new ImageRingList(this);
m_filesystem = new FilesystemWidget(m_ringList, this);
diff --git a/nuke.png b/nuke.png
new file mode 100644
index 0000000..504d0c1
Binary files /dev/null and b/nuke.png differ
diff --git a/nuke.svg b/nuke.svg
deleted file mode 100644
index 4308c97..0000000
--- a/nuke.svg
+++ /dev/null
@@ -1,119 +0,0 @@
-
-
-
-
diff --git a/resources.qrc b/resources.qrc
index 5a478e6..03c2096 100644
--- a/resources.qrc
+++ b/resources.qrc
@@ -5,6 +5,8 @@
icon.png
- nuke.svg
+ bayer.svg
+ invert.png
+ nuke.png
diff --git a/stretchpanel.cpp b/stretchpanel.cpp
index da5eab7..dc7b4c1 100644
--- a/stretchpanel.cpp
+++ b/stretchpanel.cpp
@@ -21,22 +21,35 @@ StretchPanel::StretchPanel(QWidget *parent) : QWidget(parent)
setLayout(layout);
m_stfSlider = new STFSlider(this);
- layout->addWidget(m_stfSlider, 0, 0);
+ layout->addWidget(m_stfSlider);
connect(m_stfSlider, SIGNAL(paramChanged(float, float, float)), this, SIGNAL(paramChanged(float,float,float)));
QToolButton *autoStretchButton = new QToolButton(this);
- autoStretchButton->setIcon(QIcon(":/nuke.svg"));
+ autoStretchButton->setIcon(QIcon(":/nuke.png"));
autoStretchButton->setToolTip(tr("Auto Stretch F12"));
autoStretchButton->setShortcut(Qt::Key_F12);
- layout->addWidget(autoStretchButton);
connect(autoStretchButton, SIGNAL(pressed()), this, SIGNAL(autoStretch()));
QToolButton *resetButton = new QToolButton(this);
resetButton->setIcon(style()->standardIcon(QStyle::SP_DialogResetButton));
resetButton->setToolTip(tr("Reset Screen Transfer Function F11"));
resetButton->setShortcut(Qt::Key_F11);
+ connect(resetButton, &QToolButton::pressed, this, &StretchPanel::resetMTF);
+
+ QToolButton *invertButton = new QToolButton(this);
+ invertButton->setIcon(QIcon(":/invert.png"));
+ invertButton->setCheckable(true);
+ connect(invertButton, SIGNAL(toggled(bool)), this, SIGNAL(invert(bool)));
+
+ QToolButton *superPixelButton = new QToolButton(this);
+ superPixelButton->setIcon(QIcon(":/bayer.svg"));
+ superPixelButton->setCheckable(true);
+ connect(superPixelButton, SIGNAL(toggled(bool)), this, SIGNAL(superPixel(bool)));
+
+ layout->addWidget(autoStretchButton);
layout->addWidget(resetButton);
- connect(resetButton, SIGNAL(pressed()), this, SLOT(resetMTF()));
+ layout->addWidget(invertButton);
+ layout->addWidget(superPixelButton);
}
void StretchPanel::stretchImage(Image *img)
diff --git a/stretchpanel.h b/stretchpanel.h
index d468792..e5b6c93 100644
--- a/stretchpanel.h
+++ b/stretchpanel.h
@@ -18,6 +18,8 @@ public slots:
signals:
void paramChanged(float low, float mid, float high);
void autoStretch();
+ void invert(bool enable);
+ void superPixel(bool enable);
};
#endif // STRETCHPANEL_H