diff --git a/imagescrollareagl.cpp b/imagescrollareagl.cpp index f722a7e..52f0094 100644 --- a/imagescrollareagl.cpp +++ b/imagescrollareagl.cpp @@ -215,6 +215,18 @@ QVector2D ImageWidget::getImagePixelCoord(const QVector2D &pos) return (pos + offset) / m_scale; } +void ImageWidget::setBayerMask(int mask) +{ + m_firstRed[0] = mask & 0x1; + m_firstRed[1] = (mask & 0x2) >> 1; + if(m_debayerTex) + { + f->glDeleteTextures(1, &m_debayerTex); + m_debayerTex = 0; + } + update(); +} + void ImageWidget::setMTFParams(const MTFParam ¶ms) { m_mtfParams = params; @@ -684,6 +696,7 @@ void ImageWidget::debayer() f->glViewport(0, 0, m_imgWidth, m_imgHeight); m_debayerProgram->bind(); + f->glUniform2i(m_debayerProgram->uniformLocation("firstRed"), m_firstRed[0], m_firstRed[1]); m_image->bind(0); f->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); diff --git a/imagescrollareagl.h b/imagescrollareagl.h index 07f56fa..e4a3bce 100644 --- a/imagescrollareagl.h +++ b/imagescrollareagl.h @@ -65,6 +65,7 @@ class ImageWidget : public QOpenGLWidget int m_thumbnailCount = 0; int m_maxTextureSize = 0; int m_maxArrayLayers = 0; + int m_firstRed[2] = {0, 0}; QVector m_thumnails; Database *m_database = nullptr; QPointF m_lastPos; @@ -79,6 +80,7 @@ public: void blockRepaint(bool block); void allocateThumbnails(const QStringList &paths); QVector2D getImagePixelCoord(const QVector2D &pos); + void setBayerMask(int mask); public slots: void setMTFParams(const MTFParam ¶ms); void setOffset(float dx, float dy); diff --git a/libXISF b/libXISF index 8a1f305..aa35644 160000 --- a/libXISF +++ b/libXISF @@ -1 +1 @@ -Subproject commit 8a1f305cc71135003ef78c919787bbc2865f77af +Subproject commit aa356443d308e848fcaa35d0470095f7a293aa76 diff --git a/mainwindow.cpp b/mainwindow.cpp index 7c0f3e8..82bcd7c 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -173,6 +173,26 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) viewMenu->addAction(tr("Zoom Out"), m_imageGL, SLOT(zoomOut()), QKeySequence::ZoomOut); viewMenu->addAction(tr("Best Fit"), m_imageGL, SLOT(bestFit()), QKeySequence("Ctrl+1")); viewMenu->addAction(tr("100%"), m_imageGL, SLOT(oneToOne())); + viewMenu->addSeparator(); + QMenu *bayerMenu = viewMenu->addMenu(tr("Bayer mask")); + QActionGroup *bayerActionGroup = new QActionGroup(this); + QAction *rggbAction = bayerActionGroup->addAction(tr("RGGB"));//0 0 + QAction *grbgAction = bayerActionGroup->addAction(tr("GRBG"));//1 0 + QAction *gbrgAction = bayerActionGroup->addAction(tr("GBRG"));//0 1 + QAction *bggrAction = bayerActionGroup->addAction(tr("BGGR"));//1 1 + rggbAction->setCheckable(true); rggbAction->setData(0); + grbgAction->setCheckable(true); grbgAction->setData(1); + gbrgAction->setCheckable(true); gbrgAction->setData(2); + bggrAction->setCheckable(true); bggrAction->setData(3); + bayerMenu->addActions({rggbAction, grbgAction, gbrgAction, bggrAction}); + viewMenu->addMenu(bayerMenu); + connect(bayerActionGroup, &QActionGroup::triggered, [this](QAction *action){ + int data = action->data().toInt(); + m_imageGL->imageWidget()->setBayerMask(data); + QSettings settings; + settings.setValue("mainwindow/bayermask", data); + }); + QAction *thumbnailsAction = viewMenu->addAction(tr("Thumbnails"), [this](bool checked){ if(SettingsDialog::loadThumbsizes())m_ringList->clearThumbnails(); m_imageGL->imageWidget()->allocateThumbnails(m_ringList->imageNames()); @@ -237,6 +257,19 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) QSettings settings; restoreGeometry(settings.value("mainwindow/geometry").toByteArray()); restoreState(settings.value("mainwindow/state").toByteArray()); + int bayermask = settings.value("mainwindow/bayermask", 0).toInt(); + switch(bayermask) + { + default: + case 0: + rggbAction->setChecked(true); break; + case 1: + grbgAction->setChecked(true); break; + case 2: + gbrgAction->setChecked(true); break; + case 3: + bggrAction->setChecked(true); break; + } QStringList standardLocations = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation); if(standardLocations.size()) diff --git a/shaders/debayer.frag b/shaders/debayer.frag index f31cc87..8830357 100644 --- a/shaders/debayer.frag +++ b/shaders/debayer.frag @@ -1,6 +1,7 @@ #version 330 uniform sampler2D qt_Texture0; +uniform ivec2 firstRed; in vec2 qt_TexCoord0; in vec2 center; layout(location = 0) out vec4 color; @@ -11,7 +12,7 @@ void main(void) { ivec2 texSize = textureSize(qt_Texture0, 0); ivec2 icenter = ivec2(center); - ivec2 alternate = icenter % 2; + ivec2 alternate = (icenter + firstRed) % 2; // cross, checker, theta, phi const vec4 kA = vec4(-1.0, -1.5, 0.5, -1.0) / 8.0;