mouse cleans up after itself now

This commit is contained in:
2026-01-29 14:34:19 +11:00
parent df3f9478e8
commit 46e806795c
10 changed files with 33 additions and 0 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -57,6 +57,31 @@ void BasicRenderer::PutPixel(uint32_t x, uint32_t y, uint32_t colour) {
} }
uint32_t BasicRenderer::GetPixel(uint32_t x, uint32_t y){
return *(uint32_t*)((uint64_t)targetFramebuffer->BaseAddress + (x*4) + (y * targetFramebuffer->PixelsPerScanline * 4));
}
void BasicRenderer::ClearMouseCursor(uint8_t* mouseCursor, Point position) {
int xMax = 16;
int yMax = 19;
int diffX = targetFramebuffer->Width - position.x;
int diffY = targetFramebuffer->Height - position.y;
if (diffX < 16) xMax = diffX;
if (diffY < 19) yMax = diffY;
for (int y = 0; y < yMax; y++) {
for (int x = 0; x < xMax; x++) {
int bit = y * 16 + x;
int byte = bit / 8;
if (mouseCursor[byte] & (0b10000000 >> (x % 8))) {
PutPixel(position.x + x, position.y + y, mouseCursorBuffer[x + y*16]);
}
}
}
}
void BasicRenderer::DrawOverlayMouseCursor(uint8_t* mouseCursor, Point position, uint32_t colour) { void BasicRenderer::DrawOverlayMouseCursor(uint8_t* mouseCursor, Point position, uint32_t colour) {
int xMax = 16; int xMax = 16;
int yMax = 19; int yMax = 19;
@@ -72,6 +97,7 @@ void BasicRenderer::DrawOverlayMouseCursor(uint8_t* mouseCursor, Point position,
int byte = bit / 8; int byte = bit / 8;
if (mouseCursor[byte] & (0b10000000 >> (x % 8))) { if (mouseCursor[byte] & (0b10000000 >> (x % 8))) {
mouseCursorBuffer[x + y*16] = GetPixel(position.x + x, position.y + y);
PutPixel(position.x + x, position.y + y, colour); PutPixel(position.x + x, position.y + y, colour);
} }
} }

View File

@@ -10,12 +10,15 @@ class BasicRenderer {
Point cursorPosition; Point cursorPosition;
Framebuffer* targetFramebuffer; Framebuffer* targetFramebuffer;
PSF1_FONT* PSF1_Font; PSF1_FONT* PSF1_Font;
uint32_t mouseCursorBuffer[16*19];
unsigned int Colour; unsigned int Colour;
unsigned int ClearColour; unsigned int ClearColour;
void Print(const char* str); void Print(const char* str);
void PutChar(char chr, unsigned int xOff, unsigned int yOff); void PutChar(char chr, unsigned int xOff, unsigned int yOff);
void PutChar(char chr); void PutChar(char chr);
void PutPixel(uint32_t x, uint32_t y, uint32_t colour); void PutPixel(uint32_t x, uint32_t y, uint32_t colour);
uint32_t GetPixel(uint32_t x, uint32_t y);
void ClearMouseCursor(uint8_t* mouseCursor, Point position);
void ClearChar(); void ClearChar();
void Clear(); void Clear();
void Next(); void Next();

View File

@@ -59,6 +59,7 @@ uint8_t mousePacket[4];
bool mousePacketReady = false; bool mousePacketReady = false;
Point mousePosition; Point mousePosition;
Point mousePositionOld;
void HandlePS2Mouse(uint8_t data) { void HandlePS2Mouse(uint8_t data) {
switch (mouseCycle) { switch (mouseCycle) {
@@ -137,7 +138,10 @@ void ProcessMousePacket() {
if (mousePosition.y < 0) mousePosition.y = 0; if (mousePosition.y < 0) mousePosition.y = 0;
if (mousePosition.y > GlobalRenderer->targetFramebuffer->Height-1) mousePosition.y = GlobalRenderer->targetFramebuffer->Height; if (mousePosition.y > GlobalRenderer->targetFramebuffer->Height-1) mousePosition.y = GlobalRenderer->targetFramebuffer->Height;
GlobalRenderer->ClearMouseCursor(MousePointer, mousePositionOld);
GlobalRenderer->DrawOverlayMouseCursor(MousePointer, mousePosition, 0xFFFFFFFF); GlobalRenderer->DrawOverlayMouseCursor(MousePointer, mousePosition, 0xFFFFFFFF);
mousePositionOld = mousePosition;
} }
void InitPS2Mouse() { void InitPS2Mouse() {