From 46a4715ce5b3bf19fd01e83c3c057884f481854f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Sat, 9 Apr 2022 11:10:07 +0200 Subject: [PATCH] Add support for invert and super pixel --- bayer.svg | 101 +++++++++++++++++++++++++++++++++++ image.frag | 3 ++ imagescrollareagl.cpp | 18 ++++++- imagescrollareagl.h | 6 ++- invert.png | Bin 0 -> 5236 bytes mainwindow.cpp | 2 + nuke.png | Bin 0 -> 1252 bytes nuke.svg | 119 ------------------------------------------ resources.qrc | 4 +- stretchpanel.cpp | 21 ++++++-- stretchpanel.h | 2 + 11 files changed, 150 insertions(+), 126 deletions(-) create mode 100644 bayer.svg create mode 100644 invert.png create mode 100644 nuke.png delete mode 100644 nuke.svg 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 0000000000000000000000000000000000000000..904fbef1436af6452add5954f562cab46a70b7e3 GIT binary patch literal 5236 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..504d0c1d9a6ce57c0f67e7e47df0f5add9e0389d GIT binary patch literal 1252 zcmV%*>#zuI5c8 zel{(+FDE_BkPBl0{pAOqv0aL>C@yb zF0LJ34hPXyRhYI=K)(w33y+3Vg!Xpgo1534giTFkw6;5BeNzZ)+-%xgy2UYKm*(ahC)SDSCbQt9AIh+?fLWMY~u1a z@RRQ$;9W|I5%?AY+dMRcwy==>PN%XHQ=`Gv+e>R+9^};lNV&32EOqp4+$wTNJ)*9SXx?W7b5aWCj_#gfex=`xa94wa!5(E zlpHmgn2eO%cbQB~udMKyl*$#?IvhEIY2QA6)9Lt6DX~Vw^6uSqmX+~txcrKB!13cG z&CT(J&BjOL<7CgzW3=0el@bvjkHcu>MQSQT$;q_s*uf9it_6Naq3}Nw8QX71e4ji3 O0000 literal 0 HcmV?d00001 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