izzi
SVG SUBSET C++ API
Loading...
Searching...
No Matches
a60-svg-color-palette.h
Go to the documentation of this file.
1// svg custom palette-*- mode: C++ -*-
2
3// alpha60
4// bittorrent x scrape x data + analytics
5
6// Copyright (c) 2024-2025, Benjamin De Kosnik <b.dekosnik@gmail.com>
7
8// This file is part of the alpha60 library. This library is free
9// software; you can redistribute it and/or modify it under the terms
10// of the GNU General Public License as published by the Free Software
11// Foundation; either version 3, or (at your option) any later
12// version.
13
14// This library is distributed in the hope that it will be useful, but
15// WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17// General Public License for more details.
18
19#ifndef MiL_SVG_COLOR_PALETTE_H
20#define MiL_SVG_COLOR_PALETTE_H 1
21
22//#include "a60-svg-color.h"
23
24
25namespace svg {
26
27/// Palette, finite set of colors used. Must end with color::none.
28template<typename T, std::size_t N>
29using palette = std::array<T, N>;
30
31template<std::size_t N>
33
34template<std::size_t N>
36
37/// Default colors for izzi.
39{
40 // black to white in 10%, 25%, 33% increments
48
50
51 // yellow
56
57 // orange
61
62 // red
69
70 // brown
74
75 // green
82
83 // blue
94
95 // purple (magenta, violet, pink)
105
107};
108
109/// Only color no black and white or gray
111{
112 // yellow
117
118 // orange
122
123 // red
130
131 // brown
135
136 // green
143
144 // blue
155
156 // purple (magenta, violet, pink)
166
168};
169
170/// Japan colors (118)
171/// https://en.wikipedia.org/wiki/Traditional_colors_of_Japan
173{
174 color_qi(240,143,144), color_qi(219,90,107), color_qi(252,201,185),
175 color_qi(242,102,108), color_qi(245,143,132), color_qi(185,87,84),
176 color_qi(157,41,51), color_qi(247,102,90), color_qi(151,100,90),
177 color_qi(195,39,43), color_qi(103,36,34), color_qi(94,40,36),
178 color_qi(250,123,98), color_qi(220,48,35), color_qi(147,67,55),
179 color_qi(145,50,40), color_qi(53,30,28), color_qi(211,78,54),
180 color_qi(161,61,45), color_qi(117,46,35), color_qi(255,121,82),
181 color_qi(230,131,100), color_qi(227,92,56), color_qi(179,92,68),
182 color_qi(155,83,63), color_qi(96,40,30), color_qi(76,34,27),
183 color_qi(255,53,0), color_qi(159,116,98), color_qi(89,43,31),
184 color_qi(245,127,79), color_qi(159,82,51), color_qi(152,85,56),
185 color_qi(255,162,107), color_qi(255,137,54), color_qi(251,129,54),
186 color_qi(46,33,27), color_qi(202,105,36), color_qi(213,120,53),
187 color_qi(169,98,50), color_qi(140,89,57), color_qi(89,58,39),
188 color_qi(190,127,81), color_qi(183,112,45), color_qi(219,132,73),
189 color_qi(247,187,125), color_qi(255,166,49), color_qi(203,126,31),
190 color_qi(120,94,73), color_qi(250,169,69), color_qi(187,129,65),
191 color_qi(255,185,78), color_qi(230,155,58), color_qi(176,146,122),
192 color_qi(127,107,93), color_qi(102,83,67), color_qi(161,121,23),
193 color_qi(92,72,39), color_qi(226,177,60), color_qi(211,177,125),
194 color_qi(149,123,56), color_qi(100,85,48), color_qi(189,169,40),
195 color_qi(156,138,77), color_qi(71,63,45), color_qi(82,75,42),
196 color_qi(133,124,85), color_qi(122,148,46), color_qi(188,181,140),
197 color_qi(140,158,94), color_qi(82,89,59), color_qi(140,156,118),
198 color_qi(129,123,105), color_qi(55,66,49), color_qi(165,186,147),
199 color_qi(64,122,82), color_qi(61,64,53), color_qi(101,98,85),
200 color_qi(45,68,54), color_qi(90,100,87), color_qi(129,156,139),
201 color_qi(58,64,59), color_qi(53,78,75), color_qi(117,125,117),
202 color_qi(43,55,54), color_qi(106,127,122), color_qi(72,146,155),
203 color_qi(69,88,89), color_qi(38,67,72), color_qi(29,105,124),
204 color_qi(77,100,108), color_qi(52,77,86), color_qi(77,143,172),
205 color_qi(93,140,174), color_qi(24,27,38), color_qi(0,49,113),
206 color_qi(120,119,155), color_qi(118,105,128), color_qi(137,114,158),
207 color_qi(135,95,154), color_qi(151,110,154), color_qi(43,32,40),
208 color_qi(168,124,160), color_qi(91,50,86), color_qi(35,25,30),
209 color_qi(187,119,150), color_qi(117,93,91), color_qi(109,43,80),
210 color_qi(164,52,93), color_qi(67,36,42), color_qi(126,38,57),
211 color_qi(68,49,46), color_qi(255,221,202), color_qi(151,134,124),
212 color_qi(75,60,57), color_qi(53,41,37), color_qi(23,20,18),
214};
215
216
217/// ColorBrewer 2.0
218/// https://colorbrewer2.org
219
220/// Single hue 3-class sequential, low to high
222{
223 /// red
224 color_qi(254,224,210), color_qi(252,146,114), color_qi(222,45,38),
225
226 /// orange
227 color_qi(254,230,206), color_qi(253,174,107), color_qi(230,85,13),
228
229 /// green
230 color_qi(229,245,224), color_qi(161,217,155), color_qi(49,163,84),
231
232 /// blue
233 color_qi(222,235,247), color_qi(158,202,225), color_qi(49,130,189),
234
235 /// purple
236 color_qi(239,237,245), color_qi(188,189,220), color_qi(117,107,177),
237
238 /// gray
239 color_qi(240,240,240), color_qi(189,189,189), color_qi(99,99,99),
241};
242
243/// Single hue 9-class sequential, low to high
245{
246 /// reds
247 color_qi(255,245,240), color_qi(254,224,210), color_qi(252,187,161),
248 color_qi(252,146,114), color_qi(251,106,74), color_qi(239,59,44),
249 color_qi(203,24,29), color_qi(165,15,21), color_qi(103,0,13),
250
251 /// orange
252 color_qi(255,245,235), color_qi(254,230,206), color_qi(253,208,162),
253 color_qi(253,174,107), color_qi(253,141,60), color_qi(241,105,19),
254 color_qi(217,72,1), color_qi(166,54,3), color_qi(127,39,4),
255
256 /// green
257 color_qi(247,252,245), color_qi(229,245,224), color_qi(199,233,192),
258 color_qi(161,217,155), color_qi(116,217,155), color_qi(65,171,93),
259 color_qi(35,139,69), color_qi(0,109,44), color_qi(0,68,27),
260
261 /// blue
262 color_qi(247,251,255), color_qi(222,235,247), color_qi(198,219,239),
263 color_qi(158,202,225), color_qi(107,174,214), color_qi(66,146,198),
264 color_qi(33,113,181), color_qi(8,81,156), color_qi(8,48,107),
265
266 /// purple
267 color_qi(252,251,253), color_qi(239,237,245), color_qi(218,218,235),
268 color_qi(188,189,220), color_qi(158,154,200), color_qi(128,125,186),
269 color_qi(106,81,163), color_qi(84,39,143), color_qi(63,0,125),
270
271 /// gray
272 color_qi(255,255,255), color_qi(240,240,240), color_qi(217,217,217),
273 color_qi(189,189,189), color_qi(150,150,150), color_qi(115,115,115),
274 color_qi(82,82,82), color_qi(37,37,37), color_qi(0,0,0),
275
277};
278
279/// Single hue 7-class sequential, low to high
281{
282 /// orange
283 color_qi(254,237,222), color_qi(253,208,162), color_qi(253,174,107),
284 color_qi(253,141,60), color_qi(241,105,19), color_qi(217,72,1),
285 color_qi(140,45,4),
286
287 /// reds
288 color_qi(254,229,217), color_qi(252,187,161), color_qi(252,146,114),
289 color_qi(251,106,74), color_qi(239,59,44), color_qi(203,24,29),
290 color_qi(153,0,13),
291
292 /// purple
293 color_qi(242,240,247), color_qi(218,218,235), color_qi(188,189,220),
294 color_qi(158,154,200), color_qi(128,125,186), color_qi(106,81,163),
295 color_qi(74,20,134),
296
297 /// blue
298 color_qi(239,243,255), color_qi(198,219,239), color_qi(158,202,225),
299 color_qi(107,174,214), color_qi(66,146,198), color_qi(33,113,181),
300 color_qi(8,69,148),
301
302 /// green
303 color_qi(237,248,233), color_qi(199,233,192), color_qi(161,217,155),
304 color_qi(116,196,118), color_qi(65,171,93), color_qi(35,139,69),
305 color_qi(0,90,50),
306
307 /// gray
308 color_qi(247,247,247), color_qi(217,217,217), color_qi(189,189,189),
309 color_qi(150,150,150), color_qi(115,115,115), color_qi(82,82,82),
310 color_qi(37,37,37),
311
313};
314
315
316/**
317 CIECAM02-UCS color space, perceptually different colors, equally spaced out.
318
319 Hand-picked values for a 67-68 BTIHA, aka cyberwar.
320 Start with color constraints, generate 264 options, hand-pick to n=68.
321 http://jnnnnn.github.io/category-colors-constrained.html
322*/
324{
325 // SE, red to orange/yellow (18)
326 color_qi(251,225,217), color_qi(254,231,192), color_qi(253,196,189),
327 color_qi(212,130,149), color_qi(253,225,137), color_qi(252,205,149),
328 color_qi(217,167,66), color_qi(254,205,15), color_qi(246,166,2),
329 color_qi(205,129,38), color_qi(233,112,10), color_qi(208,73,7),
330 color_qi(253,65,9), color_qi(243,28,78), color_qi(201,8,10),
331 color_qi(202,105,73), color_qi(242,92,88), color_qi(175,77,68),
332 /*
333 color_qi(253,176,130), color_qi(253,162,71), color_qi(246,131,146),
334 color_qi(254,103,148), color_qi(250,45,142), color_qi(213,9,126),
335 */
336
337 // SW, yellow, chartreuse, green, aquamarine (18)
338 color_qi(204,246,233), color_qi(155,254,227), color_qi(253,233,69),
339 color_qi(214,222,15), color_qi(211,254,20), color_qi(158,247,24),
340 color_qi(10,216,17), color_qi(10,235,101), color_qi(27,232,149),
341 color_qi(46,246,197), color_qi(224,248,106), color_qi(183,255,128),
342 color_qi(97,189,41), color_qi(163,238,148), color_qi(207,229,137),
343 color_qi(129,255,173), color_qi(158,227,189), color_qi(206,248,196),
344
345 // NE lavender to red violet (18)
346 color_qi(91,90,208), color_qi(125,91,240), color_qi(167,26,253),
347 color_qi(181,157,251), color_qi(214,202,254), color_qi(178,86,249),
348 color_qi(214,148,253), color_qi(188,121,216), color_qi(159,32,195),
349 color_qi(245,17,253), color_qi(251,80,225), color_qi(206,98,203),
350 color_qi(252,18,201), color_qi(235,125,171), color_qi(252,184,211),
351 color_qi(255,226,241), color_qi(254,199,248), color_qi(221,177,238),
352
353 // NW sky blue to indigo (18)
354 color_qi(11,240,233), color_qi(16,224,248), color_qi(152,252,255),
355 color_qi(199,236,249), color_qi(231,234,253), color_qi(187,217,253),
356 color_qi(126,216,254), color_qi(95,153,253), color_qi(57,87,255),
357 color_qi(22,130,251), color_qi(16,176,255), color_qi(48,199,253),
358 color_qi(5,169,209), color_qi(204,214,228), color_qi(100,214,203),
359 color_qi(146,166,254), color_qi(123,159,212), color_qi(105,154,179),
360
362};
363
364
365/**
366 CIECAM16-UCS color space, perceptually different colors, equally spaced out.
367
368 DeepSeek v1:
369 generate a 60 item CIECAM16 color palette with no grays, formatted
370 in RGB (r, g, b) values. Each color includes its approximate
371 CIECAM16 parameters (J, C, h) for perceptual consistency.
372
373 DeepSeek v2:
374 generate a 88-color CIECAM16 palette with fixed lightness (J=70),
375 organized into 8 hue categories (6 colors each) plus 40 high-impact
376 bonus colors. No whites/blacks/grays are included.
377
378 DeepSeek v3:
379 generate a 88-color CIECAM16 palette with fixed lightness (J=70),
380 organized into 8 hue categories (11 colors each), formatted as RGB (r,g,b). No
381 whites/blacks/grays are included.
382
383*/
384
385/// CIECAM16 61 color palette
387{
388 // 1. Reds & Pinks
389 color_qi(255, 107, 107), // J=65, C=45, h=25°
390 color_qi(255, 58, 58), // J=55, C=60, h=20°
391 color_qi(209, 0, 0), // J=45, C=70, h=15°
392 color_qi(255, 167, 167), // J=75, C=30, h=10°
393 color_qi(255, 195, 195), // J=85, C=20, h=5°
394
395 // 2. Oranges & Yellows
396 color_qi(255, 165, 0), // J=70, C=65, h=50°
397 color_qi(255, 140, 0), // J=60, C=70, h=45°
398 color_qi(255, 215, 0), // J=80, C=60, h=85°
399 color_qi(255, 238, 88), // J=90, C=50, h=90°
400 color_qi(255, 193, 7), // J=75, C=55, h=70°
401
402 // 3. Greens
403 color_qi(76, 175, 80), // J=60, C=40, h=140°
404 color_qi(46, 125, 50), // J=50, C=45, h=135°
405 color_qi(165, 214, 167), // J=80, C=25, h=145°
406 color_qi(102, 187, 106), // J=70, C=35, h=150°
407 color_qi(27, 94, 32), // J=40, C=50, h=130°
408
409 // 4. Cyans & Teals
410 color_qi(0, 188, 212), // J=65, C=50, h=210°
411 color_qi(0, 131, 143), // J=55, C=55, h=205°
412 color_qi(178, 235, 242), // J=85, C=20, h=215°
413 color_qi(77, 208, 225), // J=75, C=45, h=220°
414 color_qi(0, 96, 100), // J=45, C=60, h=200°
415
416 // 5. Blues
417 color_qi(33, 150, 243), // J=65, C=55, h=260°
418 color_qi(13, 71, 161), // J=50, C=60, h=255°
419 color_qi(144, 202, 249), // J=80, C=30, h=265°
420 color_qi(21, 101, 192), // J=60, C=50, h=250°
421 color_qi(227, 242, 253), // J=95, C=10, h=270°
422
423 // 6. Purples & Violets
424 color_qi(156, 39, 176), // J=55, C=65, h=310°
425 color_qi(123, 31, 162), // J=50, C=70, h=305°
426 color_qi(225, 190, 231), // J=85, C=25, h=315°
427 color_qi(186, 104, 200), // J=70, C=40, h=320°
428 color_qi(74, 20, 140), // J=45, C=75, h=300°
429
430 // 7. Magentas
431 color_qi(233, 30, 99), // J=60, C=60, h=350°
432 color_qi(194, 24, 91), // J=55, C=65, h=345°
433 color_qi(248, 187, 208), // J=85, C=30, h=355°
434 color_qi(240, 98, 146), // J=75, C=45, h=0°
435 color_qi(136, 14, 79), // J=45, C=70, h=340°
436
437 // 8. Earth Tones & Browns
438 color_qi(121, 85, 72), // J=50, C=20, h=30°
439 color_qi(93, 64, 55), // J=40, C=25, h=25°
440 color_qi(215, 204, 200), // J=85, C=8, h=20°
441 color_qi(188, 170, 164), // J=75, C=12, h=15°
442 color_qi(62, 39, 35), // J=25, C=30, h=10°
443
444 // 9. Extended Vibrant Hues
445 color_qi(255, 112, 67), // J=65, C=55, h=40°
446 color_qi(255, 171, 64), // J=75, C=50, h=60°
447 color_qi(141, 110, 99), // J=55, C=15, h=35°
448 color_qi(106, 27, 154), // J=50, C=65, h=290°
449 color_qi(0, 172, 193), // J=70, C=45, h=220°
450 color_qi(124, 179, 66), // J=75, C=40, h=120°
451 color_qi(253, 216, 53), // J=85, C=55, h=95°
452 color_qi(255, 82, 82), // J=70, C=50, h=15°
453 color_qi(216, 27, 96), // J=60, C=60, h=355°
454 color_qi(57, 73, 171), // J=60, C=50, h=270°
455 color_qi(0, 137, 123), // J=65, C=40, h=190°
456 color_qi(67, 160, 71), // J=70, C=35, h=130°
457 color_qi(255, 214, 0), // J=80, C=60, h=85°
458 color_qi(251, 140, 0), // J=75, C=55, h=50°
459 color_qi(94, 53, 177), // J=55, C=60, h=280°
460 color_qi(255, 77, 77), // J=65, C=55, h=10°
461 color_qi(255, 152, 0), // J=70, C=60, h=55°
462 color_qi(0, 150, 136), // J=60, C=45, h=195°
463 color_qi(198, 40, 40), // J=55, C=65, h=5°
464 color_qi(142, 36, 170), // J=50, C=70, h=295°
465
467};
468
469
470/// CIECAM16 89-color palette, 8 sections x 11 colors each, fixed brightness at j=70
471/// (8 bands x 11 samples) + none
473{
474 //1. Red (H ≈ 0°)
475 //RGB CIECAM16 (J=70, C, h≈0°)
476 color_qi(255, 179, 179), // C=20
477 color_qi(255, 158, 158), // C=23
478 color_qi(255, 135, 135), // C=26
479 color_qi(255, 109, 109), // C=29
480 color_qi(255, 79, 79), // C=32
481 color_qi(255, 43, 43), // C=35
482 color_qi(255, 0, 0), // C=38
483 color_qi(232, 0, 0), // C=41
484 color_qi(209, 0, 0), // C=44
485 color_qi(185, 0, 0), // C=47
486 color_qi(160, 0, 0), // C=50
487
488 //2. Orange (H ≈ 45°)
489 //RGB CIECAM16 (J=70, C, h≈45°)
490 color_qi(255, 208, 163), // C=20
491 color_qi(255, 196, 141), // C=23
492 color_qi(255, 183, 116), // C=26
493 color_qi(255, 168, 88), // C=29
494 color_qi(255, 151, 56), // C=32
495 color_qi(255, 131, 0), // C=35
496 color_qi(245, 124, 0), // C=38
497 color_qi(230, 115, 0), // C=41
498 color_qi(214, 106, 0), // C=44
499 color_qi(196, 95, 0), // C=47
500 color_qi(176, 84, 0), // C=50
501
502 //3. Yellow (H ≈ 90°)
503 //RGB CIECAM16 (J=70, C, h≈90°)
504 color_qi(245, 245, 163), // C=20
505 color_qi(240, 240, 141), // C=23
506 color_qi(235, 235, 116), // C=26
507 color_qi(230, 230, 88), // C=29
508 color_qi(224, 224, 56), // C=32
509 color_qi(217, 217, 0), // C=35
510 color_qi(212, 212, 0), // C=38
511 color_qi(201, 201, 0), // C=41
512 color_qi(189, 189, 0), // C=44
513 color_qi(176, 176, 0), // C=47
514 color_qi(163, 163, 0), // C=50
515
516 //4. Green (H ≈ 135°)
517 //RGB CIECAM16 (J=70, C, h≈135°)
518 color_qi(194, 224, 163), // C=20
519 color_qi(181, 219, 141), // C=23
520 color_qi(166, 213, 116), // C=26
521 color_qi(148, 207, 88), // C=29
522 color_qi(127, 200, 56), // C=32
523 color_qi(102, 192, 0), // C=35
524 color_qi(76, 179, 0), // C=38
525 color_qi(47, 163, 0), // C=41
526 color_qi(0, 144, 0), // C=44
527 color_qi(0, 122, 0), // C=47
528 color_qi(0, 96, 0), // C=50
529
530 //5. Cyan (H ≈ 180°)
531 //RGB CIECAM16 (J=70, C, h≈180°)
532 color_qi(163, 224, 224), // C=20
533 color_qi(141, 219, 219), // C=23
534 color_qi(116, 213, 213), // C=26
535 color_qi(88, 207, 207), // C=29
536 color_qi(56, 200, 200), // C=32
537 color_qi(0, 192, 192), // C=35
538 color_qi(0, 179, 179), // C=38
539 color_qi(0, 163, 163), // C=41
540 color_qi(0, 144, 144), // C=44
541 color_qi(0, 122, 122), // C=47
542 color_qi(0, 96, 96), // C=50
543
544 //6. Blue (H ≈ 225°)
545 //RGB CIECAM16 (J=70, C, h≈225°)
546 color_qi(163, 194, 245), // C=20
547 color_qi(141, 181, 240), // C=23
548 color_qi(116, 166, 235), // C=26
549 color_qi(88, 148, 230), // C=29
550 color_qi(56, 127, 224), // C=32
551 color_qi(0, 102, 217), // C=35
552 color_qi(0, 85, 199), // C=38
553 color_qi(0, 71, 181), // C=41
554 color_qi(0, 57, 163), // C=44
555 color_qi(0, 43, 144), // C=47
556 color_qi(0, 29, 122), // C=50
557
558 //7. Purple (H ≈ 270°)
559 //RGB CIECAM16 (J=70, C, h≈270°)
560 color_qi(208, 163, 255), // C=20
561 color_qi(196, 141, 255), // C=23
562 color_qi(183, 116, 255), // C=26
563 color_qi(168, 88, 255), // C=29
564 color_qi(151, 56, 255), // C=32
565 color_qi(131, 0, 255), // C=35
566 color_qi(124, 0, 245), // C=38
567 color_qi(115, 0, 230), // C=41
568 color_qi(106, 0, 214), // C=44
569 color_qi(95, 0, 196), // C=47
570 color_qi(84, 0, 176), // C=50
571
572 //8. Magenta (H ≈ 315°)
573 //RGB CIECAM16 (J=70, C, h≈315°)
574 color_qi(255, 163, 224), // C=20
575 color_qi(255, 141, 219), // C=23
576 color_qi(255, 116, 213), // C=26
577 color_qi(255, 88, 207), // C=29
578 color_qi(255, 56, 200), // C=32
579 color_qi(255, 0, 192), // C=35
580 color_qi(245, 0, 184), // C=38
581 color_qi(230, 0, 173), // C=41
582 color_qi(214, 0, 161), // C=44
583 color_qi(196, 0, 147), // C=47
584 color_qi(176, 0, 131), // C=50
585
587};
588
589/// ESRI Bathymetry Tints Small
590/// https://www.esri.com/arcgis-blog/products/mapping/mapping/esri-ocean-basemap-color-style-available-for-download
592{
593 color_qi(41, 97, 156),
594 color_qi(89, 148, 204),
595 color_qi(115, 116, 224),
596 color_qi(133, 179, 235),
597 color_qi(148, 194, 247),
598 color_qi(166, 206, 245),
599 color_qi(186, 222, 255),
601};
602
603/// ESRI Bathymetry Tints Medium
605{
606 color_qi(56, 91, 140),
607 color_qi(43, 102, 166),
608 color_qi(66, 124, 179),
609 color_qi(82, 143, 204),
610 color_qi(98, 159, 217),
611 color_qi(134, 179, 235),
612 color_qi(149, 188, 230),
613 color_qi(170, 207, 242),
614 color_qi(181, 215, 247),
615 color_qi(191, 224, 255),
616 color_qi(209, 233, 255),
618};
619
620
621/// Oklab
622/// https://bottosson.github.io/posts/oklab/
623
624/// Set and Get working spectrum, aka default palette.
625/// NB: If colorbands are being used, palette has to be izzi or
626/// izzi_hue, and cannot be sorted color_qi as color bands use colors arranged
627/// in a fixed order with offsets in hue.
628auto&
629active_spectrum(const bool sortbyhuep = false)
630{
631 //static auto spectrum = izzi_palette;
632 static auto spectrum = izzi_hue_palette;
633 //static auto spectrum = jp_palette;
634 //static auto spectrum = ciecam02_palette;
635 //static auto spectrum = ciecam16_palette;
636 //static auto spectrum = ciecam16j70_palette;
637 //static auto spectrum = colorbrewer2s3s_palette;
638 //static auto spectrum = colorbrewer2s9s_palette;
639
640 static bool initp(false);
641 if (sortbyhuep && !initp)
642 {
643 std::sort(spectrum.begin(), spectrum.end(), svg::color_qf_lt);
644 std::reverse(spectrum.begin(), spectrum.end());
645 initp = true;
646 }
647 return spectrum;
648}
649
650
651/// Random entry from array above.
652color_qi
653random_color(const uint startoffset = 0)
654{
655 auto& spectrum = active_spectrum();
656 const uint maxc = spectrum.size();
657 static std::mt19937_64 rg(std::random_device{}());
658 auto disti = std::uniform_int_distribution<>(startoffset, maxc - 1);
659 uint index = disti(rg);
660 return spectrum[index];
661}
662
663template<typename _Spectrm>
664color_qi
665random_color(const _Spectrm& spectrm, const uint startoffset = 0)
666{
667 const uint maxc = spectrm.size();
668 static std::mt19937_64 rg(std::random_device{}());
669 auto disti = std::uniform_int_distribution<>(startoffset, maxc - 1);
670 uint index = disti(rg);
671 return spectrm[index];
672}
673
674/// Loop through color array starting at position c.
675/// Iff klr is not found, return color::none as the next color.
676color_qi
678{
679 auto& spectrum = active_spectrum();
680 color_qi cnext = color::none;
681 auto itr = std::find(spectrum.begin(), spectrum.end(), klr);
682 if (itr != spectrum.end())
683 {
684 ++itr;
685 if (itr == spectrum.end())
686 itr = spectrum.begin();
687 cnext = *itr;
688 }
689 return cnext;
690}
691
692/// Start at specified color bar entry point.
693color_qi
695{
696 static color_qi _S_klr = klr;
697 color_qi retk = _S_klr;
698 _S_klr = next_color(_S_klr);
699 return retk;
700}
701
702} // namespace svg
703
704#endif
constexpr uint color_max_size
Total number of enumerated colors.
static const palette_qi< color_max_size - 25 > izzi_hue_palette
Only color no black and white or gray.
palette< color_qi, N > palette_qi
static const palette_qi< 8 > esri_s_bathymetry_palette
ESRI Bathymetry Tints Small https://www.esri.com/arcgis-blog/products/mapping/mapping/esri-ocean-base...
static const palette_qi< 118 > jp_palette
Japan colors (118) https://en.wikipedia.org/wiki/Traditional_colors_of_Japan.
static const palette_qi< 61 > ciecam16_palette
CIECAM16 61 color palette.
static const palette_qi< 12 > esri_m_bathymetry_palette
ESRI Bathymetry Tints Medium.
palette< color_qf, N > palette_qf
static const palette_qi< 73 > ciecam02_palette
color_qi next_color(const color_qi klr)
Loop through color array starting at position c. Iff klr is not found, return color::none as the next...
static const palette_qi< 43 > colorbrewer2s7s_palette
Single hue 7-class sequential, low to high.
auto & active_spectrum(const bool sortbyhuep=false)
Oklab https://bottosson.github.io/posts/oklab/.
static const palette_qi< 55 > colorbrewer2s9s_palette
Single hue 9-class sequential, low to high.
color_qi random_color(const uint startoffset=0)
Random entry from array above.
static const palette_qi< color_max_size - 4 > izzi_palette
Default colors for izzi.
static const palette_qi< 89 > ciecam16j70_palette
CIECAM16 89-color palette, 8 sections x 11 colors each, fixed brightness at j=70 (8 bands x 11 sample...
color_qi start_at_color(const color_qi klr)
Start at specified color bar entry point.
bool color_qf_lt(const color_qf &k1, const color_qf &k2)
Forwarding function.
unsigned int uint
Definition a60-svg.h:58
std::array< T, N > palette
Palette, finite set of colors used. Must end with color::none.
static const palette_qi< 19 > colorbrewer2s3s_palette
ColorBrewer 2.0 https://colorbrewer2.org.
Color quantified as integral RGB components in the range [0,255]. aka like Scalar in OpenCV.