Fix README.md
[gencolormap.git] / testwidget.cpp
1 /*
2  * Copyright (C)  2016 Computer Graphics Group, University of Siegen
3  * Written by Martin Lambers <martin.lambers@uni-siegen.de>
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy
6  * of this software and associated documentation files (the "Software"), to deal
7  * in the Software without restriction, including without limitation the rights
8  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9  * copies of the Software, and to permit persons to whom the Software is
10  * furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  */
23
24 #include <cmath>
25
26 #include <QGuiApplication>
27
28 #include "testwidget.hpp"
29
30
31 /* Apply color map to test image. See
32  * http://peterkovesi.com/projects/colourmaps/colourmaptestimage.html */
33
34 static const int W = 512;
35 static const int H = 128;
36 static const float twopi = 2.0 * M_PI;
37
38 ColorMapTestWidget::ColorMapTestWidget() : QLabel()
39 {
40     setMinimumSize(W * qApp->devicePixelRatio(), H * qApp->devicePixelRatio());
41     QVector<QColor> initial_colormap;
42     initial_colormap.append(QColor(0, 0, 0));
43     update(initial_colormap);
44 }
45
46 ColorMapTestWidget::~ColorMapTestWidget()
47 {
48 }
49
50 void ColorMapTestWidget::update(const QVector<QColor>& colormap)
51 {
52     QImage img(W * qApp->devicePixelRatio(), H * qApp->devicePixelRatio(), QImage::Format_RGB32);
53     for (int y = 0; y < img.height(); y++) {
54         QRgb* scanline = reinterpret_cast<QRgb*>(img.scanLine(y));
55         float v = 1.0f - (y / (img.height() - 1.0f));
56         for (int x = 0; x < img.width(); x++) {
57             float u = x / (img.width() - 1.0f);
58             // Test image formula
59             float ramp = u;
60             float modulation = 0.05f * std::sin(W / 8 * twopi * u);
61             float value = ramp + v * v * modulation;
62             // Applying colormap
63             int i = std::round(value * (colormap.size() - 1));
64             if (i < 0)
65                 i = 0;
66             else if (i >= colormap.size())
67                 i = colormap.size() - 1;
68             scanline[x] = colormap[i].rgb();
69         }
70     }
71     setPixmap(QPixmap::fromImage(img));
72 }