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}