Author: hbelusca
Date: Wed Oct 15 00:42:19 2014
New Revision: 64748
URL:
http://svn.reactos.org/svn/reactos?rev=64748&view=rev
Log:
[NTVDM]: Implement double-width and double-height separately; used when eg. an app
displays in 640*180, etc...
Modified:
trunk/reactos/subsystems/ntvdm/hardware/vga.c
Modified: trunk/reactos/subsystems/ntvdm/hardware/vga.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/ntvdm/hardware/…
==============================================================================
--- trunk/reactos/subsystems/ntvdm/hardware/vga.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/ntvdm/hardware/vga.c [iso-8859-1] Wed Oct 15 00:42:19 2014
@@ -240,7 +240,9 @@
/* Graphics mode */
static HANDLE GraphicsConsoleBuffer = NULL;
static HANDLE ConsoleMutex = NULL;
-static BOOLEAN DoubleVision = FALSE;
+/* DoubleVision support */
+static BOOLEAN DoubleWidth = FALSE;
+static BOOLEAN DoubleHeight = FALSE;
/*
* VGA Hardware
@@ -964,16 +966,10 @@
LONG Height = Resolution->Y;
/* Use DoubleVision mode if the resolution is too small */
- if (Width < VGA_MINIMUM_WIDTH && Height < VGA_MINIMUM_HEIGHT)
- {
- DoubleVision = TRUE;
- Width *= 2;
- Height *= 2;
- }
- else
- {
- DoubleVision = FALSE;
- }
+ DoubleWidth = (Width < VGA_MINIMUM_WIDTH);
+ if (DoubleWidth) Width *= 2;
+ DoubleHeight = (Height < VGA_MINIMUM_HEIGHT);
+ if (DoubleHeight) Height *= 2;
/* Fill the bitmap info header */
RtlZeroMemory(&BitmapInfo->bmiHeader, sizeof(BitmapInfo->bmiHeader));
@@ -1036,7 +1032,9 @@
ConsoleFramebuffer = NULL;
CloseHandle(GraphicsConsoleBuffer);
GraphicsConsoleBuffer = NULL;
- DoubleVision = FALSE;
+
+ DoubleWidth = FALSE;
+ DoubleHeight = FALSE;
}
static BOOL VgaEnterTextMode(PCOORD Resolution)
@@ -1307,14 +1305,14 @@
}
/* Take into account DoubleVision mode when checking for pixel updates
*/
- if (DoubleVision)
+ if (DoubleWidth && DoubleHeight)
{
/* Now check if the resulting pixel data has changed */
- if (GraphicsBuffer[(i * Resolution.X * 4) + (j * 2)] != PixelData)
+ if (GraphicsBuffer[(i * 2 * Resolution.X * 2) + (j * 2)] !=
PixelData)
{
/* Yes, write the new value */
- GraphicsBuffer[(i * Resolution.X * 4) + (j * 2)] = PixelData;
- GraphicsBuffer[(i * Resolution.X * 4) + (j * 2 + 1)] =
PixelData;
+ GraphicsBuffer[(i * 2 * Resolution.X * 2) + (j * 2)] =
PixelData;
+ GraphicsBuffer[(i * 2 * Resolution.X * 2) + (j * 2 + 1)] =
PixelData;
GraphicsBuffer[((i * 2 + 1) * Resolution.X * 2) + (j * 2)] =
PixelData;
GraphicsBuffer[((i * 2 + 1) * Resolution.X * 2) + (j * 2 + 1)] =
PixelData;
@@ -1322,7 +1320,33 @@
VgaMarkForUpdate(i, j);
}
}
- else
+ else if (DoubleWidth && !DoubleHeight)
+ {
+ /* Now check if the resulting pixel data has changed */
+ if (GraphicsBuffer[(i * Resolution.X * 2) + (j * 2)] != PixelData)
+ {
+ /* Yes, write the new value */
+ GraphicsBuffer[(i * Resolution.X * 2) + (j * 2)] = PixelData;
+ GraphicsBuffer[(i * Resolution.X * 2) + (j * 2 + 1)] =
PixelData;
+
+ /* Mark the specified pixel as changed */
+ VgaMarkForUpdate(i, j);
+ }
+ }
+ else if (!DoubleWidth && DoubleHeight)
+ {
+ /* Now check if the resulting pixel data has changed */
+ if (GraphicsBuffer[(i * 2 * Resolution.X) + j] != PixelData)
+ {
+ /* Yes, write the new value */
+ GraphicsBuffer[(i * 2 * Resolution.X) + j] = PixelData;
+ GraphicsBuffer[((i * 2 + 1) * Resolution.X) + j] = PixelData;
+
+ /* Mark the specified pixel as changed */
+ VgaMarkForUpdate(i, j);
+ }
+ }
+ else // if (!DoubleWidth && !DoubleHeight)
{
/* Now check if the resulting pixel data has changed */
if (GraphicsBuffer[i * Resolution.X + j] != PixelData)
@@ -1797,11 +1821,14 @@
ConsoleBufferHandle = GraphicsConsoleBuffer;
/* In DoubleVision mode, scale the update rectangle */
- if (DoubleVision)
+ if (DoubleWidth)
{
UpdateRectangle.Left *= 2;
- UpdateRectangle.Top *= 2;
- UpdateRectangle.Right = UpdateRectangle.Right * 2 + 1;
+ UpdateRectangle.Right = UpdateRectangle.Right * 2 + 1;
+ }
+ if (DoubleHeight)
+ {
+ UpdateRectangle.Top *= 2;
UpdateRectangle.Bottom = UpdateRectangle.Bottom * 2 + 1;
}
}