Skip to main content

strat9_kernel/framebuffer/
generic.rs

1pub unsafe fn fill_generic(dst: *mut u32, color: u32, count: usize) {
2    for i in 0..count {
3        *dst.add(i) = color;
4    }
5}
6
7pub unsafe fn blit_generic(dst: *mut u32, src: *const u32, count: usize) {
8    core::ptr::copy_nonoverlapping(src, dst, count);
9}
10
11pub unsafe fn blend_generic(dst: *mut u32, src: *const u32, alpha: u8, count: usize) {
12    let alpha_u32 = alpha as u32;
13    let inv_alpha = 255 - alpha_u32;
14
15    for i in 0..count {
16        let d = *dst.add(i);
17        let s = *src.add(i);
18
19        let d_b = d & 0xFF;
20        let d_g = (d >> 8) & 0xFF;
21        let d_r = (d >> 16) & 0xFF;
22        let d_a = (d >> 24) & 0xFF;
23
24        let s_b = s & 0xFF;
25        let s_g = (s >> 8) & 0xFF;
26        let s_r = (s >> 16) & 0xFF;
27        let s_a = (s >> 24) & 0xFF;
28
29        let r_b = ((s_b * alpha_u32 + d_b * inv_alpha) / 255) & 0xFF;
30        let r_g = ((s_g * alpha_u32 + d_g * inv_alpha) / 255) & 0xFF;
31        let r_r = ((s_r * alpha_u32 + d_r * inv_alpha) / 255) & 0xFF;
32        let r_a = ((s_a * alpha_u32 + d_a * inv_alpha) / 255) & 0xFF;
33
34        *dst.add(i) = r_b | (r_g << 8) | (r_r << 16) | (r_a << 24);
35    }
36}
37
38pub unsafe fn convert_bgr_to_argb_generic(dst: *mut u32, src: *const u8, count: usize) {
39    for i in 0..count {
40        let b = *src.add(i * 3) as u32;
41        let g = *src.add(i * 3 + 1) as u32;
42        let r = *src.add(i * 3 + 2) as u32;
43        *dst.add(i) = b | (g << 8) | (r << 16) | (0xFF << 24);
44    }
45}