diff options
Diffstat (limited to 'kernel/framebuffer.cpp')
-rw-r--r-- | kernel/framebuffer.cpp | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/kernel/framebuffer.cpp b/kernel/framebuffer.cpp new file mode 100644 index 0000000..a115e0b --- /dev/null +++ b/kernel/framebuffer.cpp @@ -0,0 +1,59 @@ +#include <mercury/kernel/framebuffer.hpp> + +namespace mercury::kernel::framebuffer { + + uint32_t *vaddr; + int width; + int height; + int dword_pitch; + + void init_framebuffer( + uint64_t vaddr, uint64_t width, uint64_t height, uint64_t pitch + ) { + //TODO: assumes 32-bpp rgb + framebuffer::vaddr = (uint32_t *)vaddr; + framebuffer::width = width; + framebuffer::height = height; + dword_pitch = pitch / 4; + } + + color encode_color(uint8_t r, uint8_t g, uint8_t b) { + return ((uint32_t)r << 16) | ((uint32_t)g << 8) | (uint32_t)b; + } + + void set_pixel(int x, int y, color c) { + vaddr[y * dword_pitch + x] = c; + } + + void move_region( + int from_start_x, int from_start_y, int from_end_x, + int from_end_y, int to_start_x, int to_start_y + ) { + + int region_width = from_end_x - from_start_x; + int region_height = from_end_y - from_start_y; + + int from_start_offset = from_start_y * dword_pitch + from_start_x; + int to_start_offset = to_start_y * dword_pitch + to_start_x; + + if (from_start_offset > to_start_offset) + for (int y = 0; y < region_height; ++y) + for (int x = 0; x < region_width; ++x) + vaddr[to_start_offset + y * dword_pitch + x] = + vaddr[from_start_offset + y * dword_pitch + x]; + + else if (from_start_offset < to_start_offset) + for (int y = region_height - 1; y >= 0; --y) + for (int x = region_width - 1; x >= 0; --x) + vaddr[to_start_offset + y * dword_pitch + x] = + vaddr[from_start_offset + y * dword_pitch + x]; + + } + + void fill_region(int start_x, int start_y, int end_x, int end_y, color c) { + for (int y = start_y; y < end_y; ++y) + for (int x = start_x; x < end_x; ++x) + vaddr[y * dword_pitch + x] = c; + } + +} |