Replace README with new README.md
[mappings-sphere-disc-square.git] / pngvis.cpp
1 #include <cmath>
2
3 #include <QColor>
4 #include <QImage>
5
6 #include "pngvis.hpp"
7
8 /* This color map was created with gencolormap, https://github.com/marlam/gencolormap
9  * using the following parameters: type=diverging n=301 hue=0 divergence=240
10  * warmth=0.15 contrast=0.88 saturation=0.6 brightness=0.75 */
11 static const int colormap_colors = 301;
12 static const unsigned char colormap[] {
13 87, 7, 35,
14 90, 8, 36,
15 94, 9, 38,
16 98, 10, 40,
17 101, 12, 42,
18 105, 13, 44,
19 108, 15, 46,
20 112, 16, 48,
21 115, 18, 50,
22 119, 19, 52,
23 122, 21, 54,
24 126, 22, 56,
25 129, 24, 58,
26 132, 25, 60,
27 136, 27, 62,
28 139, 29, 63,
29 142, 30, 65,
30 145, 32, 67,
31 148, 34, 69,
32 152, 35, 71,
33 155, 37, 73,
34 158, 39, 75,
35 161, 40, 77,
36 164, 42, 78,
37 166, 44, 80,
38 169, 46, 82,
39 172, 48, 84,
40 175, 49, 86,
41 177, 51, 88,
42 180, 53, 90,
43 183, 55, 91,
44 185, 57, 93,
45 188, 59, 95,
46 190, 60, 97,
47 193, 62, 99,
48 195, 64, 100,
49 198, 66, 102,
50 200, 68, 104,
51 202, 70, 106,
52 204, 72, 108,
53 206, 74, 109,
54 208, 76, 111,
55 210, 78, 113,
56 212, 80, 115,
57 214, 82, 116,
58 216, 84, 118,
59 218, 86, 120,
60 220, 88, 121,
61 222, 90, 123,
62 223, 92, 125,
63 225, 94, 127,
64 227, 96, 128,
65 228, 98, 130,
66 230, 100, 132,
67 231, 102, 133,
68 233, 104, 135,
69 234, 106, 137,
70 235, 108, 138,
71 237, 110, 140,
72 238, 112, 141,
73 239, 114, 143,
74 240, 116, 145,
75 242, 118, 146,
76 243, 120, 148,
77 244, 122, 149,
78 245, 124, 151,
79 246, 125, 153,
80 247, 127, 154,
81 248, 129, 156,
82 249, 131, 157,
83 250, 133, 159,
84 251, 135, 160,
85 251, 137, 162,
86 252, 139, 163,
87 253, 141, 165,
88 254, 142, 166,
89 255, 144, 168,
90 255, 146, 169,
91 255, 148, 170,
92 255, 150, 172,
93 255, 151, 173,
94 255, 153, 175,
95 255, 155, 176,
96 255, 157, 178,
97 255, 158, 179,
98 255, 160, 180,
99 255, 162, 182,
100 255, 164, 183,
101 255, 165, 184,
102 255, 167, 186,
103 255, 169, 187,
104 255, 170, 188,
105 255, 172, 190,
106 255, 174, 191,
107 255, 175, 192,
108 255, 177, 193,
109 255, 178, 195,
110 255, 180, 196,
111 255, 182, 197,
112 255, 183, 198,
113 255, 185, 200,
114 255, 186, 201,
115 255, 188, 202,
116 255, 189, 203,
117 255, 191, 204,
118 255, 192, 206,
119 255, 194, 207,
120 255, 195, 208,
121 255, 197, 209,
122 255, 198, 210,
123 255, 200, 211,
124 255, 201, 213,
125 255, 203, 214,
126 255, 204, 215,
127 255, 205, 216,
128 255, 207, 217,
129 255, 208, 218,
130 255, 210, 219,
131 255, 211, 220,
132 255, 212, 221,
133 255, 214, 222,
134 255, 215, 223,
135 255, 216, 224,
136 255, 218, 225,
137 255, 219, 226,
138 255, 220, 227,
139 255, 222, 228,
140 255, 223, 229,
141 255, 224, 230,
142 255, 225, 231,
143 255, 227, 232,
144 255, 228, 233,
145 255, 229, 234,
146 255, 230, 235,
147 255, 231, 236,
148 255, 233, 237,
149 255, 234, 238,
150 255, 235, 239,
151 255, 236, 240,
152 255, 237, 241,
153 255, 238, 241,
154 255, 239, 242,
155 255, 241, 243,
156 255, 242, 244,
157 255, 243, 245,
158 255, 244, 246,
159 255, 245, 247,
160 255, 246, 247,
161 255, 247, 248,
162 255, 248, 249,
163 253, 251, 253,
164 246, 251, 255,
165 245, 251, 255,
166 244, 250, 255,
167 243, 249, 255,
168 241, 249, 255,
169 240, 248, 255,
170 239, 247, 255,
171 238, 247, 255,
172 236, 246, 255,
173 235, 245, 255,
174 234, 245, 255,
175 232, 244, 255,
176 231, 243, 255,
177 230, 242, 255,
178 228, 242, 255,
179 227, 241, 255,
180 226, 240, 255,
181 224, 239, 255,
182 223, 239, 255,
183 221, 238, 255,
184 220, 237, 255,
185 219, 236, 254,
186 217, 235, 254,
187 216, 235, 254,
188 214, 234, 254,
189 213, 233, 254,
190 211, 232, 253,
191 210, 231, 253,
192 208, 230, 253,
193 207, 230, 253,
194 205, 229, 253,
195 204, 228, 252,
196 202, 227, 252,
197 201, 226, 252,
198 199, 225, 251,
199 198, 224, 251,
200 196, 223, 251,
201 194, 222, 251,
202 193, 221, 250,
203 191, 220, 250,
204 190, 220, 249,
205 188, 219, 249,
206 186, 218, 249,
207 185, 217, 248,
208 183, 216, 248,
209 181, 215, 247,
210 180, 214, 247,
211 178, 213, 246,
212 176, 212, 246,
213 175, 211, 245,
214 173, 209, 245,
215 171, 208, 244,
216 169, 207, 244,
217 168, 206, 243,
218 166, 205, 243,
219 164, 204, 242,
220 162, 203, 241,
221 161, 202, 241,
222 159, 201, 240,
223 157, 200, 239,
224 155, 198, 239,
225 153, 197, 238,
226 152, 196, 237,
227 150, 195, 236,
228 148, 194, 236,
229 146, 192, 235,
230 144, 191, 234,
231 142, 190, 233,
232 140, 189, 232,
233 138, 188, 231,
234 137, 186, 230,
235 135, 185, 229,
236 133, 184, 228,
237 131, 182, 227,
238 129, 181, 226,
239 127, 180, 225,
240 125, 178, 224,
241 123, 177, 223,
242 121, 176, 222,
243 119, 174, 221,
244 117, 173, 220,
245 115, 172, 218,
246 114, 170, 217,
247 112, 169, 216,
248 110, 167, 215,
249 108, 166, 213,
250 106, 164, 212,
251 104, 163, 211,
252 102, 161, 209,
253 100, 160, 208,
254 98, 158, 206,
255 96, 157, 205,
256 94, 155, 203,
257 92, 154, 202,
258 91, 152, 200,
259 89, 151, 198,
260 87, 149, 197,
261 85, 147, 195,
262 83, 146, 193,
263 81, 144, 191,
264 80, 142, 190,
265 78, 141, 188,
266 76, 139, 186,
267 74, 137, 184,
268 72, 136, 182,
269 71, 134, 180,
270 69, 132, 178,
271 67, 130, 176,
272 65, 129, 174,
273 64, 127, 172,
274 62, 125, 170,
275 60, 123, 168,
276 59, 121, 165,
277 57, 119, 163,
278 55, 118, 161,
279 54, 116, 159,
280 52, 114, 156,
281 50, 112, 154,
282 49, 110, 152,
283 47, 108, 149,
284 45, 106, 147,
285 44, 104, 145,
286 42, 102, 142,
287 41, 100, 140,
288 39, 98, 137,
289 37, 96, 135,
290 36, 94, 132,
291 34, 92, 129,
292 33, 90, 127,
293 31, 88, 124,
294 30, 86, 122,
295 28, 84, 119,
296 27, 82, 116,
297 25, 80, 113,
298 24, 77, 111,
299 22, 75, 108,
300 21, 73, 105,
301 20, 71, 102,
302 18, 69, 99,
303 17, 67, 97,
304 15, 65, 94,
305 14, 62, 91,
306 13, 60, 88,
307 11, 58, 85,
308 10, 56, 82,
309 9, 53, 79,
310 8, 51, 76,
311 7, 49, 73,
312 6, 47, 70,
313 5, 44, 67
314 };
315
316 void png_vis(const std::string& name, int w, int h, const double* data,
317         bool is_based_around_1, double maxval)
318 {
319     QImage img(w, h, QImage::Format_RGB32);
320     if (is_based_around_1)
321         maxval -= 1;
322     for (int y = 0; y < h; y++) {
323         QRgb* scanline = reinterpret_cast<QRgb*>(img.scanLine(y));
324         for (int x = 0; x < w; x++) {
325             double v = data[y * w + x];
326             if (std::isfinite(v)) {
327                 int direction = +1;
328                 if (is_based_around_1) {
329                     if (v < 1) {
330                         v = 1 / v;
331                         direction = -1;
332                     }
333                     v -= 1;
334                 }
335                 v /= maxval;
336                 v = std::min(std::max(v, 0.0), 1.0);
337                 if (is_based_around_1)
338                     v = 0.5 + direction * v / 2;
339                 //scanline[x] = QColor::fromHslF((0 + v * 240) / 360, 1.0f, 0.5f).rgb(); // jet color: never use!
340                 int colormap_index = std::round((1.0 - v) * (colormap_colors - 1) + 0.4999);
341                 scanline[x] = QColor(colormap[3 * colormap_index],
342                                      colormap[3 * colormap_index + 1],
343                                      colormap[3 * colormap_index + 2]).rgb();
344             } else {
345                 scanline[x] = QColor(255, 255, 255).rgb();
346             }
347         }
348     }
349     img.save((name + ".png").c_str(), "png", 0);
350 }