summaryrefslogtreecommitdiff
path: root/kernel/framebuffer.cpp
diff options
context:
space:
mode:
authorBenji Dial <benji@benjidial.net>2024-01-08 22:28:41 -0500
committerBenji Dial <benji@benjidial.net>2024-01-08 22:28:41 -0500
commitc2f48fb5df0981df1df23de2b277274f9fe75080 (patch)
tree5202557438bbe3bdc7d10c7769731ab3594185f9 /kernel/framebuffer.cpp
downloadhilbert-os-c2f48fb5df0981df1df23de2b277274f9fe75080.tar.gz
first commit
Diffstat (limited to 'kernel/framebuffer.cpp')
-rw-r--r--kernel/framebuffer.cpp59
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;
+ }
+
+}