code wiki / (root) / nx_doc_layout_test.nx

nx_doc_layout_test.nx source

↩ module page · 91 lines · 3599 B

1// nx_doc_layout_test.nx -- gate for the grayscale document layout engine. Unique exit codes per invariant: 2// 1x blit 'A' scale 1 -> every pixel black iff the font glyph bit is set (exact glyph fidelity) 3// 2x blit 'A' scale 2 -> each glyph bit becomes a 2x2 black block 4// 3x render "AB" -> 'B' advances to x=8; inter-glyph gap stays white 5// 4x newline: "A\nB" -> 'B' lands on the second line 6// expect_exit: 0 license_tier: ORIGINAL 7 8import "nx_syscalls.nx" 9import "nx_font8x8.nx" 10import "nx_doc_layout.nx" 11 12func 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 } 13func fillw(bm: *u8, n: i64) -> i64 { var i: i64 = 0; while i < n { bm[i] = 255 as u8; i = i + 1 } return 0 } 14 15func main() -> i64 { 16 let table: *u8 = font8x8_table() 17 let A: *u8 = nx_doc_glyph(table, 65) // 'A' 18 19 // KAT 1: 'A' scale 1 exact 20 let b1: *u8 = sys_mmap(64) 21 fillw(b1, 64) 22 nx_doc_blit(b1, 8, 8, 0, 0, A, 1) 23 var r: i64 = 0 24 while r < 8 { 25 let rb: i64 = A[r] as i64 26 var c: i64 = 0 27 while c < 8 { 28 var want: i64 = 255 29 if ((rb >> c) & 1) == 1 { want = 0 } 30 if (b1[r * 8 + c] as i64) != want { return 1 } 31 c = c + 1 32 } 33 r = r + 1 34 } 35 36 // KAT 2: 'A' scale 2 -> 2x2 blocks 37 let b2: *u8 = sys_mmap(256) 38 fillw(b2, 256) 39 nx_doc_blit(b2, 16, 16, 0, 0, A, 2) 40 r = 0 41 while r < 8 { 42 let rb2: i64 = A[r] as i64 43 var c2: i64 = 0 44 while c2 < 8 { 45 var want2: i64 = 255 46 if ((rb2 >> c2) & 1) == 1 { want2 = 0 } 47 // check all 4 px of the 2x2 block 48 var dy: i64 = 0 49 while dy < 2 { 50 var dx: i64 = 0 51 while dx < 2 { 52 let py: i64 = r * 2 + dy 53 let px: i64 = c2 * 2 + dx 54 if (b2[py * 16 + px] as i64) != want2 { return 2 } 55 dx = dx + 1 56 } 57 dy = dy + 1 58 } 59 c2 = c2 + 1 60 } 61 r = r + 1 62 } 63 64 // KAT 3: "AB" advance. W=24,H=8. 'A'=0x0C row0 (cols2,3); 'B'=0x3F row0 (cols0-5) 65 let b3: *u8 = sys_mmap(256) 66 fillw(b3, 24 * 8) 67 nx_doc_render(b3, 24, 8, table, "AB", 1, 0, 0, 0, 0, 0) 68 if (b3[0 * 24 + 2] as i64) != 0 { return 30 } // A col2 row0 black 69 if (b3[0 * 24 + 6] as i64) != 255 { return 31 } // gap (A col6) white 70 if (b3[0 * 24 + 8] as i64) != 0 { return 32 } // B col0 row0 black (x advanced to 8) 71 72 // KAT 4: newline "A\nB" scale1 line_gap0 -> 'B' at y=8 73 let b4: *u8 = sys_mmap(24 * 24) 74 fillw(b4, 24 * 24) 75 nx_doc_render(b4, 24, 24, table, "A\nB", 1, 0, 0, 0, 0, 0) 76 // B at (0,8): row8 is glyph row0 of B = 0x3F, col0 set -> black 77 if (b4[8 * 24 + 0] as i64) != 0 { return 40 } 78 // first line still has A (row0 col2 black) 79 if (b4[0 * 24 + 2] as i64) != 0 { return 41 } 80 81 // KAT 5: WORD-WRAP. W=32 (4 chars), scale1, no margins. "AA BB": AA fits line1, BB wraps whole to line2. 82 let b5: *u8 = sys_mmap(32 * 24) 83 fillw(b5, 32 * 24) 84 nx_doc_render(b5, 32, 24, table, "AA BB", 1, 0, 0, 0, 0, 0) 85 if (b5[0 * 32 + 2] as i64) != 0 { return 50 } // A on line 1 (A row0 col2 black) 86 if (b5[0 * 32 + 20] as i64) != 255 { return 51 } // line 1 right area white -> BB did NOT stay on line1 87 if (b5[8 * 32 + 0] as i64) != 0 { return 52 } // B wrapped wholly to line 2 (B row0 col0 black) 88 89 t_puts("nx_doc_layout: 5/5 KAT PASS (glyph-exact + scale2 + advance + newline + word-wrap)\n") 90 return 0 91}