code wiki / _hdl_build / nx_wrap_gate.nx
nx_wrap_gate.nx source
↩ module page · 115 lines · 5266 B
1// nx_wrap_gate.nx -- VERDICT gate for inline TEXT WRAPPING (the Wikipedia overflow fix). Renders a long
2// paragraph inside a NARROW 160px column and asserts the text WRAPS to multiple lines AND does NOT spill
3// off the right edge -- the exact failure before the fix (one overflowing line). Counts distinct 10px ink
4// bands (multi-line) + black pixels far to the right (overflow). LIAR-KILL: a never-used color is absent.
5// 100% sovereign. license_tier: ORIGINAL
6import "nx_syscalls.nx"
7import "nx_render_html.nx"
8
9func g_w(s: *u8) -> i64 { var k: i64=0; while s[k]!=(0 as u8){k=k+1} sys_write(1,s,k); return 0 }
10func pn(v0: i64) -> i64 { var v: i64=v0; if v<0 { let m: *u8=sys_mmap(8); m[0]=45 as u8; sys_write(1,m,1); v=0-v } let b: *u8=sys_mmap(24); var k: i64=0; if v==0 {b[0]=48;k=1} while v>0 {b[k]=(48+(v%10)) as u8; v=v/10; k=k+1} let o: *u8=sys_mmap(24); var j: i64=0; while j<k {o[j]=b[k-1-j];j=j+1} sys_write(1,o,k); return 0 }
11func u32le(d: *u8, p: i64) -> i64 { return (d[p]&0xff) + ((d[p+1]&0xff)<<8) + ((d[p+2]&0xff)<<16) + ((d[p+3]&0xff)<<24) }
12// count distinct 10px y-bands that contain at least one black (0,0,0) pixel
13func ink_bands(data: *u8, off: i64, w: i64, h: i64) -> i64 {
14 let row3: i64 = w*3
15 let pad: i64 = (4-(row3%4))%4
16 let rowstride: i64 = row3+pad
17 var bands: i64 = 0
18 var by: i64 = 0
19 while by < h {
20 var yend: i64 = by + 10
21 if yend > h { yend = h }
22 var has: i64 = 0
23 var yy: i64 = by
24 while yy < yend {
25 if has == 0 {
26 var x: i64 = 0
27 let rb: i64 = off + yy*rowstride
28 while x < w {
29 let p: i64 = rb + x*3
30 if (data[p]&0xff)==0 { if (data[p+1]&0xff)==0 { if (data[p+2]&0xff)==0 { has=1; x=w } } }
31 x = x+1
32 }
33 }
34 yy = yy+1
35 }
36 if has==1 { bands = bands+1 }
37 by = by + 10
38 }
39 return bands
40}
41// count black pixels with x >= xmin (the overflow region to the right of the narrow column)
42func black_right(data: *u8, off: i64, w: i64, h: i64, xmin: i64) -> i64 {
43 let row3: i64 = w*3
44 let pad: i64 = (4-(row3%4))%4
45 let rowstride: i64 = row3+pad
46 var n: i64 = 0
47 var y: i64 = 0
48 while y < h {
49 var x: i64 = xmin
50 let rb: i64 = off + y*rowstride
51 while x < w {
52 let p: i64 = rb + x*3
53 if (data[p]&0xff)==0 { if (data[p+1]&0xff)==0 { if (data[p+2]&0xff)==0 { n=n+1 } } }
54 x = x+1
55 }
56 y = y+1
57 }
58 return n
59}
60func green_any(data: *u8, off: i64, w: i64, h: i64) -> i64 {
61 let row3: i64 = w*3
62 let pad: i64 = (4-(row3%4))%4
63 let rowstride: i64 = row3+pad
64 var y: i64 = 0
65 while y < h {
66 var x: i64 = 0
67 let rb: i64 = off + y*rowstride
68 while x < w {
69 let p: i64 = rb + x*3
70 if (data[p]&0xff)==0 { if (data[p+1]&0xff)==255 { if (data[p+2]&0xff)==0 { return 1 } } }
71 x = x+1
72 }
73 y = y+1
74 }
75 return 0
76}
77func chk(cond: i64, label: *u8, pass: *i64) -> i64 {
78 g_w(" " as *u8); g_w(label); g_w(": " as *u8)
79 if cond==1 { g_w("OK\n" as *u8); pass[0]=pass[0]+1 } else { g_w("FAIL\n" as *u8) }
80 return cond
81}
82
83func main() -> i64 {
84 let pass: *i64 = sys_mmap(8) as *i64; pass[0]=0
85 g_w("=== WRAP GATE (inline text wraps to box width, sovereign nx_cc->nxasm) ===\n" as *u8)
86
87 // long paragraph in a NARROW 160px column -> must wrap to several lines, not overflow off the right.
88 let html: *u8 = "<body><div class=\"col\"><style>.col{width:160px}</style>This is a fairly long paragraph of text that must wrap across several lines inside a narrow column instead of overflowing off the right edge of its box.</div></body>\x00" as *u8
89 var hlen: i64 = 0
90 while html[hlen]!=(0 as u8) { hlen=hlen+1 }
91 let nb: i64 = nx_render_html_to_bmp(html, hlen, "knowledge/status/wrap_gate.bmp\x00" as *u8)
92 nx_render_html_to_png(html, hlen, "knowledge/status/wrap_gate.png\x00" as *u8)
93
94 let lp: *i64 = sys_mmap(8) as *i64
95 let bmp: *u8 = sys_read_file("knowledge/status/wrap_gate.bmp\x00" as *u8, lp)
96 let blen: i64 = lp[0]
97 chk((blen >= 54) as i64, "bmp file >= 54 bytes\x00" as *u8, pass)
98 if blen < 54 { g_w("WRAP rows=5 pass=" as *u8); pn(pass[0]); g_w(" verdict=RED (no image)\n" as *u8); sys_exit(1); return 1 }
99 let off: i64 = u32le(bmp, 10)
100 let w: i64 = u32le(bmp, 18)
101 let h: i64 = u32le(bmp, 22)
102 chk((w == 800) as i64, "width == 800\x00" as *u8, pass)
103
104 let bands: i64 = ink_bands(bmp, off, w, h)
105 let ovf: i64 = black_right(bmp, off, w, h, 300)
106 g_w(" measured: ink_bands=" as *u8); pn(bands); g_w(" overflow_black(x>=300)=" as *u8); pn(ovf); g_w(" height=" as *u8); pn(h); g_w("\n" as *u8)
107
108 chk((bands >= 3) as i64, "text WRAPPED to multiple lines (ink bands >= 3)\x00" as *u8, pass)
109 chk((ovf == 0) as i64, "NO horizontal overflow (no black ink at x>=300)\x00" as *u8, pass)
110 chk((green_any(bmp, off, w, h) == 0) as i64, "LIAR-KILL: green #00ff00 absent\x00" as *u8, pass)
111
112 g_w("WRAP rows=5 pass=" as *u8); pn(pass[0])
113 if pass[0]==5 { g_w(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
114 g_w(" verdict=RED\n" as *u8); sys_exit(1); return 1
115}