code wiki / (root) / nx_palette_test.nx

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}