- 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:
Hartmut Birr 2003-03-21 20:17:55 +00:00
parent 79dcc93088
commit 99146c71b3

View file

@ -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;
} }