/** @file\r
Implementation for EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL protocol.\r
\r
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
Copyright (C) 2016 Silicon Graphics, Inc. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
{ BLOCKELEMENT_FULL_BLOCK, 0xdb, L'*' },\r
{ BLOCKELEMENT_LIGHT_SHADE, 0xb0, L'+' },\r
\r
- { GEOMETRICSHAPE_UP_TRIANGLE, 0x1e, L'^' },\r
- { GEOMETRICSHAPE_RIGHT_TRIANGLE, 0x10, L'>' },\r
- { GEOMETRICSHAPE_DOWN_TRIANGLE, 0x1f, L'v' },\r
- { GEOMETRICSHAPE_LEFT_TRIANGLE, 0x11, L'<' },\r
+ { GEOMETRICSHAPE_UP_TRIANGLE, '^', L'^' },\r
+ { GEOMETRICSHAPE_RIGHT_TRIANGLE, '>', L'>' },\r
+ { GEOMETRICSHAPE_DOWN_TRIANGLE, 'v', L'v' },\r
+ { GEOMETRICSHAPE_LEFT_TRIANGLE, '<', L'<' },\r
\r
- { ARROW_LEFT, 0x3c, L'<' },\r
- { ARROW_UP, 0x18, L'^' },\r
- { ARROW_RIGHT, 0x3e, L'>' },\r
- { ARROW_DOWN, 0x19, L'v' },\r
+ { ARROW_LEFT, '<', L'<' },\r
+ { ARROW_UP, '^', L'^' },\r
+ { ARROW_RIGHT, '>', L'>' },\r
+ { ARROW_DOWN, 'v', L'v' },\r
\r
{ 0x0000, 0x00, L'\0' }\r
};\r
CHAR16 mSetAttributeString[] = { ESC, '[', '0', 'm', ESC, '[', '4', '0', 'm', ESC, '[', '4', '0', 'm', 0 };\r
CHAR16 mClearScreenString[] = { ESC, '[', '2', 'J', 0 };\r
CHAR16 mSetCursorPositionString[] = { ESC, '[', '0', '0', ';', '0', '0', 'H', 0 };\r
+CHAR16 mCursorForwardString[] = { ESC, '[', '0', '0', 'C', 0 };\r
+CHAR16 mCursorBackwardString[] = { ESC, '[', '0', '0', 'D', 0 };\r
\r
//\r
// Body of the ConOut functions\r
CHAR8 AsciiChar;\r
EFI_STATUS Status;\r
UINT8 ValidBytes;\r
+ CHAR8 CrLfStr[2];\r
//\r
// flag used to indicate whether condition happens which will cause\r
// return EFI_WARN_UNKNOWN_GLYPH\r
\r
switch (TerminalDevice->TerminalType) {\r
\r
- case PCANSITYPE:\r
- case VT100TYPE:\r
- case VT100PLUSTYPE:\r
- case TTYTERMTYPE:\r
+ case TerminalTypePcAnsi:\r
+ case TerminalTypeVt100:\r
+ case TerminalTypeVt100Plus:\r
+ case TerminalTypeTtyTerm:\r
\r
if (!TerminalIsValidTextGraphics (*WString, &GraphicChar, &AsciiChar)) {\r
//\r
\r
}\r
\r
- if (TerminalDevice->TerminalType != PCANSITYPE) {\r
+ if (TerminalDevice->TerminalType != TerminalTypePcAnsi) {\r
GraphicChar = AsciiChar;\r
}\r
\r
\r
break;\r
\r
- case VTUTF8TYPE:\r
+ case TerminalTypeVtUtf8:\r
UnicodeToUtf8 (*WString, &Utf8Char, &ValidBytes);\r
Length = ValidBytes;\r
Status = TerminalDevice->SerialIo->Write (\r
Mode->CursorRow++;\r
}\r
\r
- if (TerminalDevice->TerminalType == TTYTERMTYPE &&\r
+ if (TerminalDevice->TerminalType == TerminalTypeTtyTerm &&\r
!TerminalDevice->OutputEscChar) {\r
//\r
// We've written the last character on the line. The\r
// the driver, but only if we're not in the middle of\r
// printing an escape sequence.\r
//\r
- CHAR8 CrLfStr[] = {'\r', '\n'};\r
+ CrLfStr[0] = '\r';\r
+ CrLfStr[1] = '\n';\r
\r
Length = sizeof(CrLfStr);\r
\r
\r
switch (TerminalDevice->TerminalType) {\r
\r
- case PCANSITYPE:\r
- case VT100TYPE:\r
- case VT100PLUSTYPE:\r
- case TTYTERMTYPE:\r
+ case TerminalTypePcAnsi:\r
+ case TerminalTypeVt100:\r
+ case TerminalTypeVt100Plus:\r
+ case TerminalTypeTtyTerm:\r
Status = AnsiTestString (TerminalDevice, WString);\r
break;\r
\r
- case VTUTF8TYPE:\r
+ case TerminalTypeVtUtf8:\r
Status = VTUTF8TestString (TerminalDevice, WString);\r
break;\r
\r
//\r
// Get Terminal device data structure pointer.\r
//\r
- TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This); \r
+ TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This);\r
*Columns = TerminalDevice->TerminalConsoleModeData[ModeNumber].Columns;\r
*Rows = TerminalDevice->TerminalConsoleModeData[ModeNumber].Rows;\r
\r
@param ModeNumber The text mode to set.\r
\r
@retval EFI_SUCCESS The requested text mode is set.\r
- @retval EFI_DEVICE_ERROR The requested text mode cannot be set \r
+ @retval EFI_DEVICE_ERROR The requested text mode cannot be set\r
because of serial device error.\r
@retval EFI_UNSUPPORTED The text mode number is not valid.\r
\r
UINTN MaxRow;\r
EFI_STATUS Status;\r
TERMINAL_DEV *TerminalDevice;\r
+ CHAR16 *String;\r
\r
TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This);\r
\r
//\r
// control sequence to move the cursor\r
//\r
- mSetCursorPositionString[ROW_OFFSET + 0] = (CHAR16) ('0' + ((Row + 1) / 10));\r
- mSetCursorPositionString[ROW_OFFSET + 1] = (CHAR16) ('0' + ((Row + 1) % 10));\r
- mSetCursorPositionString[COLUMN_OFFSET + 0] = (CHAR16) ('0' + ((Column + 1) / 10));\r
- mSetCursorPositionString[COLUMN_OFFSET + 1] = (CHAR16) ('0' + ((Column + 1) % 10));\r
+ // Optimize cursor motion control sequences for TtyTerm. Move\r
+ // within the current line if possible, and don't output anyting if\r
+ // it isn't necessary.\r
+ //\r
+ if (TerminalDevice->TerminalType == TerminalTypeTtyTerm &&\r
+ (UINTN)Mode->CursorRow == Row) {\r
+ if ((UINTN)Mode->CursorColumn > Column) {\r
+ mCursorBackwardString[FW_BACK_OFFSET + 0] = (CHAR16) ('0' + ((Mode->CursorColumn - Column) / 10));\r
+ mCursorBackwardString[FW_BACK_OFFSET + 1] = (CHAR16) ('0' + ((Mode->CursorColumn - Column) % 10));\r
+ String = mCursorBackwardString;\r
+ }\r
+ else if (Column > (UINTN)Mode->CursorColumn) {\r
+ mCursorForwardString[FW_BACK_OFFSET + 0] = (CHAR16) ('0' + ((Column - Mode->CursorColumn) / 10));\r
+ mCursorForwardString[FW_BACK_OFFSET + 1] = (CHAR16) ('0' + ((Column - Mode->CursorColumn) % 10));\r
+ String = mCursorForwardString;\r
+ }\r
+ else {\r
+ String = L""; // No cursor motion necessary\r
+ }\r
+ }\r
+ else {\r
+ mSetCursorPositionString[ROW_OFFSET + 0] = (CHAR16) ('0' + ((Row + 1) / 10));\r
+ mSetCursorPositionString[ROW_OFFSET + 1] = (CHAR16) ('0' + ((Row + 1) % 10));\r
+ mSetCursorPositionString[COLUMN_OFFSET + 0] = (CHAR16) ('0' + ((Column + 1) / 10));\r
+ mSetCursorPositionString[COLUMN_OFFSET + 1] = (CHAR16) ('0' + ((Column + 1) % 10));\r
+ String = mSetCursorPositionString;\r
+ }\r
\r
TerminalDevice->OutputEscChar = TRUE;\r
- Status = This->OutputString (This, mSetCursorPositionString);\r
+ Status = This->OutputString (This, String);\r
TerminalDevice->OutputEscChar = FALSE;\r
\r
if (EFI_ERROR (Status)) {\r
Detects if a valid ASCII char.\r
\r
@param Ascii An ASCII character.\r
- \r
+\r
@retval TRUE If it is a valid ASCII character.\r
@retval FALSE If it is not a valid ASCII character.\r
\r
Detects if a valid EFI control character.\r
\r
@param CharC An input EFI Control character.\r
- \r
+\r
@retval TRUE If it is a valid EFI control character.\r
@retval FALSE If it is not a valid EFI control character.\r
\r