Finish to move some text functions to condrv.

svn path=/trunk/; revision=59322
This commit is contained in:
Hermès Bélusca-Maïto 2013-06-23 18:20:39 +00:00
parent e781a0d29d
commit 346e42535c
2 changed files with 140 additions and 199 deletions

View file

@ -438,7 +438,7 @@ ConioResizeBuffer(PCONSOLE Console,
} }
static VOID FASTCALL static VOID FASTCALL
ConioNextLine(PTEXTMODE_SCREEN_BUFFER Buff, SMALL_RECT* UpdateRect, UINT *ScrolledLines) ConioNextLine(PTEXTMODE_SCREEN_BUFFER Buff, PSMALL_RECT UpdateRect, PUINT ScrolledLines)
{ {
/* If we hit bottom, slide the viewable screen */ /* If we hit bottom, slide the viewable screen */
if (++Buff->CursorPosition.Y == Buff->ScreenBufferSize.Y) if (++Buff->CursorPosition.Y == Buff->ScreenBufferSize.Y)
@ -1099,157 +1099,144 @@ ConDrvFillConsoleOutput(IN PCONSOLE Console,
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
NTSTATUS NTAPI
ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console,
CSR_API(SrvGetConsoleScreenBufferInfo) IN PTEXTMODE_SCREEN_BUFFER Buffer,
OUT PCONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo)
{ {
NTSTATUS Status; if (Console == NULL || Buffer == NULL || ScreenBufferInfo == NULL)
PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScreenBufferInfoRequest; return STATUS_INVALID_PARAMETER;
// PCONSOLE Console;
PTEXTMODE_SCREEN_BUFFER Buff;
PCONSOLE_SCREEN_BUFFER_INFO pInfo = &ScreenBufferInfoRequest->Info;
DPRINT("SrvGetConsoleScreenBufferInfo\n"); /* Validity check */
ASSERT(Console == Buffer->Header.Console);
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), ScreenBufferInfoRequest->OutputHandle, &Buff, GENERIC_READ, TRUE); ScreenBufferInfo->dwSize = Buffer->ScreenBufferSize;
if (!NT_SUCCESS(Status)) return Status; ScreenBufferInfo->dwCursorPosition = Buffer->CursorPosition;
ScreenBufferInfo->wAttributes = Buffer->ScreenDefaultAttrib;
ScreenBufferInfo->srWindow.Left = Buffer->ViewOrigin.X;
ScreenBufferInfo->srWindow.Top = Buffer->ViewOrigin.Y;
ScreenBufferInfo->srWindow.Right = Buffer->ViewOrigin.X + Buffer->ViewSize.X - 1;
ScreenBufferInfo->srWindow.Bottom = Buffer->ViewOrigin.Y + Buffer->ViewSize.Y - 1;
// Console = Buff->Header.Console; // FIXME: Refine the computation
ScreenBufferInfo->dwMaximumWindowSize = Buffer->ScreenBufferSize;
pInfo->dwSize = Buff->ScreenBufferSize;
pInfo->dwCursorPosition = Buff->CursorPosition;
pInfo->wAttributes = Buff->ScreenDefaultAttrib;
pInfo->srWindow.Left = Buff->ViewOrigin.X;
pInfo->srWindow.Top = Buff->ViewOrigin.Y;
pInfo->srWindow.Right = Buff->ViewOrigin.X + Buff->ViewSize.X - 1;
pInfo->srWindow.Bottom = Buff->ViewOrigin.Y + Buff->ViewSize.Y - 1;
pInfo->dwMaximumWindowSize = Buff->ScreenBufferSize; // TODO: Refine the computation
ConSrvReleaseScreenBuffer(Buff, TRUE);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
CSR_API(SrvSetConsoleTextAttribute) NTSTATUS NTAPI
ConDrvSetConsoleTextAttribute(IN PCONSOLE Console,
IN PTEXTMODE_SCREEN_BUFFER Buffer,
IN WORD Attribute)
{ {
NTSTATUS Status; if (Console == NULL || Buffer == NULL)
PCONSOLE_SETTEXTATTRIB SetTextAttribRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetTextAttribRequest; return STATUS_INVALID_PARAMETER;
PTEXTMODE_SCREEN_BUFFER Buff;
DPRINT("SrvSetConsoleTextAttribute\n"); /* Validity check */
ASSERT(Console == Buffer->Header.Console);
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), SetTextAttribRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE); Buffer->ScreenDefaultAttrib = Attribute;
if (!NT_SUCCESS(Status)) return Status;
Buff->ScreenDefaultAttrib = SetTextAttribRequest->Attrib;
ConSrvReleaseScreenBuffer(Buff, TRUE);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
CSR_API(SrvSetConsoleScreenBufferSize) NTSTATUS NTAPI
ConDrvSetConsoleScreenBufferSize(IN PCONSOLE Console,
IN PTEXTMODE_SCREEN_BUFFER Buffer,
IN PCOORD Size)
{ {
NTSTATUS Status; NTSTATUS Status;
PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetScreenBufferSizeRequest;
PCONSOLE Console;
PTEXTMODE_SCREEN_BUFFER Buff;
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), SetScreenBufferSizeRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE); if (Console == NULL || Buffer == NULL || Size == NULL)
if (!NT_SUCCESS(Status)) return Status; return STATUS_INVALID_PARAMETER;
Console = Buff->Header.Console; /* Validity check */
ASSERT(Console == Buffer->Header.Console);
Status = ConioResizeBuffer(Console, Buff, SetScreenBufferSizeRequest->Size); Status = ConioResizeBuffer(Console, Buffer, *Size);
if (NT_SUCCESS(Status)) ConioResizeTerminal(Console); if (NT_SUCCESS(Status)) ConioResizeTerminal(Console);
ConSrvReleaseScreenBuffer(Buff, TRUE);
return Status; return Status;
} }
CSR_API(SrvScrollConsoleScreenBuffer) NTSTATUS NTAPI
ConDrvScrollConsoleScreenBuffer(IN PCONSOLE Console,
IN PTEXTMODE_SCREEN_BUFFER Buffer,
IN BOOL Unicode,
IN PSMALL_RECT ScrollRectangle,
IN BOOL UseClipRectangle,
IN PSMALL_RECT ClipRectangle OPTIONAL,
IN PCOORD DestinationOrigin,
IN CHAR_INFO FillChar)
{ {
PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScrollScreenBufferRequest; COORD CapturedDestinationOrigin;
PCONSOLE Console;
PTEXTMODE_SCREEN_BUFFER Buff;
SMALL_RECT ScreenBuffer; SMALL_RECT ScreenBuffer;
SMALL_RECT SrcRegion; SMALL_RECT SrcRegion;
SMALL_RECT DstRegion; SMALL_RECT DstRegion;
SMALL_RECT UpdateRegion; SMALL_RECT UpdateRegion;
SMALL_RECT ScrollRectangle; SMALL_RECT CapturedClipRectangle;
SMALL_RECT ClipRectangle;
NTSTATUS Status;
HANDLE OutputHandle;
BOOLEAN UseClipRectangle;
COORD DestinationOrigin;
CHAR_INFO FillChar;
DPRINT("SrvScrollConsoleScreenBuffer\n"); if (Console == NULL || Buffer == NULL || ScrollRectangle == NULL ||
(UseClipRectangle ? ClipRectangle == NULL : FALSE) || DestinationOrigin == NULL)
OutputHandle = ScrollScreenBufferRequest->OutputHandle; {
UseClipRectangle = ScrollScreenBufferRequest->UseClipRectangle; return STATUS_INVALID_PARAMETER;
DestinationOrigin = ScrollScreenBufferRequest->DestinationOrigin; }
FillChar = ScrollScreenBufferRequest->Fill;
/* Validity check */
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), OutputHandle, &Buff, GENERIC_WRITE, TRUE); ASSERT(Console == Buffer->Header.Console);
if (!NT_SUCCESS(Status)) return Status;
CapturedDestinationOrigin = *DestinationOrigin;
Console = Buff->Header.Console;
/* Make sure the source rectangle is inside the screen buffer */
ScrollRectangle = ScrollScreenBufferRequest->ScrollRectangle; ConioInitRect(&ScreenBuffer, 0, 0, Buffer->ScreenBufferSize.Y - 1, Buffer->ScreenBufferSize.X - 1);
if (!ConioGetIntersection(&SrcRegion, &ScreenBuffer, ScrollRectangle))
/* Make sure source rectangle is inside the screen buffer */
ConioInitRect(&ScreenBuffer, 0, 0, Buff->ScreenBufferSize.Y - 1, Buff->ScreenBufferSize.X - 1);
if (!ConioGetIntersection(&SrcRegion, &ScreenBuffer, &ScrollRectangle))
{ {
ConSrvReleaseScreenBuffer(Buff, TRUE);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/* If the source was clipped on the left or top, adjust the destination accordingly */ /* If the source was clipped on the left or top, adjust the destination accordingly */
if (ScrollRectangle.Left < 0) if (ScrollRectangle->Left < 0)
{ {
DestinationOrigin.X -= ScrollRectangle.Left; CapturedDestinationOrigin.X -= ScrollRectangle->Left;
} }
if (ScrollRectangle.Top < 0) if (ScrollRectangle->Top < 0)
{ {
DestinationOrigin.Y -= ScrollRectangle.Top; CapturedDestinationOrigin.Y -= ScrollRectangle->Top;
} }
if (UseClipRectangle) if (UseClipRectangle)
{ {
ClipRectangle = ScrollScreenBufferRequest->ClipRectangle; CapturedClipRectangle = *ClipRectangle;
if (!ConioGetIntersection(&ClipRectangle, &ClipRectangle, &ScreenBuffer)) if (!ConioGetIntersection(&CapturedClipRectangle, &CapturedClipRectangle, &ScreenBuffer))
{ {
ConSrvReleaseScreenBuffer(Buff, TRUE);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
} }
else else
{ {
ClipRectangle = ScreenBuffer; CapturedClipRectangle = ScreenBuffer;
} }
ConioInitRect(&DstRegion, ConioInitRect(&DstRegion,
DestinationOrigin.Y, CapturedDestinationOrigin.Y,
DestinationOrigin.X, CapturedDestinationOrigin.X,
DestinationOrigin.Y + ConioRectHeight(&SrcRegion) - 1, CapturedDestinationOrigin.Y + ConioRectHeight(&SrcRegion) - 1,
DestinationOrigin.X + ConioRectWidth(&SrcRegion) - 1); CapturedDestinationOrigin.X + ConioRectWidth(&SrcRegion ) - 1);
if (!ScrollScreenBufferRequest->Unicode) if (!Unicode)
ConsoleAnsiCharToUnicodeChar(Console, &FillChar.Char.UnicodeChar, &FillChar.Char.AsciiChar); ConsoleAnsiCharToUnicodeChar(Console, &FillChar.Char.UnicodeChar, &FillChar.Char.AsciiChar);
ConioMoveRegion(Buff, &SrcRegion, &DstRegion, &ClipRectangle, FillChar); ConioMoveRegion(Buffer, &SrcRegion, &DstRegion, &CapturedClipRectangle, FillChar);
if ((PCONSOLE_SCREEN_BUFFER)Buff == Console->ActiveBuffer) if ((PCONSOLE_SCREEN_BUFFER)Buffer == Console->ActiveBuffer)
{ {
ConioGetUnion(&UpdateRegion, &SrcRegion, &DstRegion); ConioGetUnion(&UpdateRegion, &SrcRegion, &DstRegion);
if (ConioGetIntersection(&UpdateRegion, &UpdateRegion, &ClipRectangle)) if (ConioGetIntersection(&UpdateRegion, &UpdateRegion, &CapturedClipRectangle))
{ {
/* Draw update region */ /* Draw update region */
ConioDrawRegion(Console, &UpdateRegion); ConioDrawRegion(Console, &UpdateRegion);
} }
} }
ConSrvReleaseScreenBuffer(Buff, TRUE);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View file

@ -684,160 +684,114 @@ CSR_API(SrvFillConsoleOutput)
return Status; return Status;
} }
#if 0000 NTSTATUS NTAPI
ConDrvGetConsoleScreenBufferInfo(IN PCONSOLE Console,
IN PTEXTMODE_SCREEN_BUFFER Buffer,
OUT PCONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo);
CSR_API(SrvGetConsoleScreenBufferInfo) CSR_API(SrvGetConsoleScreenBufferInfo)
{ {
NTSTATUS Status; NTSTATUS Status;
PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScreenBufferInfoRequest; PCONSOLE_GETSCREENBUFFERINFO ScreenBufferInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScreenBufferInfoRequest;
// PCONSOLE Console; PTEXTMODE_SCREEN_BUFFER Buffer;
PTEXTMODE_SCREEN_BUFFER Buff;
PCONSOLE_SCREEN_BUFFER_INFO pInfo = &ScreenBufferInfoRequest->Info;
DPRINT("SrvGetConsoleScreenBufferInfo\n"); DPRINT("SrvGetConsoleScreenBufferInfo\n");
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), ScreenBufferInfoRequest->OutputHandle, &Buff, GENERIC_READ, TRUE); Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
ScreenBufferInfoRequest->OutputHandle,
&Buffer, GENERIC_READ, TRUE);
if (!NT_SUCCESS(Status)) return Status; if (!NT_SUCCESS(Status)) return Status;
// Console = Buff->Header.Console; Status = ConDrvGetConsoleScreenBufferInfo(Buffer->Header.Console,
Buffer,
&ScreenBufferInfoRequest->Info);
pInfo->dwSize = Buff->ScreenBufferSize; ConSrvReleaseScreenBuffer(Buffer, TRUE);
pInfo->dwCursorPosition = Buff->CursorPosition; return Status;
pInfo->wAttributes = Buff->ScreenDefaultAttrib;
pInfo->srWindow.Left = Buff->ViewOrigin.X;
pInfo->srWindow.Top = Buff->ViewOrigin.Y;
pInfo->srWindow.Right = Buff->ViewOrigin.X + Buff->ViewSize.X - 1;
pInfo->srWindow.Bottom = Buff->ViewOrigin.Y + Buff->ViewSize.Y - 1;
pInfo->dwMaximumWindowSize = Buff->ScreenBufferSize; // TODO: Refine the computation
ConSrvReleaseScreenBuffer(Buff, TRUE);
return STATUS_SUCCESS;
} }
NTSTATUS NTAPI
ConDrvSetConsoleTextAttribute(IN PCONSOLE Console,
IN PTEXTMODE_SCREEN_BUFFER Buffer,
IN WORD Attribute);
CSR_API(SrvSetConsoleTextAttribute) CSR_API(SrvSetConsoleTextAttribute)
{ {
NTSTATUS Status; NTSTATUS Status;
PCONSOLE_SETTEXTATTRIB SetTextAttribRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetTextAttribRequest; PCONSOLE_SETTEXTATTRIB SetTextAttribRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetTextAttribRequest;
PTEXTMODE_SCREEN_BUFFER Buff; PTEXTMODE_SCREEN_BUFFER Buffer;
DPRINT("SrvSetConsoleTextAttribute\n"); DPRINT("SrvSetConsoleTextAttribute\n");
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), SetTextAttribRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE); Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
SetTextAttribRequest->OutputHandle,
&Buffer, GENERIC_WRITE, TRUE);
if (!NT_SUCCESS(Status)) return Status; if (!NT_SUCCESS(Status)) return Status;
Buff->ScreenDefaultAttrib = SetTextAttribRequest->Attrib; Status = ConDrvSetConsoleTextAttribute(Buffer->Header.Console,
Buffer,
SetTextAttribRequest->Attrib);
ConSrvReleaseScreenBuffer(Buff, TRUE); ConSrvReleaseScreenBuffer(Buffer, TRUE);
return STATUS_SUCCESS; return Status;
} }
NTSTATUS NTAPI
ConDrvSetConsoleScreenBufferSize(IN PCONSOLE Console,
IN PTEXTMODE_SCREEN_BUFFER Buffer,
IN PCOORD Size);
CSR_API(SrvSetConsoleScreenBufferSize) CSR_API(SrvSetConsoleScreenBufferSize)
{ {
NTSTATUS Status; NTSTATUS Status;
PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetScreenBufferSizeRequest; PCONSOLE_SETSCREENBUFFERSIZE SetScreenBufferSizeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetScreenBufferSizeRequest;
PCONSOLE Console; PTEXTMODE_SCREEN_BUFFER Buffer;
PTEXTMODE_SCREEN_BUFFER Buff;
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), SetScreenBufferSizeRequest->OutputHandle, &Buff, GENERIC_WRITE, TRUE); DPRINT("SrvSetConsoleScreenBufferSize\n");
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
SetScreenBufferSizeRequest->OutputHandle,
&Buffer, GENERIC_WRITE, TRUE);
if (!NT_SUCCESS(Status)) return Status; if (!NT_SUCCESS(Status)) return Status;
Console = Buff->Header.Console; Status = ConDrvSetConsoleScreenBufferSize(Buffer->Header.Console,
Buffer,
&SetScreenBufferSizeRequest->Size);
Status = ConioResizeBuffer(Console, Buff, SetScreenBufferSizeRequest->Size); ConSrvReleaseScreenBuffer(Buffer, TRUE);
if (NT_SUCCESS(Status)) ConioResizeTerminal(Console);
ConSrvReleaseScreenBuffer(Buff, TRUE);
return Status; return Status;
} }
NTSTATUS NTAPI
ConDrvScrollConsoleScreenBuffer(IN PCONSOLE Console,
IN PTEXTMODE_SCREEN_BUFFER Buffer,
IN BOOL Unicode,
IN PSMALL_RECT ScrollRectangle,
IN BOOL UseClipRectangle,
IN PSMALL_RECT ClipRectangle OPTIONAL,
IN PCOORD DestinationOrigin,
IN CHAR_INFO FillChar);
CSR_API(SrvScrollConsoleScreenBuffer) CSR_API(SrvScrollConsoleScreenBuffer)
{ {
PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScrollScreenBufferRequest;
PCONSOLE Console;
PTEXTMODE_SCREEN_BUFFER Buff;
SMALL_RECT ScreenBuffer;
SMALL_RECT SrcRegion;
SMALL_RECT DstRegion;
SMALL_RECT UpdateRegion;
SMALL_RECT ScrollRectangle;
SMALL_RECT ClipRectangle;
NTSTATUS Status; NTSTATUS Status;
HANDLE OutputHandle; PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ScrollScreenBufferRequest;
BOOLEAN UseClipRectangle; PTEXTMODE_SCREEN_BUFFER Buffer;
COORD DestinationOrigin;
CHAR_INFO FillChar;
DPRINT("SrvScrollConsoleScreenBuffer\n"); DPRINT("SrvScrollConsoleScreenBuffer\n");
OutputHandle = ScrollScreenBufferRequest->OutputHandle; Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
UseClipRectangle = ScrollScreenBufferRequest->UseClipRectangle; ScrollScreenBufferRequest->OutputHandle,
DestinationOrigin = ScrollScreenBufferRequest->DestinationOrigin; &Buffer, GENERIC_WRITE, TRUE);
FillChar = ScrollScreenBufferRequest->Fill;
Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), OutputHandle, &Buff, GENERIC_WRITE, TRUE);
if (!NT_SUCCESS(Status)) return Status; if (!NT_SUCCESS(Status)) return Status;
Console = Buff->Header.Console; Status = ConDrvScrollConsoleScreenBuffer(Buffer->Header.Console,
Buffer,
ScrollScreenBufferRequest->Unicode,
&ScrollScreenBufferRequest->ScrollRectangle,
ScrollScreenBufferRequest->UseClipRectangle,
&ScrollScreenBufferRequest->ClipRectangle,
&ScrollScreenBufferRequest->DestinationOrigin,
ScrollScreenBufferRequest->Fill);
ScrollRectangle = ScrollScreenBufferRequest->ScrollRectangle; ConSrvReleaseScreenBuffer(Buffer, TRUE);
return Status;
/* Make sure source rectangle is inside the screen buffer */
ConioInitRect(&ScreenBuffer, 0, 0, Buff->ScreenBufferSize.Y - 1, Buff->ScreenBufferSize.X - 1);
if (!ConioGetIntersection(&SrcRegion, &ScreenBuffer, &ScrollRectangle))
{
ConSrvReleaseScreenBuffer(Buff, TRUE);
return STATUS_SUCCESS;
}
/* If the source was clipped on the left or top, adjust the destination accordingly */
if (ScrollRectangle.Left < 0)
{
DestinationOrigin.X -= ScrollRectangle.Left;
}
if (ScrollRectangle.Top < 0)
{
DestinationOrigin.Y -= ScrollRectangle.Top;
}
if (UseClipRectangle)
{
ClipRectangle = ScrollScreenBufferRequest->ClipRectangle;
if (!ConioGetIntersection(&ClipRectangle, &ClipRectangle, &ScreenBuffer))
{
ConSrvReleaseScreenBuffer(Buff, TRUE);
return STATUS_SUCCESS;
}
}
else
{
ClipRectangle = ScreenBuffer;
}
ConioInitRect(&DstRegion,
DestinationOrigin.Y,
DestinationOrigin.X,
DestinationOrigin.Y + ConioRectHeight(&SrcRegion) - 1,
DestinationOrigin.X + ConioRectWidth(&SrcRegion) - 1);
if (!ScrollScreenBufferRequest->Unicode)
ConsoleAnsiCharToUnicodeChar(Console, &FillChar.Char.UnicodeChar, &FillChar.Char.AsciiChar);
ConioMoveRegion(Buff, &SrcRegion, &DstRegion, &ClipRectangle, FillChar);
if ((PCONSOLE_SCREEN_BUFFER)Buff == Console->ActiveBuffer)
{
ConioGetUnion(&UpdateRegion, &SrcRegion, &DstRegion);
if (ConioGetIntersection(&UpdateRegion, &UpdateRegion, &ClipRectangle))
{
/* Draw update region */
ConioDrawRegion(Console, &UpdateRegion);
}
}
ConSrvReleaseScreenBuffer(Buff, TRUE);
return STATUS_SUCCESS;
} }
#endif
/* EOF */ /* EOF */