nx_paint_solid_rect_test.nx source
↩ module page · 116 lines · 4723 B
1// nx_paint_solid_rect_test.nx -- smoke for the Phase-4 paint seed.
2// Verifies clear + solid-fill + clipping + boundary cases on a small
3// framebuffer.
4
5import "nx_syscalls.nx"
6import "nx_css_color_decode.nx"
7import "nx_paint_solid_rect.nx"
8
9func main() -> i64 {
10 let w: i64 = 16
11 let h: i64 = 16
12 let pixels: *u8 = (sys_mmap((w * h * 4) as nx_size)) as *u8
13 let fb: *Framebuffer = (sys_mmap(NX_FRAMEBUFFER_BYTES as nx_size)) as *Framebuffer
14 nx_framebuffer_init(fb, pixels, w, h)
15 nx_framebuffer_clear(fb)
16
17 // Red color (#ff0000ff).
18 let red: *CssColor = (sys_mmap(NX_CSS_COLOR_BYTES as nx_size)) as *CssColor
19 red.r = 255
20 red.g = 0
21 red.b = 0
22 red.a = 255
23
24 // Blue color (#0000ffff).
25 let blue: *CssColor = (sys_mmap(NX_CSS_COLOR_BYTES as nx_size)) as *CssColor
26 blue.r = 0
27 blue.g = 0
28 blue.b = 255
29 blue.a = 255
30
31 // ---- Fill a 5x5 rect at (2, 3) with red ----
32 let n_red: i64 = nx_paint_solid_rect(fb, 2, 3, 5, 5, red)
33 if n_red != 25 { return 1 }
34
35 // Probe pixels inside the red rect.
36 let probe: *CssColor = (sys_mmap(NX_CSS_COLOR_BYTES as nx_size)) as *CssColor
37 if nx_framebuffer_get_pixel(fb, 2, 3, probe) != 1 { return 2 }
38 if probe.r != 255 { return 3 }
39 if probe.g != 0 { return 4 }
40 if probe.b != 0 { return 5 }
41 if probe.a != 255 { return 6 }
42 if nx_framebuffer_get_pixel(fb, 6, 7, probe) != 1 { return 7 }
43 if probe.r != 255 { return 8 }
44
45 // Probe pixel just outside the red rect (should still be zero).
46 if nx_framebuffer_get_pixel(fb, 1, 3, probe) != 1 { return 10 }
47 if probe.r != 0 { return 11 }
48 if probe.a != 0 { return 12 }
49 if nx_framebuffer_get_pixel(fb, 7, 3, probe) != 1 { return 13 }
50 if probe.r != 0 { return 14 }
51 if nx_framebuffer_get_pixel(fb, 2, 8, probe) != 1 { return 15 }
52 if probe.r != 0 { return 16 }
53
54 // ---- Overwrite a corner with blue (overlap test) ----
55 let n_blue: i64 = nx_paint_solid_rect(fb, 5, 6, 3, 3, blue)
56 if n_blue != 9 { return 20 }
57 // The pixel at (5,6) overlaps red: should now be blue.
58 if nx_framebuffer_get_pixel(fb, 5, 6, probe) != 1 { return 21 }
59 if probe.r != 0 { return 22 }
60 if probe.b != 255 { return 23 }
61 // The pixel at (4,6) is still red.
62 if nx_framebuffer_get_pixel(fb, 4, 6, probe) != 1 { return 24 }
63 if probe.r != 255 { return 25 }
64 if probe.b != 0 { return 26 }
65
66 // ---- Clipping: rect extending beyond right + bottom edges ----
67 nx_framebuffer_clear(fb)
68 let green: *CssColor = (sys_mmap(NX_CSS_COLOR_BYTES as nx_size)) as *CssColor
69 green.r = 0
70 green.g = 255
71 green.b = 0
72 green.a = 255
73 // Place a 10x10 rect at (10, 10) -- only the (10..16) x (10..16)
74 // intersection should fill (6 x 6 = 36 pixels).
75 let n_clip: i64 = nx_paint_solid_rect(fb, 10, 10, 10, 10, green)
76 if n_clip != 36 { return 30 }
77 if nx_framebuffer_get_pixel(fb, 15, 15, probe) != 1 { return 31 }
78 if probe.g != 255 { return 32 }
79 // (9, 9) is outside the rect -- still zero.
80 if nx_framebuffer_get_pixel(fb, 9, 9, probe) != 1 { return 33 }
81 if probe.g != 0 { return 34 }
82
83 // ---- Clipping: rect with negative origin ----
84 nx_framebuffer_clear(fb)
85 // Place a 6x6 rect at (-3, -3) -- only the (0..3) x (0..3) region
86 // should fill (3 x 3 = 9 pixels).
87 let n_neg: i64 = nx_paint_solid_rect(fb, 0 - 3, 0 - 3, 6, 6, red)
88 if n_neg != 9 { return 40 }
89 if nx_framebuffer_get_pixel(fb, 0, 0, probe) != 1 { return 41 }
90 if probe.r != 255 { return 42 }
91 if nx_framebuffer_get_pixel(fb, 2, 2, probe) != 1 { return 43 }
92 if probe.r != 255 { return 44 }
93 if nx_framebuffer_get_pixel(fb, 3, 3, probe) != 1 { return 45 }
94 if probe.r != 0 { return 46 }
95
96 // ---- Fully-out-of-bounds rects write nothing ----
97 nx_framebuffer_clear(fb)
98 if nx_paint_solid_rect(fb, 100, 100, 10, 10, red) != 0 { return 50 }
99 if nx_paint_solid_rect(fb, 0 - 100, 0 - 100, 10, 10, red) != 0 { return 51 }
100 // Confirm nothing was written.
101 if nx_framebuffer_get_pixel(fb, 0, 0, probe) != 1 { return 52 }
102 if probe.r != 0 { return 53 }
103
104 // ---- Zero / negative dimensions are no-ops ----
105 if nx_paint_solid_rect(fb, 0, 0, 0, 5, red) != 0 { return 60 }
106 if nx_paint_solid_rect(fb, 0, 0, 5, 0, red) != 0 { return 61 }
107 if nx_paint_solid_rect(fb, 0, 0, 0 - 1, 5, red) != 0 { return 62 }
108 if nx_paint_solid_rect(fb, 0, 0, 5, 0 - 1, red) != 0 { return 63 }
109
110 // ---- get_pixel out-of-bounds returns 0 ----
111 if nx_framebuffer_get_pixel(fb, 16, 0, probe) != 0 { return 70 }
112 if nx_framebuffer_get_pixel(fb, 0, 16, probe) != 0 { return 71 }
113 if nx_framebuffer_get_pixel(fb, 0 - 1, 0, probe) != 0 { return 72 }
114
115 return 0
116}