diff --git a/falsecolor.png b/falsecolor.png new file mode 100644 index 0000000..144ff55 Binary files /dev/null and b/falsecolor.png differ diff --git a/imagescrollareagl.cpp b/imagescrollareagl.cpp index cdf5cc6..d03b2f8 100644 --- a/imagescrollareagl.cpp +++ b/imagescrollareagl.cpp @@ -274,6 +274,12 @@ void ImageWidget::invert(bool enable) update(); } +void ImageWidget::falseColor(bool enable) +{ + m_falseColor = enable; + update(); +} + QImage ImageWidget::renderToImage() { if(m_imgWidth < 0)return QImage(); @@ -402,6 +408,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_superpixel); + m_program->setUniformValue("false_color", m_falseColor && m_bwImg); m_program->setUniformValue("invert", m_invert); if(m_superpixel)m_program->setUniformValue("whiteBalance", m_whiteBalance[0], m_whiteBalance[1], m_whiteBalance[2]); else m_program->setUniformValue("whiteBalance", 1.0f, 1.0f, 1.0f); diff --git a/imagescrollareagl.h b/imagescrollareagl.h index adf7656..8b2c7a9 100644 --- a/imagescrollareagl.h +++ b/imagescrollareagl.h @@ -57,6 +57,7 @@ class ImageWidget : public QOpenGLWidget float m_whiteBalance[3] = {1.0f, 1.0f, 1.0f}; bool m_blockRepaint; bool m_bwImg; + bool m_falseColor = false; bool m_invert; bool m_superpixel; bool m_showThumbnails; @@ -85,6 +86,7 @@ public slots: void setOffset(float dx, float dy); void superPixel(bool enable); void invert(bool enable); + void falseColor(bool enable); QImage renderToImage(); void thumbnailLoaded(const Image *image); void showThumbnail(bool enable); diff --git a/mainwindow.cpp b/mainwindow.cpp index e6bc48c..09f2dd6 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -84,6 +84,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) connect(m_stretchPanel, &StretchToolbar::autoStretch, [&](){ m_stretchPanel->stretchImage(m_ringList->currentImage().get()); }); connect(m_stretchPanel, &StretchToolbar::invert, m_imageGL->imageWidget(), &ImageWidget::invert); connect(m_stretchPanel, &StretchToolbar::superPixel, m_imageGL->imageWidget(), &ImageWidget::superPixel); + connect(m_stretchPanel, &StretchToolbar::falseColor, m_imageGL->imageWidget(), &ImageWidget::falseColor); m_ringList = new ImageRingList(m_database, nameFilter, this); m_filesystem = new FilesystemWidget(m_ringList, this); diff --git a/resources.qrc b/resources.qrc index cb8790e..a2e2a7b 100644 --- a/resources.qrc +++ b/resources.qrc @@ -17,14 +17,15 @@ shaders/thumb.vert shaders/debayer.frag shaders/debayer.vert + falsecolor.png - + about/help_en - + about/help_sk - + about/help_fr diff --git a/shaders/image.frag b/shaders/image.frag index d8c7371..a6a86bd 100644 --- a/shaders/image.frag +++ b/shaders/image.frag @@ -5,6 +5,7 @@ uniform vec3 mtf_param; uniform bool bw; uniform bool invert; uniform bool srgb; +uniform bool false_color; uniform vec3 whiteBalance; in vec2 qt_TexCoord0; layout(location = 0) out vec4 color; @@ -23,6 +24,20 @@ vec4 MTF(vec4 x, vec3 m) return ((m.y - 1) * x) / ((2 * m.y - 1) * x - m.y); } +vec3 falsecolor(float color) +{ + const vec3 pallete[] = vec3[]( + vec3(1.0, 0.0, 1.0), //magneta + vec3(0.0, 0.0, 1.0), //blue + vec3(0.0, 1.0, 1.0), //cyan + vec3(0.0, 1.0, 0.0), //green + vec3(1.0, 1.0, 0.0), //yellow + vec3(1.0, 0.0, 0.0), vec3(1.0, 0.0, 0.0));//red + color *= 5.0; + int i = int(color); + return mix(pallete[i], pallete[i+1], fract(color)); +} + vec3 checker() { vec2 pattern = fract(gl_FragCoord.xy * 0.0625) - 0.5; @@ -34,6 +49,7 @@ void main(void) color = texture(qt_Texture0, qt_TexCoord0); if(bw)color = color.rrra; color = MTF(color, mtf_param); + if(false_color)color.rgb = falsecolor(color.r); if(invert)color.rgb = vec3(1.0) - color.rgb; diff --git a/stretchtoolbar.cpp b/stretchtoolbar.cpp index 8885588..1bd364a 100644 --- a/stretchtoolbar.cpp +++ b/stretchtoolbar.cpp @@ -34,6 +34,10 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar") invertButton->setCheckable(true); connect(invertButton, SIGNAL(toggled(bool)), this, SIGNAL(invert(bool))); + QAction *falseColorButton = addAction(QIcon(":/falsecolor.png"), tr("False color")); + falseColorButton->setCheckable(true); + connect(falseColorButton, SIGNAL(toggled(bool)), this, SIGNAL(falseColor(bool))); + QAction *superPixelButton = addAction(QIcon(":/bayer.png"), tr("Debayer CFA")); superPixelButton->setCheckable(true); connect(superPixelButton, SIGNAL(toggled(bool)), this, SIGNAL(superPixel(bool))); diff --git a/stretchtoolbar.h b/stretchtoolbar.h index c07e343..95d1152 100644 --- a/stretchtoolbar.h +++ b/stretchtoolbar.h @@ -22,6 +22,7 @@ signals: void autoStretch(); void invert(bool enable); void superPixel(bool enable); + void falseColor(bool enable); }; #endif // STRETCHTOOLBAR_H