code wiki / _hdl_build / nx_viz_scale.nx
nx_viz_scale.nx source
↩ module page · 42 lines · 2227 B
1// nx_viz_scale.nx -- the SCALES layer of the sovereign Nishi viz library (the d3-scale equivalent, bits-up).
2// Scales map abstract data -> visual position/size/color: the basis of EVERY chart. Fixed-point i64 (callers
3// scale up for fractions; permil = parts-per-1000 where d3 uses 0..1). Sovereign, no d3.js. First layer of the
4// measured-exceed build (closes scale-linear / scale-ordinal / scale-color in viz_capability_target.tsv).
5// license_tier: ORIGINAL
6import "nx_syscalls.nx"
7
8// LINEAR scale: map v from domain [d0,d1] to range [r0,r1] (d3.scaleLinear).
9func vs_linear(d0: i64, d1: i64, r0: i64, r1: i64, v: i64) -> i64 {
10 if d1 == d0 { return r0 }
11 return r0 + ((v - d0) * (r1 - r0)) / (d1 - d0)
12}
13// BAND scale: n categories laid out over [r0,r1] with inner padding (permil). band(idx) start position (d3.scaleBand).
14func vs_band_pos(n: i64, idx: i64, r0: i64, r1: i64, pad_permil: i64) -> i64 {
15 if n <= 0 { return r0 }
16 let step: i64 = (r1 - r0) / n
17 let pad: i64 = (step * pad_permil) / 1000
18 return r0 + idx * step + pad / 2
19}
20func vs_band_width(n: i64, r0: i64, r1: i64, pad_permil: i64) -> i64 {
21 if n <= 0 { return 0 }
22 let step: i64 = (r1 - r0) / n
23 return step - (step * pad_permil) / 1000
24}
25// SEQUENTIAL COLOR scale: interpolate packed 0xRRGGBB from c0 to c1 at t (permil) (d3.scaleSequential + interpolate).
26func vs_color_lerp(c0: i64, c1: i64, t_permil: i64) -> i64 {
27 let r0: i64 = (c0 >> 16) & 0xff; let g0: i64 = (c0 >> 8) & 0xff; let b0: i64 = c0 & 0xff
28 let r1: i64 = (c1 >> 16) & 0xff; let g1: i64 = (c1 >> 8) & 0xff; let b1: i64 = c1 & 0xff
29 let r: i64 = r0 + ((r1 - r0) * t_permil) / 1000
30 let g: i64 = g0 + ((g1 - g0) * t_permil) / 1000
31 let b: i64 = b0 + ((b1 - b0) * t_permil) / 1000
32 return (r << 16) | (g << 8) | b
33}
34// LINEAR TICKS: count evenly-spaced tick values across [d0,d1] -> ticks_out (d3.ticks, for axes).
35func vs_ticks(d0: i64, d1: i64, count: i64, ticks_out: *i64) -> i64 {
36 if count <= 1 { ticks_out[0] = d0; return 1 }
37 var i: i64 = 0
38 while i < count { ticks_out[i] = d0 + ((d1 - d0) * i) / (count - 1); i = i + 1 }
39 return count
40}
41// compile smoke; real KAT in nx_viz_scale_gate.
42func main() -> i64 { return 0 }