code wiki / _hdl_build / nx_x11_put_image_gate.nx
nx_x11_put_image_gate.nx source
↩ module page · 107 lines · 5040 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"
7import "nx_gate_verdict.nx"
8
9func vw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
10func vn(v: i64) -> i64 {
11 let t: *u8 = sys_mmap(32) as *u8
12 var m: i64 = v; var w: i64 = 0
13 if m<0 { t[w]=45 as u8; w=w+1; m=0-m }
14 if m==0 { t[w]=48 as u8; sys_write(1,t,w+1); return 0 }
15 let d: *u8 = sys_mmap(32) as *u8
16 var k: i64=0
17 while m>0 { d[k]=(48+(m%10)) as u8; m=m/10; k=k+1 }
18 var j: i64=0
19 while j<k { t[w]=d[k-1-j]; w=w+1; j=j+1 }
20 sys_write(1,t,w); return 0
21}
22
23func main() -> i64 {
24 var pass: i64 = 0
25 let total: i64 = 5
26 vw("=== nx_x11_put_image gate (wire encoder + fb conversion + banding) ===\n" as *u8)
27
28 // T1 PutImage header bytes EXACT vs X Protocol opcode-72 layout
29 let req: *u8 = sys_mmap(64)
30 let tot: i64 = nx_x11_put_image_hdr(req, 0x11223344, 0x55667788, 480, 8, 0, 16, 24)
31 var t1: i64 = 0
32 if tot == 24 + 480*8*4 { t1 = t1 + 1 }
33 if (req[0] & 0xff) == 72 { if (req[1] & 0xff) == 2 { t1 = t1 + 1 } }
34 let words: i64 = ((req[2] & 0xff) as i64) | (((req[3] & 0xff) as i64) << 8)
35 if words == tot/4 { t1 = t1 + 1 }
36 if (req[4] & 0xff) == 0x44 { if (req[7] & 0xff) == 0x11 { t1 = t1 + 1 } }
37 if (req[8] & 0xff) == 0x88 { if (req[11] & 0xff) == 0x55 { t1 = t1 + 1 } }
38 let ww: i64 = ((req[12] & 0xff) as i64) | (((req[13] & 0xff) as i64) << 8)
39 let hh: i64 = ((req[14] & 0xff) as i64) | (((req[15] & 0xff) as i64) << 8)
40 let dy: i64 = ((req[18] & 0xff) as i64) | (((req[19] & 0xff) as i64) << 8)
41 if ww == 480 { if hh == 8 { if dy == 16 { t1 = t1 + 1 } } }
42 if (req[20] & 0xff) == 0 { if (req[21] & 0xff) == 24 { t1 = t1 + 1 } }
43 vw("T1 header fields exact: " as *u8); vn(t1); vw("/7\n" as *u8)
44 if t1 == 7 { pass = pass + 1 }
45
46 // T2 conversion EXACT bytes: packed R=200 G=100 B=50 -> ZPixmap LE [B,G,R,0]
47 let fbp: *i64 = sys_mmap(64) as *i64
48 fbp[0] = 200 | (100 << 8) | (50 << 16)
49 let z: *u8 = sys_mmap(64)
50 nx_fb_to_zpixmap(fbp, 1, z)
51 var t2: i64 = 0
52 if (z[0] & 0xff) == 50 { t2 = t2 + 1 }
53 if (z[1] & 0xff) == 100 { t2 = t2 + 1 }
54 if (z[2] & 0xff) == 200 { t2 = t2 + 1 }
55 if (z[3] & 0xff) == 0 { t2 = t2 + 1 }
56 vw("T2 zpixmap bytes [B,G,R,0]: " as *u8); vn(t2); vw("/4\n" as *u8)
57 if t2 == 4 { pass = pass + 1 }
58
59 // T3 round-trip identity over 4 distinct pixels (anti-vacuity: conversion is invertible)
60 fbp[0] = 255; fbp[1] = 255 << 8; fbp[2] = 255 << 16; fbp[3] = 123 | (45 << 8) | (67 << 16)
61 nx_fb_to_zpixmap(fbp, 4, z)
62 var t3: i64 = 0
63 var i: i64 = 0
64 while i < 4 {
65 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)
66 if back == fbp[i] { t3 = t3 + 1 }
67 i = i + 1
68 }
69 vw("T3 round-trip identity: " as *u8); vn(t3); vw("/4\n" as *u8)
70 if t3 == 4 { pass = pass + 1 }
71
72 // T4 band math: 480x300 under the spec-floor budget covers all rows, no band over budget
73 let rows: i64 = nx_x11_put_max_rows(480, 4096)
74 var y: i64 = 0
75 var covered: i64 = 0
76 var bands: i64 = 0
77 var over: i64 = 0
78 while y < 300 {
79 var bh: i64 = rows
80 if y + bh > 300 { bh = 300 - y }
81 if (24 + 480*bh*4)/4 > 4096 { over = over + 1 }
82 covered = covered + bh
83 y = y + bh
84 bands = bands + 1
85 }
86 vw("T4 rows/band=" as *u8); vn(rows); vw(" bands=" as *u8); vn(bands)
87 vw(" covered=" as *u8); vn(covered); vw(" over-budget=" as *u8); vn(over); vw("\n" as *u8)
88 if covered == 300 { if over == 0 { if rows >= 1 { pass = pass + 1 } } }
89
90 // T5 max-rows floor: absurd width still returns >=1 (progress guaranteed), 0 budget -> spec floor
91 var t5: i64 = 0
92 if nx_x11_put_max_rows(999999, 4096) == 1 { t5 = t5 + 1 }
93 if nx_x11_put_max_rows(480, 0) == nx_x11_put_max_rows(480, 4096) { t5 = t5 + 1 }
94 vw("T5 floors: " as *u8); vn(t5); vw("/2\n" as *u8)
95 if t5 == 2 { pass = pass + 1 }
96
97 vw("nx_x11_put_image_gate: " as *u8); vn(pass); vw("/" as *u8); vn(total); vw("\n" as *u8)
98 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
99 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
100 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
101 let ctr__dry: *i64 = gv_ctr()
102 ctr__dry[0] = pass
103 ctr__dry[1] = total
104 let rc__dry: i64 = gv_verdict("X11-PUT-IMAGE-GATE" as *u8, ctr__dry, "PutImage encoder + conversion + banding spec-exact" as *u8)
105 sys_exit(rc__dry)
106 return rc__dry
107}