code wiki / _hdl_build / nx_viz_color.nx
nx_viz_color.nx source
↩ module page · 36 lines · 1691 B
1// nx_viz_color.nx -- the COLOR-SPACE layer of the sovereign Nishi viz library (the d3-color/d3-scale-chromatic
2// core, bits-up). HSL -> RGB conversion (pure integer, permil arithmetic) + an evenly-spaced categorical palette.
3// Enables real sequential/categorical color ramps instead of hardcoded fills. Closes color-space. license_tier: ORIGINAL
4import "nx_syscalls.nx"
5const K_MAGIC_2000: i64 = 2000
6
7// HSL -> packed 0xRRGGBB. h in [0,360), s & l in permil [0,1000]. Standard chroma/segment algorithm, all integer.
8func vc_hsl_rgb(h: i64, s: i64, l: i64) -> i64 {
9 var a: i64 = 2 * l - 1000; if a < 0 { a = 0 - a }
10 let c: i64 = ((1000 - a) * s) / 1000
11 let hp: i64 = h % 360
12 let seg: i64 = hp / 60
13 let hp1000: i64 = (hp * 1000) / 60
14 let mod2: i64 = hp1000 % K_MAGIC_2000
15 var tri: i64 = mod2 - 1000; if tri < 0 { tri = 0 - tri }
16 let x: i64 = (c * (1000 - tri)) / 1000
17 let m: i64 = l - c / 2
18 var r1: i64 = 0; var g1: i64 = 0; var b1: i64 = 0
19 if seg == 0 { r1 = c; g1 = x; b1 = 0 }
20 if seg == 1 { r1 = x; g1 = c; b1 = 0 }
21 if seg == 2 { r1 = 0; g1 = c; b1 = x }
22 if seg == 3 { r1 = 0; g1 = x; b1 = c }
23 if seg == 4 { r1 = x; g1 = 0; b1 = c }
24 if seg == 5 { r1 = c; g1 = 0; b1 = x }
25 let rr: i64 = ((r1 + m) * 255) / 1000
26 let gg: i64 = ((g1 + m) * 255) / 1000
27 let bb: i64 = ((b1 + m) * 255) / 1000
28 return (rr << 16) | (gg << 8) | bb
29}
30// i-th of n evenly-spaced categorical colors (distinct hues, fixed saturation/lightness). (d3.schemeCategory)
31func vc_categorical(i: i64, n: i64) -> i64 {
32 if n <= 0 { return 0 }
33 let h: i64 = (i * 360) / n
34 return vc_hsl_rgb(h, 650, 550)
35}
36func main() -> i64 { return 0 }