veridian_kernel/graphics/
cursor.rs1pub const CURSOR_WIDTH: usize = 16;
8pub const CURSOR_HEIGHT: usize = 16;
10
11const CURSOR_DATA: [u16; CURSOR_HEIGHT] = [
17 0b1000_0000_0000_0000, 0b1100_0000_0000_0000, 0b1110_0000_0000_0000, 0b1111_0000_0000_0000, 0b1111_1000_0000_0000, 0b1111_1100_0000_0000, 0b1111_1110_0000_0000, 0b1111_1111_0000_0000, 0b1111_1111_1000_0000, 0b1111_1100_0000_0000, 0b1111_0110_0000_0000, 0b1110_0011_0000_0000, 0b1100_0011_0000_0000, 0b0000_0001_1000_0000, 0b0000_0001_1000_0000, 0b0000_0000_0000_0000, ];
34
35const CURSOR_MASK: [u16; CURSOR_HEIGHT] = [
37 0b1100_0000_0000_0000,
38 0b1110_0000_0000_0000,
39 0b1111_0000_0000_0000,
40 0b1111_1000_0000_0000,
41 0b1111_1100_0000_0000,
42 0b1111_1110_0000_0000,
43 0b1111_1111_0000_0000,
44 0b1111_1111_1000_0000,
45 0b1111_1111_1100_0000,
46 0b1111_1111_1100_0000,
47 0b1111_1111_0000_0000,
48 0b1111_0111_1000_0000,
49 0b1110_0111_1000_0000,
50 0b0000_0011_1100_0000,
51 0b0000_0011_1100_0000,
52 0b0000_0001_1100_0000,
53];
54
55pub fn draw_cursor(
64 buf: &mut [u8],
65 stride: usize,
66 buf_width: usize,
67 buf_height: usize,
68 cx: i32,
69 cy: i32,
70) {
71 for row in 0..CURSOR_HEIGHT {
72 let py = cy as usize + row;
73 if py >= buf_height {
74 break;
75 }
76 let mask_bits = CURSOR_MASK[row];
77 let data_bits = CURSOR_DATA[row];
78
79 for col in 0..CURSOR_WIDTH {
80 let px = cx as usize + col;
81 if px >= buf_width {
82 break;
83 }
84
85 let bit = 15 - col;
86 let in_mask = (mask_bits >> bit) & 1 != 0;
87 let in_data = (data_bits >> bit) & 1 != 0;
88
89 if in_mask {
90 let offset = py * stride + px * 4;
91 if offset + 3 < buf.len() {
92 if in_data {
93 buf[offset] = 0xFF;
95 buf[offset + 1] = 0xFF;
96 buf[offset + 2] = 0xFF;
97 buf[offset + 3] = 0xFF;
98 } else {
99 buf[offset] = 0x00;
101 buf[offset + 1] = 0x00;
102 buf[offset + 2] = 0x00;
103 buf[offset + 3] = 0xFF;
104 }
105 }
106 }
107 }
108 }
109}