From c5b4c98fadd89fd114520e201e34a58a78025344 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 18 Apr 2025 15:09:12 +0200 Subject: dev, fb: did some cleanup on the graphics stack. Signed-off-by: Amlal El Mahrouss --- dev/modules/CoreGfx/CoreGfx.h | 32 ++++++++--------- dev/modules/CoreGfx/CoreWindow.h | 75 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 16 deletions(-) create mode 100644 dev/modules/CoreGfx/CoreWindow.h (limited to 'dev/modules') diff --git a/dev/modules/CoreGfx/CoreGfx.h b/dev/modules/CoreGfx/CoreGfx.h index 74326f16..6df2329b 100644 --- a/dev/modules/CoreGfx/CoreGfx.h +++ b/dev/modules/CoreGfx/CoreGfx.h @@ -8,20 +8,20 @@ #include -#define fb_init() Kernel::SizeT kCGCursor = 0 +#define fb_init() Kernel::UInt32 kCGCursor = 0 #define fb_color(R, G, B) RGB(R, G, B) -#define fb_get_clear_clr() fb_color(0x20, 0x20, 0x20) +#define fb_get_clear_clr() RGB(0x20, 0x20, 0x20) #define fb_clear() kCGCursor = 0UL #ifdef __NE_AMD64__ /// @brief Performs Alpha drawing on the framebuffer. #define FBDrawBitMapInRegionA(reg_ptr, height, width, base_x, base_y) \ - for (Kernel::SizeT i = base_x; i < (width + base_x); ++i) \ + for (Kernel::UInt32 i = base_x; i < (width + base_x); ++i) \ { \ - for (Kernel::SizeT u = base_y; u < (height + base_y); ++u) \ + for (Kernel::UInt32 u = base_y; u < (height + base_y); ++u) \ { \ *(((Kernel::UInt32*)(kHandoverHeader->f_GOP.f_The + \ 4 * kHandoverHeader->f_GOP.f_PixelPerLine * \ @@ -34,9 +34,9 @@ /// @brief Performs drawing on the framebuffer. #define FBDrawBitMapInRegion(reg_ptr, height, width, base_x, base_y) \ - for (Kernel::SizeT i = base_x; i < (width + base_x); ++i) \ + for (Kernel::UInt32 i = base_x; i < (width + base_x); ++i) \ { \ - for (Kernel::SizeT u = base_y; u < (height + base_y); ++u) \ + for (Kernel::UInt32 u = base_y; u < (height + base_y); ++u) \ { \ *(((Kernel::UInt32*)(kHandoverHeader->f_GOP.f_The + \ 4 * kHandoverHeader->f_GOP.f_PixelPerLine * \ @@ -48,9 +48,9 @@ } #define FBDrawBitMapInRegionToRgn(_Rgn, reg_ptr, height, width, base_x, base_y) \ - for (Kernel::SizeT i = base_x; i < (width + base_x); ++i) \ + for (Kernel::UInt32 i = base_x; i < (width + base_x); ++i) \ { \ - for (Kernel::SizeT u = base_y; u < (height + base_y); ++u) \ + for (Kernel::UInt32 u = base_y; u < (height + base_y); ++u) \ { \ *(((Kernel::UInt32*)(_Rgn + \ 4 * kHandoverHeader->f_GOP.f_PixelPerLine * \ @@ -63,9 +63,9 @@ /// @brief Cleans a resource. #define FBClearRegion(height, width, base_x, base_y) \ - for (Kernel::SizeT i = base_x; i < (width + base_x); ++i) \ + for (Kernel::UInt32 i = base_x; i < (width + base_x); ++i) \ { \ - for (Kernel::SizeT u = base_y; u < (height + base_y); ++u) \ + for (Kernel::UInt32 u = base_y; u < (height + base_y); ++u) \ { \ *(((volatile Kernel::UInt32*)(kHandoverHeader->f_GOP.f_The + \ 4 * kHandoverHeader->f_GOP.f_PixelPerLine * \ @@ -76,9 +76,9 @@ /// @brief Draws inside a zone. #define FBDrawInRegion(clr, height, width, base_x, base_y) \ - for (Kernel::SizeT x_base = base_x; x_base < (width + base_x); ++x_base) \ + for (Kernel::UInt32 x_base = base_x; x_base < (width + base_x); ++x_base) \ { \ - for (Kernel::SizeT y_base = base_y; y_base < (height + base_y); ++y_base) \ + for (Kernel::UInt32 y_base = base_y; y_base < (height + base_y); ++y_base) \ { \ *(((volatile Kernel::UInt32*)(kHandoverHeader->f_GOP.f_The + \ 4 * kHandoverHeader->f_GOP.f_PixelPerLine * \ @@ -89,9 +89,9 @@ /// @brief Draws inside a zone. #define FBDrawInRegionToRgn(_Rgn, clr, height, width, base_x, base_y) \ - for (Kernel::SizeT x_base = base_x; x_base < (width + base_x); ++x_base) \ + for (Kernel::UInt32 x_base = base_x; x_base < (width + base_x); ++x_base) \ { \ - for (Kernel::SizeT y_base = base_y; y_base < (height + base_y); ++y_base) \ + for (Kernel::UInt32 y_base = base_y; y_base < (height + base_y); ++y_base) \ { \ *(((volatile Kernel::UInt32*)(_Rgn + \ 4 * kHandoverHeader->f_GOP.f_PixelPerLine * \ @@ -102,9 +102,9 @@ } #define FBDrawInRegionA(clr, height, width, base_x, base_y) \ - for (Kernel::SizeT x_base = base_x; x_base < (width + base_x); ++x_base) \ + for (Kernel::UInt32 x_base = base_x; x_base < (width + base_x); ++x_base) \ { \ - for (Kernel::SizeT y_base = base_y; y_base < (height + base_y); ++y_base) \ + for (Kernel::UInt32 y_base = base_y; y_base < (height + base_y); ++y_base) \ { \ *(((volatile Kernel::UInt32*)(kHandoverHeader->f_GOP.f_The + \ 4 * kHandoverHeader->f_GOP.f_PixelPerLine * \ diff --git a/dev/modules/CoreGfx/CoreWindow.h b/dev/modules/CoreGfx/CoreWindow.h new file mode 100644 index 00000000..f925eecd --- /dev/null +++ b/dev/modules/CoreGfx/CoreWindow.h @@ -0,0 +1,75 @@ +#pragma once + +#include +#include + +namespace UI +{ + struct UIRect final + { + Kernel::UInt32 x, y, height, width; + }; + + inline void draw_beveled_rect(const UIRect& rect, Kernel::UInt32 topLeftColor, Kernel::UInt32 bottomRightColor) + { + // Top edge + FBDrawInRegion(topLeftColor, rect.height, 1, rect.y, rect.x); + // Left edge + FBDrawInRegion(topLeftColor, 1, rect.width, rect.y, rect.x); + + // Bottom edge + FBDrawInRegion(bottomRightColor, rect.height, 1, rect.y + rect.width - 1, rect.x); + // Right edge + FBDrawInRegion(bottomRightColor, 1, rect.width, rect.y, rect.x + rect.height - 1); + } + + inline void draw_close_button(Kernel::UInt32 x, Kernel::UInt32 y) + { + const Kernel::UInt32 border = fb_color(0x00, 0x00, 0x00); + const Kernel::UInt32 fill = fb_color(0xD0, 0xD0, 0xD0); + + // A simple square for close button, 10x10 px + FBDrawInRegion(border, 10, 10, y, x); // Outer border + FBDrawInRegion(fill, 8, 8, y + 1, x + 1); // Inner fill + } + + inline void draw_title_bar(const UIRect& rect, const char* title) + { + const Kernel::Int32 barHeight = 22; + + Kernel::UInt32 lightEdge = fb_color(0xF0, 0xF0, 0xF0); // Light gray top + Kernel::UInt32 darkEdge = fb_color(0x40, 0x40, 0x40); // Shadow + Kernel::UInt32 fillColor = fb_color(0xA0, 0xA0, 0xA0); // Mid-gray + + // Title bar fill + FBDrawInRegion(fillColor, rect.height - 2, barHeight, rect.y + 1, rect.x + 1); + + // Beveled edges (top, left bright; right, bottom dark) + UIRect bevel = {rect.x + 1, rect.y + 1, rect.height - 2, barHeight}; + draw_beveled_rect(bevel, lightEdge, darkEdge); + + // Title text + fb_render_string(title, rect.y + 8, rect.x + 24, fb_color(0x00, 0x00, 0x00)); + + // Close button + draw_close_button(rect.x + 6, rect.y + 6); + } + + inline void draw_window(const UIRect& rect, const Char* title) + { + Kernel::UInt32 windowFill = fb_color(0xC0, 0xC0, 0xC0); // Body color + Kernel::UInt32 borderDark = fb_color(0x60, 0x60, 0x60); + Kernel::UInt32 borderHighlight = fb_color(0xE0, 0xE0, 0xE0); + + // Fill window body (excluding title bar) + const Kernel::Int32 titleBarHeight = 22; + + FBDrawInRegion(windowFill, rect.height - 2, rect.width - titleBarHeight - 1, rect.y + titleBarHeight + 1, rect.x + 1); + + // Full window bevel border + draw_beveled_rect(rect, borderHighlight, borderDark); + + // Title bar + draw_title_bar(rect, title); + } +} \ No newline at end of file -- cgit v1.2.3 From b69c498953dc47900e6ccdd0f501727480836f23 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 18 Apr 2025 18:24:44 +0200 Subject: kernel, IMP: GfxKit: GraphicsKit. kernel, IMP: StorageKit: Remove usage of cleanup method on AHCI, DMA, and PIO. Signed-off-by: Amlal El Mahrouss --- dev/kernel/GfxKit/Gfx.h | 51 ++++++++++++++++++++++ dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc | 3 +- dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc | 3 +- dev/kernel/StorageKit/AHCI.h | 7 +-- dev/kernel/StorageKit/ATA.h | 4 +- dev/kernel/StorageKit/PRDT.h | 4 +- dev/kernel/amd64-ci.make | 2 +- dev/kernel/amd64-desktop.make | 2 +- dev/kernel/src/Gfx/FBDeviceInterface.cc | 58 +++++++++++++++++++++++++ dev/kernel/src/Storage/AHCIDeviceInterface.cc | 13 ++---- dev/kernel/src/Storage/ATADeviceInterface.cc | 12 ++--- dev/modules/CoreGfx/CoreWindow.h | 10 +++++ 12 files changed, 136 insertions(+), 33 deletions(-) create mode 100644 dev/kernel/GfxKit/Gfx.h create mode 100644 dev/kernel/src/Gfx/FBDeviceInterface.cc (limited to 'dev/modules') diff --git a/dev/kernel/GfxKit/Gfx.h b/dev/kernel/GfxKit/Gfx.h new file mode 100644 index 00000000..ce5751dc --- /dev/null +++ b/dev/kernel/GfxKit/Gfx.h @@ -0,0 +1,51 @@ +/* ------------------------------------------- + + Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include +#include + +namespace Kernel +{ + class FBDeviceInterface; + struct FBDevicePacket; + + /// @brief Framebuffer device interface packet. + /// @details This structure is used to send and receive data from the framebuffer device. + /// @note The structure is packed to ensure that the data is aligned correctly for the device. + struct PACKED FBDevicePacket final + { + UInt32 fX; + UInt32 fY; + UInt32 fWidth; + UInt32 fHeight; + UInt32 fColor; + UInt32 fFlags; + }; + + /// @brief Framebuffer device interface. + /// @details This class is used to send and receive data from the framebuffer device. + /// @note The class is derived from the IDeviceObject class. + class FBDeviceInterface NE_DEVICE + { + public: + explicit FBDeviceInterface(void (*out)(IDeviceObject* self, FBDevicePacket* out), + void (*in)(IDeviceObject* self, FBDevicePacket* in)); + + virtual ~FBDeviceInterface() override; + + public: + FBDeviceInterface& operator=(const FBDeviceInterface&) = default; + FBDeviceInterface(const FBDeviceInterface&) = default; + + const Char* Name() const override; + + public: + FBDeviceInterface& operator<<(FBDevicePacket* Data) override; + FBDeviceInterface& operator>>(FBDevicePacket* Data) override; + }; +} // namespace Kernel diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc index 9c8f95bc..08fd02ab 100644 --- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc @@ -479,8 +479,7 @@ namespace Kernel return ErrorOr(kErrorDisk); AHCIDeviceInterface device(Detail::sk_io_read_ahci, - Detail::sk_io_write_ahci, - nullptr); + Detail::sk_io_write_ahci); device.SetPortsImplemented(kSATAPortsImplemented); device.SetIndex(drv_index); diff --git a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc index cc8c92d8..257dd5c8 100644 --- a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc @@ -252,8 +252,7 @@ namespace Kernel { /// here we don't check if we probed ATA, since we'd need to grab IO after that. ATADeviceInterface device(Detail::sk_io_read_pio, - Detail::sk_io_write_pio, - nullptr); + Detail::sk_io_write_pio); device.SetIndex(drv_index); diff --git a/dev/kernel/StorageKit/AHCI.h b/dev/kernel/StorageKit/AHCI.h index 7e2eaf68..68a42c46 100644 --- a/dev/kernel/StorageKit/AHCI.h +++ b/dev/kernel/StorageKit/AHCI.h @@ -12,12 +12,14 @@ namespace Kernel { + /// @brief AHCIDeviceInterface class + /// @details This class is used to send and receive data from the AHCI device. + /// @note The class is derived from the IDeviceObject class. class AHCIDeviceInterface NE_DEVICE { public: explicit AHCIDeviceInterface(void (*out)(IDeviceObject* self, MountpointInterface* out), - void (*in)(IDeviceObject* self, MountpointInterface* in), - void (*cleanup)(void)); + void (*in)(IDeviceObject* self, MountpointInterface* in)); virtual ~AHCIDeviceInterface() override; @@ -40,7 +42,6 @@ namespace Kernel AHCIDeviceInterface& operator>>(MountpointInterface* Data) override; private: - Void (*fCleanup)(Void) = {nullptr}; UInt16 fPortsImplemented{0U}; UInt32 fDriveIndex{0U}; }; diff --git a/dev/kernel/StorageKit/ATA.h b/dev/kernel/StorageKit/ATA.h index 917fa12b..04cf88d7 100644 --- a/dev/kernel/StorageKit/ATA.h +++ b/dev/kernel/StorageKit/ATA.h @@ -18,8 +18,7 @@ namespace Kernel { public: explicit ATADeviceInterface(void (*Out)(IDeviceObject*, MountpointInterface* outpacket), - void (*In)(IDeviceObject*, MountpointInterface* inpacket), - void (*Cleanup)(void)); + void (*In)(IDeviceObject*, MountpointInterface* inpacket)); virtual ~ATADeviceInterface(); @@ -43,7 +42,6 @@ namespace Kernel Void SetIndex(const UInt32& drv); private: - void (*fCleanup)(void) = {nullptr}; UInt32 fDriveIndex{0U}; UInt16 fIO, fMaster{0U}; }; diff --git a/dev/kernel/StorageKit/PRDT.h b/dev/kernel/StorageKit/PRDT.h index 729b6e96..dde9c208 100644 --- a/dev/kernel/StorageKit/PRDT.h +++ b/dev/kernel/StorageKit/PRDT.h @@ -15,7 +15,7 @@ namespace Kernel { /// @brief Tranfer information about PRD. - enum kPRDTTransfer + enum { kPRDTTransferInProgress, kPRDTTransferIsDone, @@ -23,7 +23,7 @@ namespace Kernel }; /// @brief Physical Region Descriptor Table. - struct PRDT + struct PRDT final { UInt32 fPhysAddress; UInt32 fSectorCount; diff --git a/dev/kernel/amd64-ci.make b/dev/kernel/amd64-ci.make index e9a4d4b0..7748fc7c 100644 --- a/dev/kernel/amd64-ci.make +++ b/dev/kernel/amd64-ci.make @@ -48,7 +48,7 @@ WINDRES=x86_64-w64-mingw32-windres .PHONY: nekernel-amd64-epm nekernel-amd64-epm: clean $(WINDRES) kernel_rsrc.rsrc -O coff -o kernel_rsrc.obj - $(CXX) $(CCFLAGS) $(DISK_DRV) $(DEBUG_MACRO) $(wildcard src/*.cc) $(wildcard HALKit/AMD64/PCI/*.cc) $(wildcard src/Network/*.cc) $(wildcard src/Storage/*.cc) $(wildcard src/FS/*.cc) $(wildcard HALKit/AMD64/Storage/*.cc) $(wildcard HALKit/AMD64/*.cc) $(wildcard src/Swap/*.cc) $(wildcard HALKit/AMD64/*.s) + $(CXX) $(CCFLAGS) $(DISK_DRV) $(DEBUG_MACRO) $(wildcard src/*.cc) $(wildcard src/Gfx/*.cc) $(wildcard HALKit/AMD64/PCI/*.cc) $(wildcard src/Network/*.cc) $(wildcard src/Storage/*.cc) $(wildcard src/FS/*.cc) $(wildcard HALKit/AMD64/Storage/*.cc) $(wildcard HALKit/AMD64/*.cc) $(wildcard src/Swap/*.cc) $(wildcard HALKit/AMD64/*.s) $(ASM) $(ASMFLAGS) HALKit/AMD64/HalInterruptAPI.asm $(ASM) $(ASMFLAGS) HALKit/AMD64/HalCommonAPI.asm $(ASM) $(ASMFLAGS) HALKit/AMD64/HalBootHeader.asm diff --git a/dev/kernel/amd64-desktop.make b/dev/kernel/amd64-desktop.make index 02b0a3b4..9993796c 100644 --- a/dev/kernel/amd64-desktop.make +++ b/dev/kernel/amd64-desktop.make @@ -50,7 +50,7 @@ WINDRES=x86_64-w64-mingw32-windres .PHONY: nekernel-amd64-epm nekernel-amd64-epm: clean $(WINDRES) kernel_rsrc.rsrc -O coff -o kernel_rsrc.obj - $(CXX) $(CCFLAGS) $(DISK_DRV) $(DEBUG_MACRO) $(wildcard src/*.cc) $(wildcard HALKit/AMD64/PCI/*.cc) $(wildcard src/Network/*.cc) $(wildcard src/Storage/*.cc) $(wildcard src/FS/*.cc) $(wildcard HALKit/AMD64/Storage/*.cc) $(wildcard HALKit/AMD64/*.cc) $(wildcard src/Swap/*.cc) $(wildcard HALKit/AMD64/*.s) + $(CXX) $(CCFLAGS) $(DISK_DRV) $(DEBUG_MACRO) $(wildcard src/*.cc) $(wildcard src/Gfx/*.cc) $(wildcard HALKit/AMD64/PCI/*.cc) $(wildcard src/Network/*.cc) $(wildcard src/Storage/*.cc) $(wildcard src/FS/*.cc) $(wildcard HALKit/AMD64/Storage/*.cc) $(wildcard HALKit/AMD64/*.cc) $(wildcard src/Swap/*.cc) $(wildcard HALKit/AMD64/*.s) $(ASM) $(ASMFLAGS) HALKit/AMD64/HalInterruptAPI.asm $(ASM) $(ASMFLAGS) HALKit/AMD64/HalCommonAPI.asm $(ASM) $(ASMFLAGS) HALKit/AMD64/HalBootHeader.asm diff --git a/dev/kernel/src/Gfx/FBDeviceInterface.cc b/dev/kernel/src/Gfx/FBDeviceInterface.cc new file mode 100644 index 00000000..a9b2be29 --- /dev/null +++ b/dev/kernel/src/Gfx/FBDeviceInterface.cc @@ -0,0 +1,58 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#include + +using namespace Kernel; + +/// @brief Class constructor +/// @param Out Drive output +/// @param In Drive input +/// @param Cleanup Drive cleanup. +FBDeviceInterface::FBDeviceInterface(void (*out)(IDeviceObject* self, FBDevicePacket* outpacket), + void (*in)(IDeviceObject* self, FBDevicePacket* inpacket)) + : IDeviceObject(out, in) +{ +} + +/// @brief Class desctructor +FBDeviceInterface::~FBDeviceInterface() = default; + +/// @brief Output operator. +/// @param mnt the disk mountpoint. +/// @return the class itself after operation. +FBDeviceInterface& FBDeviceInterface::operator<<(FBDevicePacket* pckt) +{ + if (!pckt) + return *this; + + FBDrawInRegion(pckt->fColor, pckt->fHeight, pckt->fWidth, pckt->fY, pckt->fX); + + return *this; +} + +/// @brief Input operator. +/// @param mnt the disk mountpoint. +/// @return the class itself after operation. +FBDeviceInterface& FBDeviceInterface::operator>>(FBDevicePacket* pckt) +{ + if (!pckt) + return *this; + + pckt->fColor = *(((Kernel::UInt32*)(kHandoverHeader->f_GOP.f_The + + 4 * kHandoverHeader->f_GOP.f_PixelPerLine * + pckt->fX + + 4 * pckt->fY))); + + return *this; +} + +/// @brief Returns the name of the device interface. +/// @return it's name as a string. +const Char* FBDeviceInterface::Name() const +{ + return "/dev/fb{}"; +} \ No newline at end of file diff --git a/dev/kernel/src/Storage/AHCIDeviceInterface.cc b/dev/kernel/src/Storage/AHCIDeviceInterface.cc index 1798e9a9..c5f43bf6 100644 --- a/dev/kernel/src/Storage/AHCIDeviceInterface.cc +++ b/dev/kernel/src/Storage/AHCIDeviceInterface.cc @@ -13,20 +13,13 @@ using namespace Kernel; /// @param In Drive input /// @param Cleanup Drive cleanup. AHCIDeviceInterface::AHCIDeviceInterface(void (*out)(IDeviceObject* self, MountpointInterface* outpacket), - void (*in)(IDeviceObject* self, MountpointInterface* inpacket), - void (*cleanup)(void)) - : IDeviceObject(out, in), fCleanup(cleanup) + void (*in)(IDeviceObject* self, MountpointInterface* inpacket)) + : IDeviceObject(out, in) { } /// @brief Class desctructor -AHCIDeviceInterface::~AHCIDeviceInterface() -{ - MUST_PASS(fCleanup); - - if (fCleanup) - fCleanup(); -} +AHCIDeviceInterface::~AHCIDeviceInterface() = default; /// @brief Returns the name of the device interface. /// @return it's name as a string. diff --git a/dev/kernel/src/Storage/ATADeviceInterface.cc b/dev/kernel/src/Storage/ATADeviceInterface.cc index 2e7022a7..3fe331dd 100644 --- a/dev/kernel/src/Storage/ATADeviceInterface.cc +++ b/dev/kernel/src/Storage/ATADeviceInterface.cc @@ -14,19 +14,13 @@ using namespace Kernel; /// @param Cleanup Drive cleanup. ATADeviceInterface::ATADeviceInterface( void (*Out)(IDeviceObject*, MountpointInterface* outpacket), - void (*In)(IDeviceObject*, MountpointInterface* inpacket), - void (*Cleanup)(void)) - : IDeviceObject(Out, In), fCleanup(Cleanup) + void (*In)(IDeviceObject*, MountpointInterface* inpacket)) + : IDeviceObject(Out, In) { } /// @brief Class desctructor -ATADeviceInterface::~ATADeviceInterface() -{ - MUST_PASS(fCleanup); - if (fCleanup) - fCleanup(); -} +ATADeviceInterface::~ATADeviceInterface() = default; /// @brief Returns the name of the device interface. /// @return it's name as a string. diff --git a/dev/modules/CoreGfx/CoreWindow.h b/dev/modules/CoreGfx/CoreWindow.h index f925eecd..b1581f65 100644 --- a/dev/modules/CoreGfx/CoreWindow.h +++ b/dev/modules/CoreGfx/CoreWindow.h @@ -1,3 +1,13 @@ +/* ------------------------------------------- + + Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +/// @note this file is experimental and not used yet. +/// @file CoreWindow.h +/// @brief Core window drawing functions. + #pragma once #include -- cgit v1.2.3