2026-01-28 09:13:12 +11:00
|
|
|
#include "BasicRenderer.h"
|
2026-01-29 08:36:04 +11:00
|
|
|
|
|
|
|
|
BasicRenderer* GlobalRenderer;
|
2026-01-28 09:13:12 +11:00
|
|
|
|
|
|
|
|
BasicRenderer::BasicRenderer(Framebuffer* framebuffer, PSF1_FONT* psf1_Font) {
|
|
|
|
|
targetFramebuffer = framebuffer;
|
|
|
|
|
PSF1_Font = psf1_Font;
|
2026-01-28 19:34:59 +11:00
|
|
|
Colour = 0xFFFFFFFF;
|
2026-01-28 09:13:12 +11:00
|
|
|
cursorPosition = {0,0};
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-28 19:34:59 +11:00
|
|
|
void BasicRenderer::PutChar(char chr, unsigned int xOff, unsigned int yOff) {
|
2026-01-28 09:13:12 +11:00
|
|
|
unsigned int* pixPtr = (unsigned int*)targetFramebuffer->BaseAddress;
|
|
|
|
|
char* fontPtr = (char*)PSF1_Font->glyphBuffer + (chr * PSF1_Font->psf1_Header->charsize);
|
|
|
|
|
for (unsigned long y = yOff; y < yOff + 18; y++) {
|
|
|
|
|
for (unsigned long x = xOff; x < xOff+8; x++) {
|
|
|
|
|
|
|
|
|
|
if ((*fontPtr & (0b10000000 >> (x - xOff))) > 0) {
|
2026-01-28 19:34:59 +11:00
|
|
|
*(unsigned int*)(pixPtr + x + (y * targetFramebuffer->PixelsPerScanline)) = Colour;
|
2026-01-28 09:13:12 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fontPtr++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-28 19:34:59 +11:00
|
|
|
void BasicRenderer::Print(const char* str) {
|
2026-01-28 09:13:12 +11:00
|
|
|
unsigned int x = 0;
|
|
|
|
|
char* chr = (char*)str;
|
|
|
|
|
|
|
|
|
|
while (*chr != 0) {
|
2026-01-28 19:34:59 +11:00
|
|
|
PutChar(*chr, cursorPosition.x, cursorPosition.y);
|
2026-01-28 09:13:12 +11:00
|
|
|
cursorPosition.x+=8;
|
|
|
|
|
|
|
|
|
|
if (cursorPosition.x + 8 > targetFramebuffer->Width) {
|
|
|
|
|
cursorPosition.x = 0;
|
|
|
|
|
cursorPosition.y += 18;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
chr++;
|
|
|
|
|
}
|
2026-01-29 09:02:15 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BasicRenderer::Clear(uint32_t colour) {
|
|
|
|
|
uint64_t fbBase = (uint64_t)targetFramebuffer->BaseAddress;
|
|
|
|
|
uint64_t bytesPerScanline = targetFramebuffer->PixelsPerScanline * 4;
|
|
|
|
|
uint64_t fbHeight = targetFramebuffer->Height;
|
|
|
|
|
uint64_t fbSize = targetFramebuffer->BufferSize;
|
|
|
|
|
|
|
|
|
|
for (int verticalScanline = 0; verticalScanline < fbHeight; verticalScanline ++){
|
|
|
|
|
uint64_t pixPtrBase = fbBase + (bytesPerScanline * verticalScanline);
|
|
|
|
|
for (uint32_t* pixPtr = (uint32_t*)pixPtrBase; pixPtr < (uint32_t*)(pixPtrBase + bytesPerScanline); pixPtr ++){
|
|
|
|
|
*pixPtr = colour;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BasicRenderer::Next() {
|
|
|
|
|
cursorPosition.x = 0;
|
|
|
|
|
cursorPosition.y += 16;
|
2026-01-28 09:13:12 +11:00
|
|
|
}
|