code wiki / (root) / nx_doc_to_urf_test.nx

nx_doc_to_urf_test.nx source

↩ module page · 54 lines · 2191 B

1// nx_doc_to_urf_test.nx -- gate for the multi-page document->URF encoder. Unique exit codes per invariant: 2// 1x 6 explicit lines on a tiny page (~4 lines/page) -> 2 pages 3// 2x URF file header valid: "UNIRAST\0" + pageCount BE == 2 4// 3x page-1 header has correct width (BE) at the right offset 5// 4x page-1 RLE decodes back to W*H pixels (valid raster) 6// expect_exit: 0 license_tier: ORIGINAL 7 8import "nx_syscalls.nx" 9import "nx_font8x8.nx" 10import "nx_doc_layout.nx" 11import "nx_pwg_rle.nx" 12import "nx_urf.nx" 13import "nx_doc_to_urf.nx" 14 15func t_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 16func be32(d: *u8, o: i64) -> i64 { 17 return ((d[o] as i64) << 24) | ((d[o + 1] as i64) << 16) | ((d[o + 2] as i64) << 8) | (d[o + 3] as i64) 18} 19 20func main() -> i64 { 21 let table: *u8 = font8x8_table() 22 let W: i64 = 80 23 let H: i64 = 40 24 let bm: *u8 = sys_mmap(W * H) 25 let out: *u8 = sys_mmap(65536) 26 let pages: *i64 = sys_mmap(8) as *i64 27 let covsum: *i64 = sys_mmap(8) as *i64 28 29 // 6 short lines; tiny page fits ~4 -> 2 pages 30 let txt: *u8 = "LINE ONE\nLINE TWO\nLINE 3X\nLINE 4X\nLINE 5X\nLINE 6X\n" 31 let total: i64 = nx_doc_to_urf(out, bm, W, H, table, txt, 1, 2, 2, 2, 2, 1, 300, NX_URF_DUP_LONG, NX_URF_Q_NORMAL, pages, covsum) 32 33 if pages[0] != 2 { return 1 } 34 if covsum[0] <= 0 { return 2 } 35 36 // file header "UNIRAST\0" 37 if (out[0] as i64) != 0x55 { return 20 } 38 if (out[1] as i64) != 0x4E { return 21 } 39 if (out[6] as i64) != 0x54 { return 22 } 40 if (out[7] as i64) != 0x00 { return 23 } 41 if be32(out, 8) != 2 { return 24 } // pageCount 42 43 // page-1 header at offset 12; width at +12 (=offset 24), height at +16 (=offset 28) 44 if be32(out, 24) != W { return 30 } 45 if be32(out, 28) != H { return 31 } 46 47 // page-1 RLE starts at offset 44 -> decodes to W*H pixels 48 let dec: *u8 = sys_mmap(W * H) 49 let px: i64 = nx_rle_decode(((out as i64) + 44) as *u8, total - 44, W, H, 1, dec, W * H) 50 if px != W * H { return 40 } 51 52 t_puts("nx_doc_to_urf: 4/4 KAT PASS (2 pages + UNIRAST header + pageCount + page-1 decodes)\n") 53 return 0 54}