code wiki / _hdl_build / nx_render_page_probe.nx
nx_render_page_probe.nx source
↩ module page · 89 lines · 4910 B
1// nx_render_page_probe.nx -- MEASURE-FIRST probe for the full render pipeline (paint + PNG/BMP encode).
2// The float gate proved LAYOUT geometry; this measures the PAINT/ENCODE back half: render a realistic
3// mini-article (h1/h2 bars, float:right infobox, link color, ul bullets, flex table) to BMP+PNG, read the
4// BMP back, and REPORT actual dimensions + non-white pixel count + which UA-sheet colors are present. So
5// the asserting gate that follows can use VERIFIED expectations, not guessed ones. 100% sovereign.
6import "nx_syscalls.nx"
7import "nx_render_html.nx"
8
9func p_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 p_n(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
13// scan the BMP pixel block for an exact (R,G,B); 1 if any pixel matches. BMP rows are BGR, bottom-up.
14func color_present(data: *u8, off: i64, w: i64, h: i64, R: i64, G: i64, B: i64) -> i64 {
15 let row3: i64 = w*3
16 let pad: i64 = (4-(row3%4))%4
17 let rowstride: i64 = row3+pad
18 var y: i64 = 0
19 while y < h {
20 var x: i64 = 0
21 let rowbase: i64 = off + y*rowstride
22 while x < w {
23 let p: i64 = rowbase + x*3
24 if (data[p]&0xff)==B { if (data[p+1]&0xff)==G { if (data[p+2]&0xff)==R { return 1 } } }
25 x = x+1
26 }
27 y = y+1
28 }
29 return 0
30}
31func count_nonwhite(data: *u8, off: i64, w: i64, h: i64) -> i64 {
32 let row3: i64 = w*3
33 let pad: i64 = (4-(row3%4))%4
34 let rowstride: i64 = row3+pad
35 var n: i64 = 0
36 var y: i64 = 0
37 while y < h {
38 var x: i64 = 0
39 let rowbase: i64 = off + y*rowstride
40 while x < w {
41 let p: i64 = rowbase + x*3
42 var white: i64 = 0
43 if (data[p]&0xff)==255 { if (data[p+1]&0xff)==255 { if (data[p+2]&0xff)==255 { white=1 } } }
44 if white==0 { n=n+1 }
45 x = x+1
46 }
47 y = y+1
48 }
49 return n
50}
51func rep_color(data: *u8, off: i64, w: i64, h: i64, name: *u8, R: i64, G: i64, B: i64) -> i64 {
52 p_w(" color " as *u8); p_w(name); p_w(" (" as *u8); p_n(R); p_w("," as *u8); p_n(G); p_w("," as *u8); p_n(B); p_w("): " as *u8)
53 if color_present(data, off, w, h, R, G, B)==1 { p_w("PRESENT\n" as *u8) } else { p_w("absent\n" as *u8) }
54 return 0
55}
56
57func main() -> i64 {
58 let html: *u8 = "<body><h1>Nishi Browser</h1><div class=\"infobox\">Fact box: sovereign, bits-up.</div><p>A from-scratch renderer. See <a href=\"/about\">about</a> for more.</p><h2>Features</h2><ul><li>HTML tokenizer</li><li>CSS cascade</li><li>Float and flex layout</li></ul><table><tr><td>Phase</td><td>Status</td></tr><tr><td>Layout</td><td>Done</td></tr></table></body>\x00" as *u8
59 var hlen: i64 = 0
60 while html[hlen]!=(0 as u8) { hlen=hlen+1 }
61 p_w("=== RENDER-PAGE PROBE (full pipeline: layout+paint+encode) ===\n" as *u8)
62 p_w("html bytes=" as *u8); p_n(hlen); p_w("\n" as *u8)
63
64 let nbmp: i64 = nx_render_html_to_bmp(html, hlen, "knowledge/status/render_page_probe.bmp\x00" as *u8)
65 let npng: i64 = nx_render_html_to_png(html, hlen, "knowledge/status/render_page_probe.png\x00" as *u8)
66 p_w("boxes(bmp)=" as *u8); p_n(nbmp); p_w(" boxes(png)=" as *u8); p_n(npng); p_w("\n" as *u8)
67
68 let lp: *i64 = sys_mmap(8) as *i64
69 let bmp: *u8 = sys_read_file("knowledge/status/render_page_probe.bmp\x00" as *u8, lp)
70 let blen: i64 = lp[0]
71 p_w("bmp file bytes=" as *u8); p_n(blen); p_w("\n" as *u8)
72 if blen < 54 { p_w(" (BMP too small -- render produced nothing)\n" as *u8); return 1 }
73 let sig0: i64 = bmp[0]&0xff; let sig1: i64 = bmp[1]&0xff
74 p_w("sig=" as *u8); p_n(sig0); p_w("," as *u8); p_n(sig1); p_w(" (66,77='BM')\n" as *u8)
75 let off: i64 = u32le(bmp, 10)
76 let w: i64 = u32le(bmp, 18)
77 let h: i64 = u32le(bmp, 22)
78 p_w("pixel-off=" as *u8); p_n(off); p_w(" width=" as *u8); p_n(w); p_w(" height=" as *u8); p_n(h); p_w("\n" as *u8)
79
80 p_w("non-white pixels=" as *u8); p_n(count_nonwhite(bmp, off, w, h)); p_w("\n" as *u8)
81 rep_color(bmp, off, w, h, "white-bg\x00" as *u8, 255,255,255)
82 rep_color(bmp, off, w, h, "h1-bar #a8c8ff\x00" as *u8, 0xa8,0xc8,0xff)
83 rep_color(bmp, off, w, h, "h2-bar #d0d0d0\x00" as *u8, 0xd0,0xd0,0xd0)
84 rep_color(bmp, off, w, h, "infobox #f8f8f8\x00" as *u8, 0xf8,0xf8,0xf8)
85 rep_color(bmp, off, w, h, "link #3366cc\x00" as *u8, 0x33,0x66,0xcc)
86 rep_color(bmp, off, w, h, "black-text #000000\x00" as *u8, 0,0,0)
87 rep_color(bmp, off, w, h, "CONTROL green #00ff00\x00" as *u8, 0,0xff,0)
88 return 0
89}