nx_palette_test.nx source
↩ module page · 90 lines · 3809 B
1// nx_palette_test.nx -- smoke for nx_palette.
2
3import "nx_syscalls.nx"
4import "nx_palette.nx"
5
6func main() -> i64 {
7 // 1: bpp validation
8 if nx_pal_bpp_is_valid(NX_BPP_1) != 1 { return 1 }
9 if nx_pal_bpp_is_valid(NX_BPP_2) != 1 { return 2 }
10 if nx_pal_bpp_is_valid(NX_BPP_3) != 1 { return 3 }
11 if nx_pal_bpp_is_valid(NX_BPP_4) != 1 { return 4 }
12 if nx_pal_bpp_is_valid(NX_BPP_8) != 1 { return 5 }
13 if nx_pal_bpp_is_valid(5) != 0 { return 6 }
14 if nx_pal_bpp_is_valid(0) != 0 { return 7 }
15
16 // 2: max-index per bpp
17 if nx_pal_max_index(NX_BPP_1) != 1 { return 8 }
18 if nx_pal_max_index(NX_BPP_2) != 3 { return 9 }
19 if nx_pal_max_index(NX_BPP_3) != 7 { return 10 }
20 if nx_pal_max_index(NX_BPP_4) != 15 { return 11 }
21 if nx_pal_max_index(NX_BPP_8) != 255 { return 12 }
22
23 // 3: packed size correctly rounds up
24 if nx_pal_packed_bytes(8, NX_BPP_1) != 1 { return 13 }
25 if nx_pal_packed_bytes(9, NX_BPP_1) != 2 { return 14 }
26 if nx_pal_packed_bytes(8, NX_BPP_3) != 3 { return 15 }
27 if nx_pal_packed_bytes(32768, NX_BPP_3) != 12288 { return 16 } // 32-cube at 3bpp
28 if nx_pal_packed_bytes(4, NX_BPP_4) != 2 { return 17 }
29
30 // 4: 4bpp pack + unpack roundtrip (boundary-clean within byte)
31 let src4: *u8 = (sys_mmap(8)) as *u8
32 src4[0] = 1 as u8; src4[1] = 2 as u8; src4[2] = 3 as u8; src4[3] = 15 as u8
33 src4[4] = 0 as u8; src4[5] = 7 as u8; src4[6] = 8 as u8; src4[7] = 15 as u8
34 let dst4: *u8 = (sys_mmap(4)) as *u8
35 if nx_palette_pack(src4, 8, NX_BPP_4, dst4) != NX_PAL_OK { return 18 }
36 let back4: *u8 = (sys_mmap(8)) as *u8
37 if nx_palette_unpack(dst4, 8, NX_BPP_4, back4) != NX_PAL_OK { return 19 }
38 var i4: nx_size = 0
39 while i4 < 8 {
40 if (back4[i4] as i64) & 255 != (src4[i4] as i64) & 255 { return 20 }
41 i4 = i4 + 1
42 }
43
44 // 5: 3bpp pack + unpack roundtrip (CROSSES BYTE BOUNDARY -- the
45 // case that breaks naive shift-pack implementations)
46 let src3: *u8 = (sys_mmap(16)) as *u8
47 src3[0] = 0 as u8; src3[1] = 1 as u8; src3[2] = 2 as u8; src3[3] = 3 as u8
48 src3[4] = 4 as u8; src3[5] = 5 as u8; src3[6] = 6 as u8; src3[7] = 7 as u8
49 src3[8] = 7 as u8; src3[9] = 0 as u8; src3[10] = 1 as u8; src3[11] = 2 as u8
50 src3[12] = 3 as u8; src3[13] = 4 as u8; src3[14] = 5 as u8; src3[15] = 6 as u8
51 let dst3: *u8 = (sys_mmap(6)) as *u8
52 if nx_palette_pack(src3, 16, NX_BPP_3, dst3) != NX_PAL_OK { return 21 }
53 let back3: *u8 = (sys_mmap(16)) as *u8
54 if nx_palette_unpack(dst3, 16, NX_BPP_3, back3) != NX_PAL_OK { return 22 }
55 var i3: nx_size = 0
56 while i3 < 16 {
57 if (back3[i3] as i64) & 255 != (src3[i3] as i64) & 255 { return 23 }
58 i3 = i3 + 1
59 }
60
61 // 6: 1bpp boundary case
62 let src1: *u8 = (sys_mmap(16)) as *u8
63 var p: nx_size = 0
64 while p < 16 {
65 src1[p] = (p & 1) as u8
66 p = p + 1
67 }
68 let dst1: *u8 = (sys_mmap(2)) as *u8
69 if nx_palette_pack(src1, 16, NX_BPP_1, dst1) != NX_PAL_OK { return 24 }
70 let back1: *u8 = (sys_mmap(16)) as *u8
71 if nx_palette_unpack(dst1, 16, NX_BPP_1, back1) != NX_PAL_OK { return 25 }
72 var q: nx_size = 0
73 while q < 16 {
74 if (back1[q] as i64) & 255 != (src1[q] as i64) & 255 { return 26 }
75 q = q + 1
76 }
77
78 // 7: out-of-range index rejected (cardinal: defensive at boundaries)
79 let big: *u8 = (sys_mmap(4)) as *u8
80 big[0] = 0 as u8; big[1] = 0 as u8; big[2] = 99 as u8; big[3] = 0 as u8
81 let pad: *u8 = (sys_mmap(4)) as *u8
82 if nx_palette_pack(big, 4, NX_BPP_4, pad) != NX_PAL_ERR_BAD_INDEX { return 27 }
83
84 // 8: bad bpp rejected
85 let arb: *u8 = (sys_mmap(2)) as *u8
86 if nx_palette_pack(arb, 1, 5, pad) != NX_PAL_ERR_BAD_BPP { return 28 }
87 if nx_palette_unpack(arb, 1, 5, pad) != NX_PAL_ERR_BAD_BPP { return 29 }
88
89 return 0
90}