[BOOTVID] Use an "unsigned" (U)RECT structure for the VidpScrollRegion (#8547)

This makes the code more readable than using e.g. `VidpScrollRegion[0]`,
`VidpScrollRegion[1]` etc. instead of `VidpScrollRegion.Left`,
`VidpScrollRegion.Top` respectively.

Based on a suggestion by Dmitry Borisov.
This commit is contained in:
Hermès Bélusca-Maïto
2026-01-02 14:47:05 +01:00
parent 5894d0b443
commit 3b33b1025e
6 changed files with 40 additions and 40 deletions

View File

@@ -117,18 +117,18 @@ DoScroll(
PUSHORT i, j;
/* Set memory positions of the scroll */
SourceOffset = &VgaArmBase[(VidpScrollRegion[1] * (SCREEN_WIDTH / 8)) + (VidpScrollRegion[0] >> 3)];
SourceOffset = &VgaArmBase[(VidpScrollRegion.Top * (SCREEN_WIDTH / 8)) + (VidpScrollRegion.Left >> 3)];
DestOffset = &SourceOffset[Scroll * (SCREEN_WIDTH / 8)];
/* Start loop */
for (Top = VidpScrollRegion[1]; Top <= VidpScrollRegion[3]; ++Top)
for (Top = VidpScrollRegion.Top; Top <= VidpScrollRegion.Bottom; ++Top)
{
/* Set number of bytes to loop and start offset */
Offset = VidpScrollRegion[0] >> 3;
Offset = VidpScrollRegion.Left >> 3;
j = SourceOffset;
/* Check if this is part of the scroll region */
if (Offset <= (VidpScrollRegion[2] >> 3))
if (Offset <= (VidpScrollRegion.Right >> 3))
{
/* Update position */
i = (PUSHORT)(DestOffset - SourceOffset);
@@ -146,7 +146,7 @@ DoScroll(
Offset++;
/* Make sure we don't go past the scroll region */
} while (Offset <= (VidpScrollRegion[2] >> 3));
} while (Offset <= (VidpScrollRegion.Right >> 3));
}
/* Move to the next line */

View File

@@ -12,17 +12,9 @@
/* GLOBALS ********************************************************************/
UCHAR VidpTextColor = BV_COLOR_WHITE;
ULONG VidpCurrentX = 0;
ULONG VidpCurrentY = 0;
ULONG VidpScrollRegion[4] =
{
0,
0,
SCREEN_WIDTH - 1,
SCREEN_HEIGHT - 1
};
URECT VidpScrollRegion = {0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1};
static BOOLEAN ClearRow = FALSE;
@@ -66,13 +58,13 @@ VidSetScrollRegion(
ASSERT((Left % BOOTCHAR_WIDTH) == 0);
ASSERT((Right % BOOTCHAR_WIDTH) == BOOTCHAR_WIDTH - 1);
/* Set Scroll Region */
VidpScrollRegion[0] = Left;
VidpScrollRegion[1] = Top;
VidpScrollRegion[2] = Right;
VidpScrollRegion[3] = Bottom;
/* Set the scroll region */
VidpScrollRegion.Left = Left;
VidpScrollRegion.Top = Top;
VidpScrollRegion.Right = Right;
VidpScrollRegion.Bottom = Bottom;
/* Set current X and Y */
/* Set the current X and Y */
VidpCurrentX = Left;
VidpCurrentY = Top;
}
@@ -114,7 +106,7 @@ VidDisplayString(
{
/* Modify Y position */
VidpCurrentY += BOOTCHAR_HEIGHT + 1;
if (VidpCurrentY + BOOTCHAR_HEIGHT > VidpScrollRegion[3])
if (VidpCurrentY + BOOTCHAR_HEIGHT > VidpScrollRegion.Bottom)
{
/* Scroll the view and clear the current row */
DoScroll(BOOTCHAR_HEIGHT + 1);
@@ -128,7 +120,7 @@ VidDisplayString(
}
/* Update current X */
VidpCurrentX = VidpScrollRegion[0];
VidpCurrentX = VidpScrollRegion.Left;
/* No need to clear this row */
ClearRow = FALSE;
@@ -136,7 +128,7 @@ VidDisplayString(
else if (*String == '\r')
{
/* Update current X */
VidpCurrentX = VidpScrollRegion[0];
VidpCurrentX = VidpScrollRegion.Left;
/* If a new-line does not follow we will clear the current row */
if (String[1] != '\n')
@@ -156,11 +148,11 @@ VidDisplayString(
VidpCurrentX += BOOTCHAR_WIDTH;
/* Check if we should scroll */
if (VidpCurrentX + BOOTCHAR_WIDTH - 1 > VidpScrollRegion[2])
if (VidpCurrentX + BOOTCHAR_WIDTH - 1 > VidpScrollRegion.Right)
{
/* Update Y position and check if we should scroll it */
VidpCurrentY += BOOTCHAR_HEIGHT + 1;
if (VidpCurrentY + BOOTCHAR_HEIGHT > VidpScrollRegion[3])
if (VidpCurrentY + BOOTCHAR_HEIGHT > VidpScrollRegion.Bottom)
{
/* Scroll the view and clear the current row */
DoScroll(BOOTCHAR_HEIGHT + 1);
@@ -174,7 +166,7 @@ VidDisplayString(
}
/* Update current X */
VidpCurrentX = VidpScrollRegion[0];
VidpCurrentX = VidpScrollRegion.Left;
}
}
}

View File

@@ -244,14 +244,14 @@ DoScroll(
/* Set Mode 1 */
ReadWriteMode(1);
RowSize = (VidpScrollRegion[2] - VidpScrollRegion[0] + 1) / 8;
RowSize = (VidpScrollRegion.Right - VidpScrollRegion.Left + 1) / 8;
/* Calculate the position in memory for the row */
OldPosition = (PUCHAR)(VgaBase + (VidpScrollRegion[1] + Scroll) * (SCREEN_WIDTH / 8) + VidpScrollRegion[0] / 8);
NewPosition = (PUCHAR)(VgaBase + VidpScrollRegion[1] * (SCREEN_WIDTH / 8) + VidpScrollRegion[0] / 8);
OldPosition = (PUCHAR)(VgaBase + (VidpScrollRegion.Top + Scroll) * (SCREEN_WIDTH / 8) + VidpScrollRegion.Left / 8);
NewPosition = (PUCHAR)(VgaBase + VidpScrollRegion.Top * (SCREEN_WIDTH / 8) + VidpScrollRegion.Left / 8);
/* Start loop */
for (Top = VidpScrollRegion[1]; Top <= VidpScrollRegion[3]; ++Top)
for (Top = VidpScrollRegion.Top; Top <= VidpScrollRegion.Bottom; ++Top)
{
#if defined(_M_IX86) || defined(_M_AMD64)
__movsb(NewPosition, OldPosition, RowSize);

View File

@@ -328,11 +328,11 @@ DoScroll(
USHORT i, Line;
PUCHAR Src, Dst;
PULONG SrcWide, DstWide;
USHORT PixelCount = (VidpScrollRegion[2] - VidpScrollRegion[0]) + 1;
ULONG_PTR SourceOffset = FrameBuffer + FB_OFFSET(VidpScrollRegion[0], VidpScrollRegion[1] + Scroll);
ULONG_PTR DestinationOffset = FrameBuffer + FB_OFFSET(VidpScrollRegion[0], VidpScrollRegion[1]);
USHORT PixelCount = (VidpScrollRegion.Right - VidpScrollRegion.Left) + 1;
ULONG_PTR SourceOffset = FrameBuffer + FB_OFFSET(VidpScrollRegion.Left, VidpScrollRegion.Top + Scroll);
ULONG_PTR DestinationOffset = FrameBuffer + FB_OFFSET(VidpScrollRegion.Left, VidpScrollRegion.Top);
for (Line = VidpScrollRegion[1]; Line <= VidpScrollRegion[3]; Line++)
for (Line = VidpScrollRegion.Top; Line <= VidpScrollRegion.Bottom; Line++)
{
SrcWide = (PULONG)SourceOffset;
DstWide = (PULONG)DestinationOffset;

View File

@@ -313,21 +313,21 @@ VOID
DoScroll(
_In_ ULONG Scroll)
{
ULONG RowSize = VidpScrollRegion[2] - VidpScrollRegion[0] + 1;
ULONG RowSize = VidpScrollRegion.Right - VidpScrollRegion.Left + 1;
/* Calculate the position in memory for the row */
PUCHAR OldPosition = BackBuffer + BB_OFFSET(VidpScrollRegion[0], VidpScrollRegion[1] + Scroll);
PUCHAR NewPosition = BackBuffer + BB_OFFSET(VidpScrollRegion[0], VidpScrollRegion[1]);
PUCHAR OldPosition = BackBuffer + BB_OFFSET(VidpScrollRegion.Left, VidpScrollRegion.Top + Scroll);
PUCHAR NewPosition = BackBuffer + BB_OFFSET(VidpScrollRegion.Left, VidpScrollRegion.Top);
/* Start loop */
for (ULONG Top = VidpScrollRegion[1]; Top <= VidpScrollRegion[3]; ++Top)
for (ULONG Top = VidpScrollRegion.Top; Top <= VidpScrollRegion.Bottom; ++Top)
{
ULONG i;
/* Scroll the row */
RtlCopyMemory(NewPosition, OldPosition, RowSize);
PULONG Frame = (PULONG)(FrameBufferStart + FB_OFFSET(VidpScrollRegion[0], Top));
PULONG Frame = (PULONG)(FrameBufferStart + FB_OFFSET(VidpScrollRegion.Left, Top));
for (i = 0; i < RowSize; ++i)
Frame[i] = CachedPalette[NewPosition[i]];

View File

@@ -57,13 +57,21 @@ typedef struct tagBITMAPINFOHEADER
typedef ULONG RGBQUAD;
typedef struct _URECT
{
ULONG Left;
ULONG Top;
ULONG Right;
ULONG Bottom;
} URECT;
/*
* Globals
*/
extern UCHAR VidpTextColor;
extern ULONG VidpCurrentX;
extern ULONG VidpCurrentY;
extern ULONG VidpScrollRegion[4];
extern URECT VidpScrollRegion;
extern const UCHAR VidpFontData[256 * BOOTCHAR_HEIGHT];
extern const RGBQUAD VidpDefaultPalette[BV_MAX_COLORS];