mirror of
https://github.com/reactos/reactos.git
synced 2026-06-01 17:00:51 +08:00
[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:
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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]];
|
||||
|
||||
@@ -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];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user