code wiki / (root) / nx_img_core_gate.nx

nx_img_core_gate.nx source

↩ module page · 66 lines · 3119 B

1// nx_img_core_gate.nx -- proves R1 (bytes -> pixels): decode a P2 (ASCII) PGM and a P5 (binary) PGM into the pixel 2// buffer, verify dimensions + individual pixels + histogram + invert. Exit 0 iff all pass. license_tier: ORIGINAL 3import "nx_gate.nx" 4import "nx_img_core.nx" 5 6func chk(name: *u8, got: i64, want: i64, st: *i64) -> i64 { 7 if got == want { st[0] = st[0] + 1; gw(" PASS " as *u8); gw(name); gw("\n" as *u8) } 8 else { st[1] = st[1] + 1; gw(" FAIL " as *u8); gw(name); gw(" got=" as *u8); gn(got); gw(" want=" as *u8); gn(want); gw("\n" as *u8) } 9 return 0 10} 11 12func main() -> i64 { 13 let st: *i64 = sys_mmap(16) as *i64 14 st[0] = 0; st[1] = 0 15 16 // -- P2 (ASCII) 3x2 image: rows [0 128 255] / [64 32 200] -- 17 let p2: *u8 = "P2\n3 2\n255\n0 128 255\n64 32 200\n" as *u8 18 var p2len: i64 = 0; while p2[p2len] != (0 as u8) { p2len = p2len + 1 } 19 let pix: *u8 = sys_mmap(1024) 20 let dims: *i64 = sys_mmap(64) as *i64 21 let n: i64 = img_pgm_decode(p2, p2len, pix, 1024, dims) 22 23 chk("P2 decoded 6 pixels" as *u8, n, 6, st) 24 chk("P2 width = 3" as *u8, dims[IMG_W], 3, st) 25 chk("P2 height = 2" as *u8, dims[IMG_H], 2, st) 26 chk("P2 maxval = 255" as *u8, dims[IMG_MAX], 255, st) 27 chk("P2 pixel (0,0) = 0" as *u8, img_get(pix, 3, 0, 0), 0, st) 28 chk("P2 pixel (1,0) = 128" as *u8, img_get(pix, 3, 1, 0), 128, st) 29 chk("P2 pixel (2,0) = 255" as *u8, img_get(pix, 3, 2, 0), 255, st) 30 chk("P2 pixel (0,1) = 64" as *u8, img_get(pix, 3, 0, 1), 64, st) 31 chk("P2 pixel (2,1) = 200" as *u8, img_get(pix, 3, 2, 1), 200, st) 32 33 // histogram 34 let hist: *i64 = sys_mmap(256 * 8) as *i64 35 img_histogram(pix, n, hist) 36 chk("hist[0] = 1" as *u8, hist[0], 1, st) 37 chk("hist[128] = 1" as *u8, hist[128], 1, st) 38 chk("hist[255] = 1" as *u8, hist[255], 1, st) 39 chk("hist[100] = 0 (absent)" as *u8, hist[100], 0, st) 40 41 // invert (maxval 255) 42 img_invert(pix, n, 255) 43 chk("invert pixel (0,0): 0 -> 255" as *u8, img_get(pix, 3, 0, 0), 255, st) 44 chk("invert pixel (2,0): 255 -> 0" as *u8, img_get(pix, 3, 2, 0), 0, st) 45 46 // -- P5 (binary) 2x1 image built programmatically: header + raw bytes [10, 250] -- 47 let hdr: *u8 = "P5\n2 1\n255\n" as *u8 48 var hlen: i64 = 0; while hdr[hlen] != (0 as u8) { hlen = hlen + 1 } 49 let buf: *u8 = sys_mmap(64) 50 var i: i64 = 0; while i < hlen { buf[i] = hdr[i]; i = i + 1 } 51 buf[hlen] = 10 as u8 52 buf[hlen + 1] = 250 as u8 53 let dims2: *i64 = sys_mmap(64) as *i64 54 let pix2: *u8 = sys_mmap(64) 55 let n2: i64 = img_pgm_decode(buf, hlen + 2, pix2, 64, dims2) 56 57 chk("P5 decoded 2 pixels" as *u8, n2, 2, st) 58 chk("P5 format = 5 (binary)" as *u8, dims2[IMG_FMT], 5, st) 59 chk("P5 pixel (0,0) = 10" as *u8, img_get(pix2, 2, 0, 0), 10, st) 60 chk("P5 pixel (1,0) = 250" as *u8, img_get(pix2, 2, 1, 0), 250, st) 61 62 gw("nx_img_core_gate: PASS=" as *u8); gn(st[0]); gw(" FAIL=" as *u8); gn(st[1]); gw("\n" as *u8) 63 if st[1] == 0 { gw("R1 nx_img_core: GREEN (bytes -> pixels; PGM P2 + P5 decode, histogram, invert)\n" as *u8); return 0 } 64 gw("R1 nx_img_core: RED\n" as *u8) 65 return 1 66}