From fa5cf2816629897598f5a170337e964e2fe61b61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Mon, 1 Dec 2025 16:19:57 +0100 Subject: [PATCH] [FREELDR] Add a vgafont.h header (#8498) It contains the symbols & macros used for the embedded VGA font. - Adjust users to use `const UCHAR*` instead of `PUCHAR` pointer; - pc98video.c: Capture the current `FontPtr[Line]` into an `UCHAR`, so as to safely modify it. --- .../freeldr/arch/i386/pc98/pc98video.c | 28 +++++++++---------- .../freeldr/arch/i386/xbox/xboxvideo.c | 8 ++---- boot/freeldr/freeldr/arch/uefi/ueficon.c | 3 -- boot/freeldr/freeldr/arch/uefi/uefivid.c | 8 ++---- boot/freeldr/freeldr/arch/vgafont.c | 5 ++-- boot/freeldr/freeldr/arch/vgafont.h | 15 ++++++++++ .../freeldr/include/arch/i386/machxbox.h | 2 -- 7 files changed, 37 insertions(+), 32 deletions(-) create mode 100644 boot/freeldr/freeldr/arch/vgafont.h diff --git a/boot/freeldr/freeldr/arch/i386/pc98/pc98video.c b/boot/freeldr/freeldr/arch/i386/pc98/pc98video.c index b99035ea2e6..9aa0adcfee7 100644 --- a/boot/freeldr/freeldr/arch/i386/pc98/pc98video.c +++ b/boot/freeldr/freeldr/arch/i386/pc98/pc98video.c @@ -9,8 +9,8 @@ #include #include +#include "../../vgafont.h" -extern UCHAR BitmapFont8x16[]; extern BOOLEAN HiResoMachine; /* GLOBALS ********************************************************************/ @@ -21,9 +21,6 @@ extern BOOLEAN HiResoMachine; UCHAR TextCols; UCHAR TextLines; -#define CHAR_WIDTH 8 -#define CHAR_HEIGHT 16 - #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 400 #define BYTES_PER_SCANLINE (SCREEN_WIDTH / 8) @@ -321,7 +318,7 @@ Pc98VideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y) UCHAR R = (Attr & 0x40) ? 0xFF : 0; UCHAR I = (Attr & 0x80) ? 0xFF : 0; ULONG VramOffset = X + (Y * CHAR_HEIGHT) * BYTES_PER_SCANLINE; - PUCHAR FontPtr = BitmapFont8x16 + Ch * 16; + const UCHAR* FontPtr = BitmapFont8x16 + Ch * CHAR_HEIGHT; BOOLEAN CGFont = UseCGFont && (Ch != LIGHT_FILL && Ch != MEDIUM_FILL && Ch != DARK_FILL); if (CGFont) @@ -347,34 +344,35 @@ Pc98VideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y) for (Line = 0; Line < CHAR_HEIGHT; Line++) { + UCHAR CharLine = FontPtr[Line]; if (CGFont) { if (CGAccelDraw) { /* Character is already displayed by GDC (Text RAM), * so display only background for it. */ - FontPtr[Line] = 0; + CharLine = 0; } else { /* Obtain glyph data from CG Window */ WRITE_PORT_UCHAR((PUCHAR)KCG_IO_o_LINE, Line | 0x20); - FontPtr[Line] = READ_PORT_UCHAR((PUCHAR)KCG_IO_i_PATTERN); + CharLine = READ_PORT_UCHAR((PUCHAR)KCG_IO_i_PATTERN); } } if (Attr & 0x0F) { - *(PUCHAR)(VramPlaneB + VramOffset + Line * BYTES_PER_SCANLINE) = B | ((Attr & 0x01) ? FontPtr[Line] : 0); - *(PUCHAR)(VramPlaneG + VramOffset + Line * BYTES_PER_SCANLINE) = G | ((Attr & 0x02) ? FontPtr[Line] : 0); - *(PUCHAR)(VramPlaneR + VramOffset + Line * BYTES_PER_SCANLINE) = R | ((Attr & 0x04) ? FontPtr[Line] : 0); - *(PUCHAR)(VramPlaneI + VramOffset + Line * BYTES_PER_SCANLINE) = I | ((Attr & 0x08) ? FontPtr[Line] : 0); + *(PUCHAR)(VramPlaneB + VramOffset + Line * BYTES_PER_SCANLINE) = B | ((Attr & 0x01) ? CharLine : 0); + *(PUCHAR)(VramPlaneG + VramOffset + Line * BYTES_PER_SCANLINE) = G | ((Attr & 0x02) ? CharLine : 0); + *(PUCHAR)(VramPlaneR + VramOffset + Line * BYTES_PER_SCANLINE) = R | ((Attr & 0x04) ? CharLine : 0); + *(PUCHAR)(VramPlaneI + VramOffset + Line * BYTES_PER_SCANLINE) = I | ((Attr & 0x08) ? CharLine : 0); } else { - *(PUCHAR)(VramPlaneB + VramOffset + Line * BYTES_PER_SCANLINE) = B & ~FontPtr[Line]; - *(PUCHAR)(VramPlaneG + VramOffset + Line * BYTES_PER_SCANLINE) = G & ~FontPtr[Line]; - *(PUCHAR)(VramPlaneR + VramOffset + Line * BYTES_PER_SCANLINE) = R & ~FontPtr[Line]; - *(PUCHAR)(VramPlaneI + VramOffset + Line * BYTES_PER_SCANLINE) = I & ~FontPtr[Line]; + *(PUCHAR)(VramPlaneB + VramOffset + Line * BYTES_PER_SCANLINE) = B & ~CharLine; + *(PUCHAR)(VramPlaneG + VramOffset + Line * BYTES_PER_SCANLINE) = G & ~CharLine; + *(PUCHAR)(VramPlaneR + VramOffset + Line * BYTES_PER_SCANLINE) = R & ~CharLine; + *(PUCHAR)(VramPlaneI + VramOffset + Line * BYTES_PER_SCANLINE) = I & ~CharLine; } } } diff --git a/boot/freeldr/freeldr/arch/i386/xbox/xboxvideo.c b/boot/freeldr/freeldr/arch/i386/xbox/xboxvideo.c index 9e60922ad71..4e30a3f59a5 100644 --- a/boot/freeldr/freeldr/arch/i386/xbox/xboxvideo.c +++ b/boot/freeldr/freeldr/arch/i386/xbox/xboxvideo.c @@ -20,6 +20,7 @@ */ #include +#include "../../vgafont.h" #include DBG_DEFAULT_CHANNEL(UI); @@ -35,9 +36,6 @@ extern multiboot_info_t * MultibootInfoPtr; UCHAR MachDefaultTextColor = COLOR_GRAY; -#define CHAR_WIDTH 8 -#define CHAR_HEIGHT 16 - #define TOP_BOTTOM_LINES 0 #define FB_SIZE_MB 4 @@ -47,13 +45,13 @@ UCHAR MachDefaultTextColor = COLOR_GRAY; static VOID XboxVideoOutputChar(UCHAR Char, unsigned X, unsigned Y, ULONG FgColor, ULONG BgColor) { - PUCHAR FontPtr; + const UCHAR* FontPtr; PULONG Pixel; UCHAR Mask; unsigned Line; unsigned Col; - FontPtr = BitmapFont8x16 + Char * 16; + FontPtr = BitmapFont8x16 + Char * CHAR_HEIGHT; Pixel = (PULONG) ((char *) FrameBuffer + (Y * CHAR_HEIGHT + TOP_BOTTOM_LINES) * Delta + X * CHAR_WIDTH * BytesPerPixel); for (Line = 0; Line < CHAR_HEIGHT; Line++) diff --git a/boot/freeldr/freeldr/arch/uefi/ueficon.c b/boot/freeldr/freeldr/arch/uefi/ueficon.c index b3471fd1b83..b112ec53003 100644 --- a/boot/freeldr/freeldr/arch/uefi/ueficon.c +++ b/boot/freeldr/freeldr/arch/uefi/ueficon.c @@ -7,9 +7,6 @@ #include -#define CHAR_WIDTH 8 -#define CHAR_HEIGHT 16 - /* GLOBALS ********************************************************************/ extern EFI_SYSTEM_TABLE* GlobalSystemTable; diff --git a/boot/freeldr/freeldr/arch/uefi/uefivid.c b/boot/freeldr/freeldr/arch/uefi/uefivid.c index 5c6a4dd7a69..4d40c8aeb0c 100644 --- a/boot/freeldr/freeldr/arch/uefi/uefivid.c +++ b/boot/freeldr/freeldr/arch/uefi/uefivid.c @@ -6,12 +6,11 @@ */ #include +#include "../vgafont.h" #include DBG_DEFAULT_CHANNEL(WARNING); -#define CHAR_WIDTH 8 -#define CHAR_HEIGHT 16 #define TOP_BOTTOM_LINES 0 #define LOWEST_SUPPORTED_RES 1 @@ -19,7 +18,6 @@ DBG_DEFAULT_CHANNEL(WARNING); extern EFI_SYSTEM_TABLE* GlobalSystemTable; extern EFI_HANDLE GlobalImageHandle; -extern UCHAR BitmapFont8x16[256 * 16]; UCHAR MachDefaultTextColor = COLOR_GRAY; REACTOS_INTERNAL_BGCONTEXT framebufferData; @@ -115,14 +113,14 @@ UefiVideoClearScreen(UCHAR Attr) VOID UefiVideoOutputChar(UCHAR Char, unsigned X, unsigned Y, ULONG FgColor, ULONG BgColor) { - PUCHAR FontPtr; + const UCHAR* FontPtr; PULONG Pixel; UCHAR Mask; unsigned Line; unsigned Col; ULONG Delta; Delta = (framebufferData.PixelsPerScanLine * 4 + 3) & ~ 0x3; - FontPtr = BitmapFont8x16 + Char * 16; + FontPtr = BitmapFont8x16 + Char * CHAR_HEIGHT; Pixel = (PULONG) ((char *) framebufferData.BaseAddress + (Y * CHAR_HEIGHT + TOP_BOTTOM_LINES) * Delta + X * CHAR_WIDTH * 4); diff --git a/boot/freeldr/freeldr/arch/vgafont.c b/boot/freeldr/freeldr/arch/vgafont.c index 0a731d308bd..35a6ab960f7 100644 --- a/boot/freeldr/freeldr/arch/vgafont.c +++ b/boot/freeldr/freeldr/arch/vgafont.c @@ -2,14 +2,15 @@ * PROJECT: FreeLoader * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) * PURPOSE: VGA font 8x16 - * COPYRIGHT: Copyright 2004 Gé van Geldorp (gvg@reactos.org) + * COPYRIGHT: Copyright 2004 Gé van Geldorp */ /* Note: Converted from the XFree vga.bdf font */ #include +#include "vgafont.h" -UCHAR BitmapFont8x16[256 * 16] = +const UCHAR BitmapFont8x16[256 * CHAR_HEIGHT] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0x00 */ 0x00,0x00,0x7e,0x81,0xa5,0x81,0x81,0xa5,0x99,0x81,0x81,0x7e,0x00,0x00,0x00,0x00, /* 0x01 */ diff --git a/boot/freeldr/freeldr/arch/vgafont.h b/boot/freeldr/freeldr/arch/vgafont.h new file mode 100644 index 00000000000..1b2abd830a5 --- /dev/null +++ b/boot/freeldr/freeldr/arch/vgafont.h @@ -0,0 +1,15 @@ +/* + * PROJECT: FreeLoader + * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) + * PURPOSE: VGA font 8x16 + * COPYRIGHT: Copyright 2004 Gé van Geldorp + */ + +#pragma once + +#define CHAR_WIDTH 8 +#define CHAR_HEIGHT 16 + +extern const UCHAR BitmapFont8x16[256 * CHAR_HEIGHT]; + +/* EOF */ diff --git a/boot/freeldr/freeldr/include/arch/i386/machxbox.h b/boot/freeldr/freeldr/include/arch/i386/machxbox.h index f89c9eb0f4f..2b413255084 100644 --- a/boot/freeldr/freeldr/include/arch/i386/machxbox.h +++ b/boot/freeldr/freeldr/include/arch/i386/machxbox.h @@ -24,8 +24,6 @@ #include -extern UCHAR BitmapFont8x16[256 * 16]; - VOID XboxConsPutChar(int Ch); BOOLEAN XboxConsKbHit(VOID); int XboxConsGetCh(VOID);