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 }