Luna/kernel/src/video/Framebuffer.cpp
2023-01-02 13:07:29 +01:00

84 lines
1.7 KiB
C++

#include "video/Framebuffer.h"
#include "boot/bootboot.h"
static u8* g_fb_ptr = nullptr;
static u32 g_fb_size;
static u32 g_fb_width;
static u32 g_fb_height;
static u32 g_fb_scanline;
extern const BOOTBOOT bootboot;
extern u8 fb[1];
namespace Framebuffer
{
void init()
{
update(fb, bootboot.fb_size, bootboot.fb_width, bootboot.fb_height, bootboot.fb_scanline);
}
void update(u8* ptr, u32 size, u32 width, u32 height, u32 scanline)
{
g_fb_ptr = ptr;
g_fb_size = size;
g_fb_width = width;
g_fb_height = height;
g_fb_scanline = scanline;
}
void pixel(u32 x, u32 y, u32 color)
{
if (!g_fb_ptr) [[unlikely]]
return;
*(u32*)(g_fb_ptr + g_fb_scanline * y + x * 4) = color;
}
void rect(u32 x, u32 y, u32 w, u32 h, u32 color)
{
if (!g_fb_ptr) [[unlikely]]
return;
for (u32 i = y; i < (y + h); i++)
{
u32* addr = (u32*)(g_fb_ptr + (g_fb_scanline * i) + (x * sizeof(u32)));
for (u32* it = addr; it < (addr + w); it++) *it = color;
}
}
void rect(u32 x, u32 y, u32 w, u32 h, u32* colors)
{
if (!g_fb_ptr) [[unlikely]]
return;
u32 j = 0;
for (u32 i = y; i < (y + h); i++)
{
u32* addr = (u32*)(g_fb_ptr + (g_fb_scanline * i) + (x * sizeof(u32)));
for (u32* it = addr; it < (addr + w); it++, j++) *it = colors[j];
}
}
u8* ptr()
{
return g_fb_ptr;
}
u32 size()
{
return g_fb_size;
}
u32 width()
{
return g_fb_width;
}
u32 height()
{
return g_fb_height;
}
u32 scanline()
{
return g_fb_scanline;
}
}