#include 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; } }