Add a test widget based on the test pattern by P. Kovesi.
authorMartin Lambers <marlam@marlam.de>
Mon, 15 Feb 2016 12:58:31 +0000 (13:58 +0100)
committerMartin Lambers <marlam@marlam.de>
Mon, 15 Feb 2016 12:58:31 +0000 (13:58 +0100)
CMakeLists.txt
gui.cpp
gui.hpp
testwidget.cpp [new file with mode: 0644]
testwidget.hpp [new file with mode: 0644]

index b81d710..479cbe0 100644 (file)
@@ -23,6 +23,7 @@ if(Qt5Widgets_FOUND)
         qt5_add_resources(GUI_RESOURCES gui.qrc)
        add_executable(gencolormap-gui gui.cpp
                colormapwidgets.hpp colormapwidgets.cpp
+                testwidget.hpp testwidget.cpp
                colormap.hpp colormap.cpp ${GUI_RESOURCES})
        target_link_libraries(gencolormap-gui Qt5::Widgets)
        install(TARGETS gencolormap-gui RUNTIME DESTINATION bin)
diff --git a/gui.cpp b/gui.cpp
index a227eca..5d70645 100644 (file)
--- a/gui.cpp
+++ b/gui.cpp
@@ -36,6 +36,7 @@
 #include <QMessageBox>
 
 #include "colormapwidgets.hpp"
+#include "testwidget.hpp"
 
 
 GUI::GUI()
@@ -71,7 +72,6 @@ GUI::GUI()
     connect(_mcnames_widget, SIGNAL(colorMapChanged()), this, SLOT(update()));
 
     QWidget *widget = new QWidget;
-    widget->setMinimumWidth(512 * qApp->devicePixelRatio());
     QGridLayout *layout = new QGridLayout;
 
     _category_widget = new QTabWidget();
@@ -111,6 +111,15 @@ GUI::GUI()
     _colormap_label->setScaledContents(true);
     layout->addWidget(_colormap_label, 0, 1, 4, 1);
 
+    QLabel* test_label = new QLabel("Test pattern "
+            "<a href=\"http://peterkovesi.com/projects/colourmaps/colourmaptestimage.html\">"
+            "designed by P. Kovesi</a>:");
+    test_label->setWordWrap(true);
+    test_label->setOpenExternalLinks(true);
+    layout->addWidget(test_label, 4, 0, 1, 2);
+    _test_widget = new ColorMapTestWidget();
+    layout->addWidget(_test_widget, 5, 0, 1, 2);
+
     layout->setColumnStretch(0, 1);
     layout->setRowStretch(2, 1);
     widget->setLayout(layout);
@@ -165,6 +174,7 @@ void GUI::update()
     QVector<QColor> colormap = currentWidget()->colorMap(&clipped);
     _clipped_label->setText(QString("Colors clipped: %1").arg(clipped));
     _colormap_label->setPixmap(QPixmap::fromImage(currentWidget()->colorMapImage(colormap, 32, _colormap_label->height())));
+    _test_widget->update(colormap);
 }
 
 void GUI::file_export_png()
diff --git a/gui.hpp b/gui.hpp
index c40ac76..3b39bba 100644 (file)
--- a/gui.hpp
+++ b/gui.hpp
@@ -40,6 +40,7 @@ class ColorMapPLQualitativeHueWidget;
 class ColorMapCubeHelixWidget;
 class ColorMapMorelandWidget;
 class ColorMapMcNamesWidget;
+class ColorMapTestWidget;
 class QTabWidget;
 class QLabel;
 
@@ -73,6 +74,7 @@ private:
     QLabel* _reference_label;
     QLabel* _clipped_label;
     QLabel* _colormap_label;
+    ColorMapTestWidget* _test_widget;
 
     ColorMapWidget* currentWidget();
 
diff --git a/testwidget.cpp b/testwidget.cpp
new file mode 100644 (file)
index 0000000..8c60d32
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C)  2016 Computer Graphics Group, University of Siegen
+ * Written by Martin Lambers <martin.lambers@uni-siegen.de>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include <cmath>
+
+#include <QGuiApplication>
+
+#include "testwidget.hpp"
+
+
+/* Apply color map to test image. See
+ * http://peterkovesi.com/projects/colourmaps/colourmaptestimage.html */
+
+static const int W = 512;
+static const int H = 128;
+static const float twopi = 2.0 * M_PI;
+
+ColorMapTestWidget::ColorMapTestWidget() : QLabel()
+{
+    setMinimumSize(W * qApp->devicePixelRatio(), H * qApp->devicePixelRatio());
+    QVector<QColor> initial_colormap;
+    initial_colormap.append(QColor(0, 0, 0));
+    update(initial_colormap);
+}
+
+ColorMapTestWidget::~ColorMapTestWidget()
+{
+}
+
+void ColorMapTestWidget::update(const QVector<QColor>& colormap)
+{
+    QImage img(W * qApp->devicePixelRatio(), H * qApp->devicePixelRatio(), QImage::Format_RGB32);
+    for (int y = 0; y < img.height(); y++) {
+        QRgb* scanline = reinterpret_cast<QRgb*>(img.scanLine(y));
+        float v = 1.0f - (y / (img.height() - 1.0f));
+        for (int x = 0; x < img.width(); x++) {
+            float u = x / (img.width() - 1.0f);
+            // Test image formula
+            float ramp = u;
+            float modulation = 0.05f * std::sin(W / 8 * twopi * u);
+            float value = ramp + v * v * modulation;
+            // Applying colormap
+            int i = std::round(value * (colormap.size() - 1));
+            if (i < 0)
+                i = 0;
+            else if (i >= colormap.size())
+                i = colormap.size() - 1;
+            scanline[x] = colormap[i].rgb();
+        }
+    }
+    setPixmap(QPixmap::fromImage(img));
+}
diff --git a/testwidget.hpp b/testwidget.hpp
new file mode 100644 (file)
index 0000000..a1ead4d
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2016 Computer Graphics Group, University of Siegen
+ * Written by Martin Lambers <martin.lambers@uni-siegen.de>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifndef TESTWIDGET_HPP
+#define TESTWIDGET_HPP
+
+#include <QLabel>
+#include <QVector>
+
+class QColor;
+
+class ColorMapTestWidget : public QLabel
+{
+Q_OBJECT
+
+public:
+    ColorMapTestWidget();
+    ~ColorMapTestWidget();
+
+    void update(const QVector<QColor>& colormap);
+};
+
+#endif