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 }