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}