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}