mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-08-13 15:24:19 +00:00
.github
.vscode
Architecture
Core
Execute
FileSystem
Files
GUI
GUITools.cpp
GraphicalUserInterface.cpp
Icons.cpp
WidgetEvents.cpp
Widgets.cpp
Window.cpp
WindowEvents.cpp
icons.hpp
Library
Network
Profiling
Recovery
SystemCalls
Tasking
Tests
include
.gitignore
DAPI.hpp
Doxyfile
Fex.hpp
KConfig.cpp
KThread.cpp
Kernel.cpp
LICENSE
Makefile
README.md
dump.sh
kernel.h
syscalls.h
155 lines
5.4 KiB
C++
155 lines
5.4 KiB
C++
#include <gui.hpp>
|
|
|
|
#include "../kernel.h"
|
|
|
|
namespace GraphicalUserInterface
|
|
{
|
|
inline void InlineSetPixel(ScreenBitmap *Bitmap, long X, long Y, uint32_t Color)
|
|
{
|
|
if (unlikely(!Bitmap))
|
|
return;
|
|
|
|
if (unlikely(!Bitmap->Data))
|
|
return;
|
|
|
|
if (unlikely(X < 0 || Y < 0 || X >= Bitmap->Width || Y >= Bitmap->Height))
|
|
return;
|
|
|
|
uint32_t *Pixel = (uint32_t *)((uintptr_t)Bitmap->Data + (Y * Bitmap->Width + X) * (Bitmap->BitsPerPixel / 8));
|
|
*Pixel = Color;
|
|
// Bitmap->Data[Y * Bitmap->Width + X] = Color;
|
|
}
|
|
|
|
void SetPixel(ScreenBitmap *Bitmap, long X, long Y, uint32_t Color)
|
|
{
|
|
InlineSetPixel(Bitmap, X, Y, Color);
|
|
}
|
|
|
|
uint32_t GetPixel(ScreenBitmap *Bitmap, long X, long Y)
|
|
{
|
|
if (unlikely(!Bitmap))
|
|
return 0;
|
|
|
|
if (unlikely(!Bitmap->Data))
|
|
return 0;
|
|
|
|
if (unlikely(X < 0 || Y < 0 || X >= Bitmap->Width || Y >= Bitmap->Height))
|
|
return 0;
|
|
|
|
uint32_t *Pixel = (uint32_t *)((uintptr_t)Bitmap->Data + (Y * Bitmap->Width + X) * (Bitmap->BitsPerPixel / 8));
|
|
return *Pixel;
|
|
}
|
|
|
|
void DrawOverBitmap(ScreenBitmap *DestinationBitmap,
|
|
ScreenBitmap *SourceBitmap,
|
|
long Top,
|
|
long Left, bool IgnoreZero)
|
|
{
|
|
for (uint32_t i = 0; i < SourceBitmap->Width; i++)
|
|
for (uint32_t j = 0; j < SourceBitmap->Height; j++)
|
|
{
|
|
uint32_t *Pixel = (uint32_t *)((uintptr_t)SourceBitmap->Data + (j * SourceBitmap->Width + i) * (SourceBitmap->BitsPerPixel / 8));
|
|
if (IgnoreZero && (*Pixel != 0x000000))
|
|
InlineSetPixel(DestinationBitmap, Left + i, Top + j, *Pixel);
|
|
}
|
|
}
|
|
|
|
void PutRect(ScreenBitmap *Bitmap, Rect rect, uint32_t Color)
|
|
{
|
|
for (uint32_t i = 0; i < rect.Width; i++)
|
|
for (uint32_t j = 0; j < rect.Height; j++)
|
|
InlineSetPixel(Bitmap, rect.Left + i, rect.Top + j, Color);
|
|
}
|
|
|
|
void PutBorder(ScreenBitmap *Bitmap, Rect rect, uint32_t Color)
|
|
{
|
|
for (uint32_t i = 0; i < rect.Width; i++)
|
|
{
|
|
InlineSetPixel(Bitmap, rect.Left + i, rect.Top, Color);
|
|
InlineSetPixel(Bitmap, rect.Left + i, rect.Top + rect.Height - 1, Color);
|
|
}
|
|
for (uint32_t i = 0; i < rect.Height; i++)
|
|
{
|
|
InlineSetPixel(Bitmap, rect.Left, rect.Top + i, Color);
|
|
InlineSetPixel(Bitmap, rect.Left + rect.Width - 1, rect.Top + i, Color);
|
|
}
|
|
}
|
|
|
|
uint32_t BlendColors(uint32_t c1, uint32_t c2, float t)
|
|
{
|
|
uint8_t r1 = (c1 >> 16) & 0xFF;
|
|
uint8_t g1 = (c1 >> 8) & 0xFF;
|
|
uint8_t b1 = c1 & 0xFF;
|
|
uint8_t r2 = (c2 >> 16) & 0xFF;
|
|
uint8_t g2 = (c2 >> 8) & 0xFF;
|
|
uint8_t b2 = c2 & 0xFF;
|
|
|
|
uint8_t r = (uint8_t)(r1 + t * (r2 - r1));
|
|
uint8_t g = (uint8_t)(g1 + t * (g2 - g1));
|
|
uint8_t b = (uint8_t)(b1 + t * (b2 - b1));
|
|
|
|
return (r << 16) | (g << 8) | b;
|
|
}
|
|
|
|
void PutBorderWithShadow(ScreenBitmap *Bitmap, Rect rect, uint32_t Color)
|
|
{
|
|
}
|
|
|
|
#define SHADOW_SIZE 12
|
|
|
|
void DrawShadow(ScreenBitmap *Bitmap, Rect rect)
|
|
{
|
|
}
|
|
|
|
void PaintChar(Video::Font *font, ScreenBitmap *Bitmap, char c, uint32_t Color, long *CharCursorX, long *CharCursorY)
|
|
{
|
|
switch (font->GetInfo().Type)
|
|
{
|
|
case Video::FontType::PCScreenFont1:
|
|
{
|
|
uint32_t *PixelPtr = (uint32_t *)Bitmap->Data;
|
|
char *FontPtr = (char *)font->GetInfo().PSF1Font->GlyphBuffer + (c * font->GetInfo().PSF1Font->Header->charsize);
|
|
for (int64_t Y = *CharCursorY; Y < *CharCursorY + 16; Y++)
|
|
{
|
|
for (int64_t X = *CharCursorX; X < *CharCursorX + 8; X++)
|
|
if ((*FontPtr & (0b10000000 >> (X - *CharCursorX))) > 0)
|
|
InlineSetPixel(Bitmap, X, Y, Color);
|
|
FontPtr++;
|
|
}
|
|
*CharCursorX += 8;
|
|
break;
|
|
}
|
|
case Video::FontType::PCScreenFont2:
|
|
{
|
|
// if (font->PSF2Font->GlyphBuffer == (uint16_t *)0x01) // HAS UNICODE TABLE
|
|
// Char = font->PSF2Font->GlyphBuffer[Char];
|
|
int BytesPerLine = (font->GetInfo().PSF2Font->Header->width + 7) / 8;
|
|
char *FontPtr = (char *)font->GetInfo().StartAddress +
|
|
font->GetInfo().PSF2Font->Header->headersize +
|
|
(c > 0 && (unsigned char)c < font->GetInfo().PSF2Font->Header->length ? c : 0) *
|
|
font->GetInfo().PSF2Font->Header->charsize;
|
|
|
|
uint32_t fonthdrWidth = font->GetInfo().PSF2Font->Header->width;
|
|
uint32_t fonthdrHeight = font->GetInfo().PSF2Font->Header->height;
|
|
|
|
for (int64_t Y = *CharCursorY; Y < *CharCursorY + fonthdrHeight; Y++)
|
|
{
|
|
for (int64_t X = *CharCursorX; X < *CharCursorX + fonthdrWidth; X++)
|
|
if ((*FontPtr & (0b10000000 >> (X - *CharCursorX))) > 0)
|
|
InlineSetPixel(Bitmap, X, Y, Color);
|
|
FontPtr += BytesPerLine;
|
|
}
|
|
*CharCursorX += fonthdrWidth;
|
|
break;
|
|
}
|
|
default:
|
|
warn("Unsupported font type");
|
|
break;
|
|
}
|
|
}
|
|
|
|
void DrawString(ScreenBitmap *Bitmap, Rect rect, const char *Text, uint32_t Color)
|
|
{
|
|
}
|
|
}
|