From 00fa82937ac5dbaa5b5bac04b2e84fa38c59e6c2 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Fri, 29 Dec 2023 17:11:46 +0100 Subject: [PATCH] Write blue rectangle to the screen --- kernel/src/framebuffer.rs | 49 +++++++++++++++++++++++++++++++++++++++ kernel/src/main.rs | 17 ++++++++++++-- 2 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 kernel/src/framebuffer.rs diff --git a/kernel/src/framebuffer.rs b/kernel/src/framebuffer.rs new file mode 100644 index 00000000..0c82e1b9 --- /dev/null +++ b/kernel/src/framebuffer.rs @@ -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:?}"), + } +} diff --git a/kernel/src/main.rs b/kernel/src/main.rs index 3904431e..d616a8dc 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -5,12 +5,25 @@ use core::panic::PanicInfo; use bootloader_api::BootInfo; +mod framebuffer; + bootloader_api::entry_point!(kernel_main); fn kernel_main(boot_info: &'static mut BootInfo) -> ! { if let Some(framebuffer) = boot_info.framebuffer.as_mut() { - for byte in framebuffer.buffer_mut() { - *byte = 0x90; + let color = framebuffer::Color { + 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 {}