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}