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}