code wiki / _hdl_build / nx_x11_put_image_gate.nx
nx_x11_put_image_gate.nx source
↩ module page · 101 lines · 4662 B
1// nx_x11_put_image_gate.nx -- byte-asserts the PutImage encoder against the X11 wire spec, the
2// packed-fb -> ZPixmap conversion (exact bytes + round-trip identity), and the band math that keeps
3// every request under the server's advertised max. The LIVE server path is proven separately by
4// nx_desktop_breeders --selftest (put -> GetImage byte compare); this gate is the no-server half.
5// license_tier: ORIGINAL expect_exit: 0
6import "nx_x11_put_image.nx"
7
8func vw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
9func vn(v: i64) -> i64 {
10 let t: *u8 = sys_mmap(32) as *u8
11 var m: i64 = v; var w: i64 = 0
12 if m<0 { t[w]=45 as u8; w=w+1; m=0-m }
13 if m==0 { t[w]=48 as u8; sys_write(1,t,w+1); return 0 }
14 let d: *u8 = sys_mmap(32) as *u8
15 var k: i64=0
16 while m>0 { d[k]=(48+(m%10)) as u8; m=m/10; k=k+1 }
17 var j: i64=0
18 while j<k { t[w]=d[k-1-j]; w=w+1; j=j+1 }
19 sys_write(1,t,w); return 0
20}
21
22func main() -> i64 {
23 var pass: i64 = 0
24 let total: i64 = 5
25 vw("=== nx_x11_put_image gate (wire encoder + fb conversion + banding) ===\n" as *u8)
26
27 // T1 PutImage header bytes EXACT vs X Protocol opcode-72 layout
28 let req: *u8 = sys_mmap(64)
29 let tot: i64 = nx_x11_put_image_hdr(req, 0x11223344, 0x55667788, 480, 8, 0, 16, 24)
30 var t1: i64 = 0
31 if tot == 24 + 480*8*4 { t1 = t1 + 1 }
32 if (req[0] & 0xff) == 72 { if (req[1] & 0xff) == 2 { t1 = t1 + 1 } }
33 let words: i64 = ((req[2] & 0xff) as i64) | (((req[3] & 0xff) as i64) << 8)
34 if words == tot/4 { t1 = t1 + 1 }
35 if (req[4] & 0xff) == 0x44 { if (req[7] & 0xff) == 0x11 { t1 = t1 + 1 } }
36 if (req[8] & 0xff) == 0x88 { if (req[11] & 0xff) == 0x55 { t1 = t1 + 1 } }
37 let ww: i64 = ((req[12] & 0xff) as i64) | (((req[13] & 0xff) as i64) << 8)
38 let hh: i64 = ((req[14] & 0xff) as i64) | (((req[15] & 0xff) as i64) << 8)
39 let dy: i64 = ((req[18] & 0xff) as i64) | (((req[19] & 0xff) as i64) << 8)
40 if ww == 480 { if hh == 8 { if dy == 16 { t1 = t1 + 1 } } }
41 if (req[20] & 0xff) == 0 { if (req[21] & 0xff) == 24 { t1 = t1 + 1 } }
42 vw("T1 header fields exact: " as *u8); vn(t1); vw("/7\n" as *u8)
43 if t1 == 7 { pass = pass + 1 }
44
45 // T2 conversion EXACT bytes: packed R=200 G=100 B=50 -> ZPixmap LE [B,G,R,0]
46 let fbp: *i64 = sys_mmap(64) as *i64
47 fbp[0] = 200 | (100 << 8) | (50 << 16)
48 let z: *u8 = sys_mmap(64)
49 nx_fb_to_zpixmap(fbp, 1, z)
50 var t2: i64 = 0
51 if (z[0] & 0xff) == 50 { t2 = t2 + 1 }
52 if (z[1] & 0xff) == 100 { t2 = t2 + 1 }
53 if (z[2] & 0xff) == 200 { t2 = t2 + 1 }
54 if (z[3] & 0xff) == 0 { t2 = t2 + 1 }
55 vw("T2 zpixmap bytes [B,G,R,0]: " as *u8); vn(t2); vw("/4\n" as *u8)
56 if t2 == 4 { pass = pass + 1 }
57
58 // T3 round-trip identity over 4 distinct pixels (anti-vacuity: conversion is invertible)
59 fbp[0] = 255; fbp[1] = 255 << 8; fbp[2] = 255 << 16; fbp[3] = 123 | (45 << 8) | (67 << 16)
60 nx_fb_to_zpixmap(fbp, 4, z)
61 var t3: i64 = 0
62 var i: i64 = 0
63 while i < 4 {
64 let back: i64 = ((z[i*4+2] & 0xff) as i64) | (((z[i*4+1] & 0xff) as i64) << 8) | (((z[i*4] & 0xff) as i64) << 16)
65 if back == fbp[i] { t3 = t3 + 1 }
66 i = i + 1
67 }
68 vw("T3 round-trip identity: " as *u8); vn(t3); vw("/4\n" as *u8)
69 if t3 == 4 { pass = pass + 1 }
70
71 // T4 band math: 480x300 under the spec-floor budget covers all rows, no band over budget
72 let rows: i64 = nx_x11_put_max_rows(480, 4096)
73 var y: i64 = 0
74 var covered: i64 = 0
75 var bands: i64 = 0
76 var over: i64 = 0
77 while y < 300 {
78 var bh: i64 = rows
79 if y + bh > 300 { bh = 300 - y }
80 if (24 + 480*bh*4)/4 > 4096 { over = over + 1 }
81 covered = covered + bh
82 y = y + bh
83 bands = bands + 1
84 }
85 vw("T4 rows/band=" as *u8); vn(rows); vw(" bands=" as *u8); vn(bands)
86 vw(" covered=" as *u8); vn(covered); vw(" over-budget=" as *u8); vn(over); vw("\n" as *u8)
87 if covered == 300 { if over == 0 { if rows >= 1 { pass = pass + 1 } } }
88
89 // T5 max-rows floor: absurd width still returns >=1 (progress guaranteed), 0 budget -> spec floor
90 var t5: i64 = 0
91 if nx_x11_put_max_rows(999999, 4096) == 1 { t5 = t5 + 1 }
92 if nx_x11_put_max_rows(480, 0) == nx_x11_put_max_rows(480, 4096) { t5 = t5 + 1 }
93 vw("T5 floors: " as *u8); vn(t5); vw("/2\n" as *u8)
94 if t5 == 2 { pass = pass + 1 }
95
96 vw("nx_x11_put_image_gate: " as *u8); vn(pass); vw("/" as *u8); vn(total); vw("\n" as *u8)
97 if pass == total { vw("VERDICT verdict=GREEN -- PutImage encoder + conversion + banding spec-exact\n" as *u8); sys_exit(0) }
98 vw("VERDICT RED\n" as *u8)
99 sys_exit(1)
100 return 0
101}