mirror of
https://github.com/phil-opp/blog_os.git
synced 2025-12-17 06:47:49 +00:00
Write blue rectangle to the screen
This commit is contained in:
49
kernel/src/framebuffer.rs
Normal file
49
kernel/src/framebuffer.rs
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
use bootloader_api::info::{FrameBuffer, PixelFormat};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
|
pub struct Position {
|
||||||
|
pub x: usize,
|
||||||
|
pub y: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
|
pub struct Color {
|
||||||
|
pub red: u8,
|
||||||
|
pub green: u8,
|
||||||
|
pub blue: u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_pixel_in(framebuffer: &mut FrameBuffer, position: Position, color: Color) {
|
||||||
|
let info = framebuffer.info();
|
||||||
|
|
||||||
|
// calculate offset to first byte of pixel
|
||||||
|
let byte_offset = {
|
||||||
|
// use stride to calculate pixel offset of target line
|
||||||
|
let line_offset = position.y * info.stride;
|
||||||
|
// add x position to get the absolute pixel offset in buffer
|
||||||
|
let pixel_offset = line_offset + position.x;
|
||||||
|
// convert to byte offset
|
||||||
|
pixel_offset * info.bytes_per_pixel
|
||||||
|
};
|
||||||
|
|
||||||
|
// set pixel based on color format
|
||||||
|
let pixel_buffer = &mut framebuffer.buffer_mut()[byte_offset..];
|
||||||
|
match info.pixel_format {
|
||||||
|
PixelFormat::Rgb => {
|
||||||
|
pixel_buffer[0] = color.red;
|
||||||
|
pixel_buffer[1] = color.green;
|
||||||
|
pixel_buffer[2] = color.blue;
|
||||||
|
}
|
||||||
|
PixelFormat::Bgr => {
|
||||||
|
pixel_buffer[0] = color.blue;
|
||||||
|
pixel_buffer[1] = color.green;
|
||||||
|
pixel_buffer[2] = color.red;
|
||||||
|
}
|
||||||
|
PixelFormat::U8 => {
|
||||||
|
// use a simple average-based grayscale transform
|
||||||
|
let gray = color.red / 3 + color.green / 3 + color.blue / 3;
|
||||||
|
pixel_buffer[0] = gray;
|
||||||
|
}
|
||||||
|
other => panic!("unknown pixel format {other:?}"),
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,12 +5,25 @@ use core::panic::PanicInfo;
|
|||||||
|
|
||||||
use bootloader_api::BootInfo;
|
use bootloader_api::BootInfo;
|
||||||
|
|
||||||
|
mod framebuffer;
|
||||||
|
|
||||||
bootloader_api::entry_point!(kernel_main);
|
bootloader_api::entry_point!(kernel_main);
|
||||||
|
|
||||||
fn kernel_main(boot_info: &'static mut BootInfo) -> ! {
|
fn kernel_main(boot_info: &'static mut BootInfo) -> ! {
|
||||||
if let Some(framebuffer) = boot_info.framebuffer.as_mut() {
|
if let Some(framebuffer) = boot_info.framebuffer.as_mut() {
|
||||||
for byte in framebuffer.buffer_mut() {
|
let color = framebuffer::Color {
|
||||||
*byte = 0x90;
|
red: 0,
|
||||||
|
green: 0,
|
||||||
|
blue: 255,
|
||||||
|
};
|
||||||
|
for x in 0..100 {
|
||||||
|
for y in 0..100 {
|
||||||
|
let position = framebuffer::Position {
|
||||||
|
x: 20 + x,
|
||||||
|
y: 100 + y,
|
||||||
|
};
|
||||||
|
framebuffer::set_pixel_in(framebuffer, position, color);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
loop {}
|
loop {}
|
||||||
|
|||||||
Reference in New Issue
Block a user