code wiki / (root) / nx_paint_solid_rect_test.nx

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}