]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
MdeModulePkg: Removing ipf which is no longer supported from edk2.
[mirror_edk2.git] / MdeModulePkg / Universal / Console / TerminalDxe / TerminalConOut.c
index b11e83f4f24a648ac3015f4f87a21a2c8806a44b..4d7218e415481e7d1489b6392766df1f50d5df69 100644 (file)
@@ -1,7 +1,7 @@
 /** @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
@@ -66,15 +66,15 @@ UNICODE_TO_CHAR  UnicodeToPcAnsiOrAscii[] = {
   { 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
@@ -83,6 +83,8 @@ CHAR16 mSetModeString[]            = { ESC, '[', '=', '3', 'h', 0 };
 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
@@ -186,6 +188,7 @@ TerminalConOutOutputString (
   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
@@ -221,10 +224,10 @@ TerminalConOutOutputString (
 \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
@@ -250,7 +253,7 @@ TerminalConOutOutputString (
 \r
       }\r
 \r
-      if (TerminalDevice->TerminalType != PCANSITYPE) {\r
+      if (TerminalDevice->TerminalType != TerminalTypePcAnsi) {\r
         GraphicChar = AsciiChar;\r
       }\r
 \r
@@ -268,7 +271,7 @@ TerminalConOutOutputString (
 \r
       break;\r
 \r
-    case VTUTF8TYPE:\r
+    case TerminalTypeVtUtf8:\r
       UnicodeToUtf8 (*WString, &Utf8Char, &ValidBytes);\r
       Length = ValidBytes;\r
       Status = TerminalDevice->SerialIo->Write (\r
@@ -314,7 +317,7 @@ TerminalConOutOutputString (
           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
@@ -324,7 +327,8 @@ TerminalConOutOutputString (
           // 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
@@ -394,14 +398,14 @@ TerminalConOutTestString (
 \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
@@ -447,7 +451,7 @@ TerminalConOutQueryMode (
   //\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
@@ -465,7 +469,7 @@ TerminalConOutQueryMode (
   @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
@@ -755,6 +759,7 @@ TerminalConOutSetCursorPosition (
   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
@@ -782,13 +787,36 @@ TerminalConOutSetCursorPosition (
   //\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
@@ -883,7 +911,7 @@ TerminalIsValidTextGraphics (
   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
@@ -907,7 +935,7 @@ TerminalIsValidAscii (
   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