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