mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 05:42:59 +00:00
- Write direct to the console buffer in CsrWriteConsoleOutputChar.
- Update only the necessary screen region in CsrFillOutputChar. - Improve the access to the console buffer in CsrFillOutputAttrib/CsrWriteConsoleOutputAttrib. svn path=/trunk/; revision=4387
This commit is contained in:
parent
79dcc93088
commit
99146c71b3
1 changed files with 121 additions and 73 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: conio.c,v 1.44 2003/03/16 16:14:38 hbirr Exp $
|
/* $Id: conio.c,v 1.45 2003/03/21 20:17:55 hbirr Exp $
|
||||||
*
|
*
|
||||||
* reactos/subsys/csrss/api/conio.c
|
* reactos/subsys/csrss/api/conio.c
|
||||||
*
|
*
|
||||||
|
@ -1236,9 +1236,10 @@ CSR_API(CsrSetCursor)
|
||||||
|
|
||||||
CSR_API(CsrWriteConsoleOutputChar)
|
CSR_API(CsrWriteConsoleOutputChar)
|
||||||
{
|
{
|
||||||
BYTE *Buffer = Request->Data.WriteConsoleOutputCharRequest.String;
|
PBYTE String = Request->Data.WriteConsoleOutputCharRequest.String;
|
||||||
|
PBYTE Buffer;
|
||||||
PCSRSS_SCREEN_BUFFER Buff;
|
PCSRSS_SCREEN_BUFFER Buff;
|
||||||
DWORD X, Y;
|
DWORD X, Y, Length;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
IO_STATUS_BLOCK Iosb;
|
IO_STATUS_BLOCK Iosb;
|
||||||
|
|
||||||
|
@ -1253,12 +1254,26 @@ CSR_API(CsrWriteConsoleOutputChar)
|
||||||
UNLOCK;
|
UNLOCK;
|
||||||
return Reply->Status = STATUS_INVALID_HANDLE;
|
return Reply->Status = STATUS_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
X = Buff->CurrentX;
|
|
||||||
Y = Buff->CurrentY;
|
|
||||||
Buff->CurrentX = Request->Data.WriteConsoleOutputCharRequest.Coord.X;
|
X = Request->Data.WriteConsoleOutputCharRequest.Coord.X + Buff->ShowX;
|
||||||
Buff->CurrentY = (Request->Data.WriteConsoleOutputCharRequest.Coord.Y + Buff->ShowY) % Buff->MaxY;
|
Y = (Request->Data.WriteConsoleOutputCharRequest.Coord.Y + Buff->ShowY) % Buff->MaxY;
|
||||||
Buffer[Request->Data.WriteConsoleOutputCharRequest.Length] = 0;
|
Length = Request->Data.WriteConsoleOutputCharRequest.Length;
|
||||||
CsrpWriteConsole( Buff, Buffer, Request->Data.WriteConsoleOutputCharRequest.Length, FALSE );
|
Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)];
|
||||||
|
while(Length--)
|
||||||
|
{
|
||||||
|
*Buffer = *String++;
|
||||||
|
Buffer += 2;
|
||||||
|
if (++X == Buff->MaxX)
|
||||||
|
{
|
||||||
|
if (++Y == Buff->MaxY)
|
||||||
|
{
|
||||||
|
Y = 0;
|
||||||
|
Buffer = Buff->Buffer;
|
||||||
|
}
|
||||||
|
X = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
if( ActiveConsole->ActiveBuffer == Buff )
|
if( ActiveConsole->ActiveBuffer == Buff )
|
||||||
{
|
{
|
||||||
Status = NtDeviceIoControlFile( ConsoleDeviceHandle,
|
Status = NtDeviceIoControlFile( ConsoleDeviceHandle,
|
||||||
|
@ -1274,10 +1289,8 @@ CSR_API(CsrWriteConsoleOutputChar)
|
||||||
if( !NT_SUCCESS( Status ) )
|
if( !NT_SUCCESS( Status ) )
|
||||||
DPRINT1( "Failed to write output chars: %x\n", Status );
|
DPRINT1( "Failed to write output chars: %x\n", Status );
|
||||||
}
|
}
|
||||||
Reply->Data.WriteConsoleOutputCharReply.EndCoord.X = Buff->CurrentX - Buff->ShowX;
|
Reply->Data.WriteConsoleOutputCharReply.EndCoord.X = X - Buff->ShowX;
|
||||||
Reply->Data.WriteConsoleOutputCharReply.EndCoord.Y = (Buff->CurrentY + Buff->MaxY - Buff->ShowY) % Buff->MaxY;
|
Reply->Data.WriteConsoleOutputCharReply.EndCoord.Y = (Y + Buff->MaxY - Buff->ShowY) % Buff->MaxY;
|
||||||
Buff->CurrentY = Y;
|
|
||||||
Buff->CurrentX = X;
|
|
||||||
UNLOCK;
|
UNLOCK;
|
||||||
return Reply->Status = STATUS_SUCCESS;
|
return Reply->Status = STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -1285,7 +1298,12 @@ CSR_API(CsrWriteConsoleOutputChar)
|
||||||
CSR_API(CsrFillOutputChar)
|
CSR_API(CsrFillOutputChar)
|
||||||
{
|
{
|
||||||
PCSRSS_SCREEN_BUFFER Buff;
|
PCSRSS_SCREEN_BUFFER Buff;
|
||||||
DWORD X, Y, i;
|
DWORD X, Y, Length;
|
||||||
|
BYTE Char;
|
||||||
|
OUTPUT_CHARACTER Character;
|
||||||
|
PBYTE Buffer;
|
||||||
|
NTSTATUS Status;
|
||||||
|
IO_STATUS_BLOCK Iosb;
|
||||||
|
|
||||||
DPRINT("CsrFillOutputChar\n");
|
DPRINT("CsrFillOutputChar\n");
|
||||||
|
|
||||||
|
@ -1301,18 +1319,41 @@ CSR_API(CsrFillOutputChar)
|
||||||
}
|
}
|
||||||
X = Request->Data.FillOutputRequest.Position.X + Buff->ShowX;
|
X = Request->Data.FillOutputRequest.Position.X + Buff->ShowX;
|
||||||
Y = (Request->Data.FillOutputRequest.Position.Y + Buff->ShowY) % Buff->MaxY;
|
Y = (Request->Data.FillOutputRequest.Position.Y + Buff->ShowY) % Buff->MaxY;
|
||||||
for( i = 0; i < Request->Data.FillOutputRequest.Length; i++ )
|
Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)];
|
||||||
|
Char = Request->Data.FillOutputRequest.Char;
|
||||||
|
Length = Request->Data.FillOutputRequest.Length;
|
||||||
|
while (Length--)
|
||||||
{
|
{
|
||||||
Buff->Buffer[ (Y * 2 * Buff->MaxX) + (X * 2) ] = Request->Data.FillOutputRequest.Char;
|
*Buffer = Char;
|
||||||
|
Buffer += 2;
|
||||||
if( ++X == Buff->MaxX )
|
if( ++X == Buff->MaxX )
|
||||||
{
|
{
|
||||||
if( ++Y == Buff->MaxY )
|
if( ++Y == Buff->MaxY )
|
||||||
|
{
|
||||||
Y = 0;
|
Y = 0;
|
||||||
|
Buffer = Buff->Buffer;
|
||||||
|
}
|
||||||
X = 0;
|
X = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( Buff == ActiveConsole->ActiveBuffer )
|
if( Buff == ActiveConsole->ActiveBuffer )
|
||||||
CsrDrawConsole( Buff );
|
{
|
||||||
|
Character.dwCoord = Request->Data.FillOutputRequest.Position;
|
||||||
|
Character.cCharacter = Char;
|
||||||
|
Character.nLength = Request->Data.FillOutputRequest.Length;
|
||||||
|
Status = NtDeviceIoControlFile( ConsoleDeviceHandle,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&Iosb,
|
||||||
|
IOCTL_CONSOLE_FILL_OUTPUT_CHARACTER,
|
||||||
|
&Character,
|
||||||
|
sizeof(Character),
|
||||||
|
NULL,
|
||||||
|
0);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
DPRINT1( "Failed to write output characters to console\n" );
|
||||||
|
}
|
||||||
UNLOCK;
|
UNLOCK;
|
||||||
return Reply->Status;
|
return Reply->Status;
|
||||||
}
|
}
|
||||||
|
@ -1389,10 +1430,10 @@ CSR_API(CsrReadInputEvent)
|
||||||
|
|
||||||
CSR_API(CsrWriteConsoleOutputAttrib)
|
CSR_API(CsrWriteConsoleOutputAttrib)
|
||||||
{
|
{
|
||||||
int c;
|
|
||||||
PCSRSS_SCREEN_BUFFER Buff;
|
PCSRSS_SCREEN_BUFFER Buff;
|
||||||
|
PUCHAR Buffer, Attribute;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
int X, Y;
|
int X, Y, Length;
|
||||||
IO_STATUS_BLOCK Iosb;
|
IO_STATUS_BLOCK Iosb;
|
||||||
|
|
||||||
DPRINT("CsrWriteConsoleOutputAttrib\n");
|
DPRINT("CsrWriteConsoleOutputAttrib\n");
|
||||||
|
@ -1408,18 +1449,23 @@ CSR_API(CsrWriteConsoleOutputAttrib)
|
||||||
UNLOCK;
|
UNLOCK;
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
X = Buff->CurrentX;
|
X = Request->Data.WriteConsoleOutputAttribRequest.Coord.X + Buff->ShowX;
|
||||||
Y = Buff->CurrentY;
|
Y = (Request->Data.WriteConsoleOutputAttribRequest.Coord.Y + Buff->ShowY) % Buff->MaxY;
|
||||||
Buff->CurrentX = Request->Data.WriteConsoleOutputAttribRequest.Coord.X + Buff->ShowX;
|
Length = Request->Data.WriteConsoleOutputAttribRequest.Length;
|
||||||
Buff->CurrentY = (Request->Data.WriteConsoleOutputAttribRequest.Coord.Y + Buff->ShowY) % Buff->MaxY;
|
Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X) + 1];
|
||||||
for( c = 0; c < Request->Data.WriteConsoleOutputAttribRequest.Length; c++ )
|
Attribute = Request->Data.WriteConsoleOutputAttribRequest.String;
|
||||||
|
while (Length--)
|
||||||
{
|
{
|
||||||
Buff->Buffer[(Buff->CurrentY * Buff->MaxX * 2) + (Buff->CurrentX * 2) + 1] = Request->Data.WriteConsoleOutputAttribRequest.String[c];
|
*Buffer = *Attribute++;
|
||||||
if( ++Buff->CurrentX == Buff->MaxX )
|
Buffer += 2;
|
||||||
|
if( ++X == Buff->MaxX )
|
||||||
{
|
{
|
||||||
Buff->CurrentX = 0;
|
X = 0;
|
||||||
if( ++Buff->CurrentY == Buff->MaxY )
|
if( ++Y == Buff->MaxY )
|
||||||
Buff->CurrentY = 0;
|
{
|
||||||
|
Y = 0;
|
||||||
|
Buffer = Buff->Buffer + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( Buff == ActiveConsole->ActiveBuffer )
|
if( Buff == ActiveConsole->ActiveBuffer )
|
||||||
|
@ -1440,20 +1486,19 @@ CSR_API(CsrWriteConsoleOutputAttrib)
|
||||||
}
|
}
|
||||||
Reply->Data.WriteConsoleOutputAttribReply.EndCoord.X = Buff->CurrentX - Buff->ShowX;
|
Reply->Data.WriteConsoleOutputAttribReply.EndCoord.X = Buff->CurrentX - Buff->ShowX;
|
||||||
Reply->Data.WriteConsoleOutputAttribReply.EndCoord.Y = ( Buff->CurrentY + Buff->MaxY - Buff->ShowY ) % Buff->MaxY;
|
Reply->Data.WriteConsoleOutputAttribReply.EndCoord.Y = ( Buff->CurrentY + Buff->MaxY - Buff->ShowY ) % Buff->MaxY;
|
||||||
Buff->CurrentX = X;
|
|
||||||
Buff->CurrentY = Y;
|
|
||||||
UNLOCK;
|
UNLOCK;
|
||||||
return Reply->Status = STATUS_SUCCESS;
|
return Reply->Status = STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
CSR_API(CsrFillOutputAttrib)
|
CSR_API(CsrFillOutputAttrib)
|
||||||
{
|
{
|
||||||
int c;
|
OUTPUT_ATTRIBUTE Attribute;
|
||||||
PCSRSS_SCREEN_BUFFER Buff;
|
PCSRSS_SCREEN_BUFFER Buff;
|
||||||
|
PCHAR Buffer;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
int X, Y;
|
int X, Y, Length;
|
||||||
IO_STATUS_BLOCK Iosb;
|
IO_STATUS_BLOCK Iosb;
|
||||||
OUTPUT_ATTRIBUTE Attr;
|
UCHAR Attr;
|
||||||
|
|
||||||
DPRINT("CsrFillOutputAttrib\n");
|
DPRINT("CsrFillOutputAttrib\n");
|
||||||
|
|
||||||
|
@ -1468,40 +1513,43 @@ CSR_API(CsrFillOutputAttrib)
|
||||||
UNLOCK;
|
UNLOCK;
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
X = Buff->CurrentX;
|
X = Request->Data.FillOutputAttribRequest.Coord.X + Buff->ShowX;
|
||||||
Y = Buff->CurrentY;
|
Y = (Request->Data.FillOutputAttribRequest.Coord.Y + Buff->ShowY) % Buff->MaxY;
|
||||||
Buff->CurrentX = Request->Data.FillOutputAttribRequest.Coord.X + Buff->ShowX;
|
Length = Request->Data.FillOutputAttribRequest.Length;
|
||||||
Buff->CurrentY = (Request->Data.FillOutputAttribRequest.Coord.Y + Buff->ShowY) % Buff->MaxY;
|
Attr = Request->Data.FillOutputAttribRequest.Attribute;
|
||||||
for( c = 0; c < Request->Data.FillOutputAttribRequest.Length; c++ )
|
Buffer = &Buff->Buffer[(Y * Buff->MaxX * 2) + (X * 2) + 1];
|
||||||
|
while(Length--)
|
||||||
{
|
{
|
||||||
Buff->Buffer[(Buff->CurrentY * Buff->MaxX * 2) + (Buff->CurrentX * 2) + 1] = Request->Data.FillOutputAttribRequest.Attribute;
|
*Buffer = Attr;
|
||||||
if( ++Buff->CurrentX == Buff->MaxX )
|
Buffer += 2;
|
||||||
|
if( ++X == Buff->MaxX )
|
||||||
{
|
{
|
||||||
Buff->CurrentX = 0;
|
X = 0;
|
||||||
if( ++Buff->CurrentY == Buff->MaxY )
|
if( ++Y == Buff->MaxY )
|
||||||
Buff->CurrentY = 0;
|
{
|
||||||
|
Y = 0;
|
||||||
|
Buffer = Buff->Buffer + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( Buff == ActiveConsole->ActiveBuffer )
|
if( Buff == ActiveConsole->ActiveBuffer )
|
||||||
{
|
{
|
||||||
Attr.wAttribute = Request->Data.FillOutputAttribRequest.Attribute;
|
Attribute.wAttribute = Attr;
|
||||||
Attr.nLength = Request->Data.FillOutputAttribRequest.Length;
|
Attribute.nLength = Request->Data.FillOutputAttribRequest.Length;
|
||||||
Attr.dwCoord = Request->Data.FillOutputAttribRequest.Coord;
|
Attribute.dwCoord = Request->Data.FillOutputAttribRequest.Coord;
|
||||||
Status = NtDeviceIoControlFile( ConsoleDeviceHandle,
|
Status = NtDeviceIoControlFile( ConsoleDeviceHandle,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
&Iosb,
|
&Iosb,
|
||||||
IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE,
|
IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE,
|
||||||
&Attr,
|
&Attribute,
|
||||||
sizeof (Attr),
|
sizeof(OUTPUT_ATTRIBUTE),
|
||||||
0,
|
NULL,
|
||||||
0 );
|
0);
|
||||||
if( !NT_SUCCESS( Status ) )
|
if( !NT_SUCCESS( Status ) )
|
||||||
DPRINT1( "Failed to fill output attribute\n" );
|
DPRINT1( "Failed to fill output attributes to console\n" );
|
||||||
}
|
}
|
||||||
Buff->CurrentX = X;
|
|
||||||
Buff->CurrentY = Y;
|
|
||||||
UNLOCK;
|
UNLOCK;
|
||||||
return Reply->Status = STATUS_SUCCESS;
|
return Reply->Status = STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue