<div dir="ltr"><div>I think '\' '/' works just as well if not better than '+' for the purpose they serve. I think that part of the table is an example of poor man's ascii not of all of it.<br></div> I'm not sure how to bring the other threads into this one. So here are the links to v3<br><a href="https://edk2.groups.io/g/devel/message/79691">https://edk2.groups.io/g/devel/message/79691</a><br><a href="https://edk2.groups.io/g/devel/message/79692">https://edk2.groups.io/g/devel/message/79692</a> <br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Aug 17, 2021 at 9:50 PM Gao, Zhichao <<a href="mailto:zhichao.gao@intel.com">zhichao.gao@intel.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Caden/Nate,<br>
<br>
This patch aims to make the terminal output character set to be expected as <a href="https://github.com/tianocore/tianocore.github.io/wiki/Tasks-Terminal-driver-improvements" rel="noreferrer" target="_blank">https://github.com/tianocore/tianocore.github.io/wiki/Tasks-Terminal-driver-improvements</a>.<br>
It is better to add this info to the commit message. Because of the commit message length limitation, I would suggest to file a Bugzilla and attach above link.<br>
<br>
For the poor man's line drawing, our code is using '\' and '/' instead of '+'. Should we change it to match the table?<br>
<br>
Caden,<br>
<br>
The patch thru email is not separated for every lines, it mixed up. So it is hard to give comment thru email. So I give my comments thru <a href="https://github.com/ZhichaoGao/edk2/commit/b9a47188d7228a47897413ca73c265143edfec29#diff-e3ef4106fc8f77b7d4ac5679f4104281cbf9a0322606703f2a6be152960c1125R300" rel="noreferrer" target="_blank">https://github.com/ZhichaoGao/edk2/commit/b9a47188d7228a47897413ca73c265143edfec29#diff-e3ef4106fc8f77b7d4ac5679f4104281cbf9a0322606703f2a6be152960c1125R300</a>.<br>
<br>
Thanks,<br>
Zhichao<br>
<br>
<br>
<br>
> -----Original Message-----<br>
> From: <a href="mailto:devel@edk2.groups.io" target="_blank">devel@edk2.groups.io</a> <<a href="mailto:devel@edk2.groups.io" target="_blank">devel@edk2.groups.io</a>> On Behalf Of Caden<br>
> Kline<br>
> Sent: Friday, August 13, 2021 8:00 AM<br>
> To: <a href="mailto:devel@edk2.groups.io" target="_blank">devel@edk2.groups.io</a><br>
> Cc: Wang, Jian J <<a href="mailto:jian.j.wang@intel.com" target="_blank">jian.j.wang@intel.com</a>>; Wu, Hao A <<a href="mailto:hao.a.wu@intel.com" target="_blank">hao.a.wu@intel.com</a>>;<br>
> Gao, Zhichao <<a href="mailto:zhichao.gao@intel.com" target="_blank">zhichao.gao@intel.com</a>>; Ni, Ray <<a href="mailto:ray.ni@intel.com" target="_blank">ray.ni@intel.com</a>>;<br>
> Desimone, Nathaniel L <<a href="mailto:nathaniel.l.desimone@intel.com" target="_blank">nathaniel.l.desimone@intel.com</a>><br>
> Subject: [edk2-devel] [PATCH v2 1/1] MdeModulePkg/Console: Improve<br>
> encoding of box drawing characters<br>
> <br>
> Improved encoding of box drawing characters for different terminal types.<br>
> This includes Dec special graphics mode and more utf8.<br>
> <br>
> Cc: Jian J Wang <<a href="mailto:jian.j.wang@intel.com" target="_blank">jian.j.wang@intel.com</a>><br>
> Cc: Hao A Wu <<a href="mailto:hao.a.wu@intel.com" target="_blank">hao.a.wu@intel.com</a>><br>
> Cc: Zhichao Gao <<a href="mailto:zhichao.gao@intel.com" target="_blank">zhichao.gao@intel.com</a>><br>
> Cc: Ray Ni <<a href="mailto:ray.ni@intel.com" target="_blank">ray.ni@intel.com</a>><br>
> Signed-off-by: Caden Kline <<a href="mailto:cadenkline9@gmail.com" target="_blank">cadenkline9@gmail.com</a>><br>
> Reviewed-by: Nate DeSimone <<a href="mailto:nathaniel.l.desimone@intel.com" target="_blank">nathaniel.l.desimone@intel.com</a>><br>
> ---<br>
> <br>
> Notes:<br>
>     v2:<br>
>     - code style changes to fix indents and comments [Hao A Wu]<br>
> <br>
>  MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h       |  26 +-<br>
>  MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c           |   2 +-<br>
>  MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c | 321<br>
> +++++++++++++++-----<br>
>  3 files changed, 271 insertions(+), 78 deletions(-)<br>
> <br>
> diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h<br>
> b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h<br>
> index 360e58e84743..1eab439531dc 100644<br>
> --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h<br>
> +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h<br>
> @@ -122,7 +122,12 @@ typedef struct {<br>
>    EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL   SimpleInputEx;   LIST_ENTRY<br>
> NotifyList;   EFI_EVENT                           KeyNotifyProcessEvent;+  BOOLEAN<br>
> DecSpecialGraphicsMode; } TERMINAL_DEV;+//+// This the length the<br>
> escape sequences for entering and exiting Dec Special Graphics<br>
> Mode+//+#define LENGTH_DEC_ESCAPE                 0x03  #define<br>
> INPUT_STATE_DEFAULT               0x00 #define INPUT_STATE_ESC<br>
> 0x01@@ -169,6 +174,7 @@ typedef struct {<br>
>    UINT16  Unicode;   CHAR8   PcAnsi;   CHAR8   Ascii;+  CHAR8<br>
> DecSpecialGraphics; } UNICODE_TO_CHAR;  //@@ -1367,20 +1373,22 @@<br>
> Utf8ToUnicode (<br>
>  /**   Detects if a Unicode char is for Box Drawing text graphics. -  @param<br>
> Graphic      Unicode char to test.-  @param  PcAnsi       Optional pointer to<br>
> return PCANSI equivalent of-                       Graphic.-  @param  Ascii        Optional<br>
> pointer to return ASCII equivalent of-                       Graphic.--  @retval TRUE<br>
> If Graphic is a supported Unicode Box Drawing character.+  @param  Graphic<br>
> Unicode char to test.+  @param  PcAnsi              Optional pointer to return<br>
> PCANSI equivalent of+                              Graphic.+  @param  Ascii<br>
> Optional pointer to return ASCII equivalent of+                              Graphic.+<br>
> @param  DecSpecialGraphics  Optional pointer to return Dec Special Graphics<br>
> equivalent of+                              Graphic.+  @retval TRUE                If Graphic is a<br>
> supported Unicode Box Drawing character.  **/ BOOLEAN<br>
> TerminalIsValidTextGraphics (   IN  CHAR16  Graphic,-  OUT CHAR8   *PcAnsi,<br>
> OPTIONAL-  OUT CHAR8   *Ascii OPTIONAL+  OUT CHAR8   *PcAnsi,<br>
> OPTIONAL+  OUT CHAR8   *Ascii,             OPTIONAL+  OUT CHAR8<br>
> *DecSpecialGraphics OPTIONAL   );  /**diff --git<br>
> a/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c<br>
> b/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c<br>
> index f117d90b9de3..5ae5a4f0212e 100644<br>
> --- a/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c<br>
> +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c<br>
> @@ -63,7 +63,7 @@ AnsiTestString (<br>
>       if ( !(TerminalIsValidAscii (*WString) ||         TerminalIsValidEfiCntlChar<br>
> (*WString) ||-        TerminalIsValidTextGraphics (*WString, &GraphicChar,<br>
> NULL) )) {+        TerminalIsValidTextGraphics (*WString, &GraphicChar, NULL,<br>
> NULL) )) {        return EFI_UNSUPPORTED;     }diff --git<br>
> a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c<br>
> b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c<br>
> index aae470e9562c..6da1fa64a2f3 100644<br>
> --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c<br>
> +++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c<br>
> @@ -16,61 +16,59 @@ SPDX-License-Identifier: BSD-2-Clause-Patent<br>
>  // // UNICODE_TO_CHAR  UnicodeToPcAnsiOrAscii[] = {-<br>
> { BOXDRAW_HORIZONTAL,                 0xc4, L'-' },-  { BOXDRAW_VERTICAL,<br>
> 0xb3, L'|' },-  { BOXDRAW_DOWN_RIGHT,                 0xda, L'/' },-<br>
> { BOXDRAW_DOWN_LEFT,                  0xbf, L'\\' },-  { BOXDRAW_UP_RIGHT,<br>
> 0xc0, L'\\' },-  { BOXDRAW_UP_LEFT,                    0xd9, L'/' },-<br>
> { BOXDRAW_VERTICAL_RIGHT,             0xc3, L'|' },-<br>
> { BOXDRAW_VERTICAL_LEFT,              0xb4, L'|' },-<br>
> { BOXDRAW_DOWN_HORIZONTAL,            0xc2, L'+' },-<br>
> { BOXDRAW_UP_HORIZONTAL,              0xc1, L'+' },-<br>
> { BOXDRAW_VERTICAL_HORIZONTAL,        0xc5, L'+' },-<br>
> { BOXDRAW_DOUBLE_HORIZONTAL,          0xcd, L'-' },-<br>
> { BOXDRAW_DOUBLE_VERTICAL,            0xba, L'|' },-<br>
> { BOXDRAW_DOWN_RIGHT_DOUBLE,          0xd5, L'/' },-<br>
> { BOXDRAW_DOWN_DOUBLE_RIGHT,          0xd6, L'/' },-<br>
> { BOXDRAW_DOUBLE_DOWN_RIGHT,          0xc9, L'/' },-<br>
> { BOXDRAW_DOWN_LEFT_DOUBLE,           0xb8, L'\\' },-<br>
> { BOXDRAW_DOWN_DOUBLE_LEFT,           0xb7, L'\\' },-<br>
> { BOXDRAW_DOUBLE_DOWN_LEFT,           0xbb, L'\\' },-<br>
> { BOXDRAW_UP_RIGHT_DOUBLE,            0xd4, L'\\' },-<br>
> { BOXDRAW_UP_DOUBLE_RIGHT,            0xd3, L'\\' },-<br>
> { BOXDRAW_DOUBLE_UP_RIGHT,            0xc8, L'\\' },-<br>
> { BOXDRAW_UP_LEFT_DOUBLE,             0xbe, L'/' },-<br>
> { BOXDRAW_UP_DOUBLE_LEFT,             0xbd, L'/' },-<br>
> { BOXDRAW_DOUBLE_UP_LEFT,             0xbc, L'/' },-<br>
> { BOXDRAW_VERTICAL_RIGHT_DOUBLE,      0xc6, L'|' },-<br>
> { BOXDRAW_VERTICAL_DOUBLE_RIGHT,      0xc7, L'|' },-<br>
> { BOXDRAW_DOUBLE_VERTICAL_RIGHT,      0xcc, L'|' },-<br>
> { BOXDRAW_VERTICAL_LEFT_DOUBLE,       0xb5, L'|' },-<br>
> { BOXDRAW_VERTICAL_DOUBLE_LEFT,       0xb6, L'|' },-<br>
> { BOXDRAW_DOUBLE_VERTICAL_LEFT,       0xb9, L'|' },-<br>
> { BOXDRAW_DOWN_HORIZONTAL_DOUBLE,     0xd1, L'+' },-<br>
> { BOXDRAW_DOWN_DOUBLE_HORIZONTAL,     0xd2, L'+' },-<br>
> { BOXDRAW_DOUBLE_DOWN_HORIZONTAL,     0xcb, L'+' },-<br>
> { BOXDRAW_UP_HORIZONTAL_DOUBLE,       0xcf, L'+' },-<br>
> { BOXDRAW_UP_DOUBLE_HORIZONTAL,       0xd0, L'+' },-<br>
> { BOXDRAW_DOUBLE_UP_HORIZONTAL,       0xca, L'+' },-<br>
> { BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE, 0xd8, L'+' },-<br>
> { BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL, 0xd7, L'+' },-<br>
> { BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL, 0xce, L'+' },+<br>
> { BOXDRAW_HORIZONTAL,                 0xc4, L'-',  0x71 },+  { BOXDRAW_VERTICAL,<br>
> 0xb3, L'|',  0x78 },+  { BOXDRAW_DOWN_RIGHT,                 0xda, L'/',  0x6c },+<br>
> { BOXDRAW_DOWN_LEFT,                  0xbf, L'\\', 0x6b },+<br>
> { BOXDRAW_UP_RIGHT,                   0xc0, L'\\', 0x6d },+  { BOXDRAW_UP_LEFT,<br>
> 0xd9, L'/',  0x6a },+  { BOXDRAW_VERTICAL_RIGHT,             0xc3, L'|',  0x74 },+<br>
> { BOXDRAW_VERTICAL_LEFT,              0xb4, L'|',  0x75 },+<br>
> { BOXDRAW_DOWN_HORIZONTAL,            0xc2, L'+',  0x77 },+<br>
> { BOXDRAW_UP_HORIZONTAL,              0xc1, L'+',  0x76 },+<br>
> { BOXDRAW_VERTICAL_HORIZONTAL,        0xc5, L'+',  0x6e },+<br>
> { BOXDRAW_DOUBLE_HORIZONTAL,          0xcd, L'-',  0x71 },+<br>
> { BOXDRAW_DOUBLE_VERTICAL,            0xba, L'|',  0x78 },+<br>
> { BOXDRAW_DOWN_RIGHT_DOUBLE,          0xd5, L'/',  0x6c },+<br>
> { BOXDRAW_DOWN_DOUBLE_RIGHT,          0xd6, L'/',  0x6c },+<br>
> { BOXDRAW_DOUBLE_DOWN_RIGHT,          0xc9, L'/',  0x6c },+<br>
> { BOXDRAW_DOWN_LEFT_DOUBLE,           0xb8, L'\\', 0x6b },+<br>
> { BOXDRAW_DOWN_DOUBLE_LEFT,           0xb7, L'\\', 0x6b },+<br>
> { BOXDRAW_DOUBLE_DOWN_LEFT,           0xbb, L'\\', 0x6b },+<br>
> { BOXDRAW_UP_RIGHT_DOUBLE,            0xd4, L'\\', 0x6d },+<br>
> { BOXDRAW_UP_DOUBLE_RIGHT,            0xd3, L'\\', 0x6d },+<br>
> { BOXDRAW_DOUBLE_UP_RIGHT,            0xc8, L'\\', 0x6d },+<br>
> { BOXDRAW_UP_LEFT_DOUBLE,             0xbe, L'/',  0x6a },+<br>
> { BOXDRAW_UP_DOUBLE_LEFT,             0xbd, L'/',  0x6a },+<br>
> { BOXDRAW_DOUBLE_UP_LEFT,             0xbc, L'/',  0x6a },+<br>
> { BOXDRAW_VERTICAL_RIGHT_DOUBLE,      0xc6, L'|',  0x74 },+<br>
> { BOXDRAW_VERTICAL_DOUBLE_RIGHT,      0xc7, L'|',  0x74 },+<br>
> { BOXDRAW_DOUBLE_VERTICAL_RIGHT,      0xcc, L'|',  0x74 },+<br>
> { BOXDRAW_VERTICAL_LEFT_DOUBLE,       0xb5, L'|',  0x75 },+<br>
> { BOXDRAW_VERTICAL_DOUBLE_LEFT,       0xb6, L'|',  0x75 },+<br>
> { BOXDRAW_DOUBLE_VERTICAL_LEFT,       0xb9, L'|',  0x75 },+<br>
> { BOXDRAW_DOWN_HORIZONTAL_DOUBLE,     0xd1, L'+',  0x77 },+<br>
> { BOXDRAW_DOWN_DOUBLE_HORIZONTAL,     0xd2, L'+',  0x77 },+<br>
> { BOXDRAW_DOUBLE_DOWN_HORIZONTAL,     0xcb, L'+',  0x77 },+<br>
> { BOXDRAW_UP_HORIZONTAL_DOUBLE,       0xcf, L'+',  0x76 },+<br>
> { BOXDRAW_UP_DOUBLE_HORIZONTAL,       0xd0, L'+',  0x76 },+<br>
> { BOXDRAW_DOUBLE_UP_HORIZONTAL,       0xca, L'+',  0x76 },+<br>
> { BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE, 0xd8, L'+',  0x6e },+<br>
> { BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL, 0xd7, L'+',  0x6e },+<br>
> { BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL, 0xce, L'+',  0x6e }, -<br>
> { BLOCKELEMENT_FULL_BLOCK,            0xdb, L'*' },-<br>
> { BLOCKELEMENT_LIGHT_SHADE,           0xb0, L'+' },+<br>
> { BLOCKELEMENT_FULL_BLOCK,            0xdb, L'*',  0x61 },+<br>
> { BLOCKELEMENT_LIGHT_SHADE,           0xb0, L'+',  0x61 }, -<br>
> { GEOMETRICSHAPE_UP_TRIANGLE,         '^', L'^' },-<br>
> { GEOMETRICSHAPE_RIGHT_TRIANGLE,      '>', L'>' },-<br>
> { GEOMETRICSHAPE_DOWN_TRIANGLE,       'v', L'v' },-<br>
> { GEOMETRICSHAPE_LEFT_TRIANGLE,       '<', L'<' },+<br>
> { GEOMETRICSHAPE_UP_TRIANGLE,         '^',  L'^',  L'^' },+<br>
> { GEOMETRICSHAPE_RIGHT_TRIANGLE,      '>',  L'>',  L'>' },+<br>
> { GEOMETRICSHAPE_DOWN_TRIANGLE,       'v',  L'v',  L'v' },+<br>
> { GEOMETRICSHAPE_LEFT_TRIANGLE,       '<',  L'<',  L'<' }, -  { ARROW_LEFT,<br>
> '<', L'<' },-  { ARROW_UP,                           '^', L'^' },-  { ARROW_RIGHT,<br>
> '>', L'>' },-  { ARROW_DOWN,                         'v', L'v' },--  { 0x0000,<br>
> 0x00, L'\0' }+  { ARROW_LEFT,                         '<',  L'<',  L'<' },+  { ARROW_UP,<br>
> '^',  L'^',  L'^' },+  { ARROW_RIGHT,                        '>',  L'>',  L'>' },+<br>
> { ARROW_DOWN,                         'v',  L'v',  L'v' }, };  CHAR16 mSetModeString[]<br>
> = { ESC, '[', '=', '3', 'h', 0 };@@ -80,6 +78,8 @@ CHAR16<br>
> mSetCursorPositionString[]  = { ESC, '[', '0', '0', ';', '0', '0', 'H', 0<br>
>  CHAR16 mCursorForwardString[]      = { ESC, '[', '0', '0', 'C', 0 }; CHAR16<br>
> mCursorBackwardString[]     = { ESC, '[', '0', '0', 'D', 0 }; +CHAR8<br>
> SetDecModeString[]          = {ESC, 0x28, 0x30};+CHAR8  ExitDecModeString[]<br>
> = {ESC, 0x28, 0x42}; // // Body of the ConOut functions //@@ -183,16 +183,19<br>
> @@ TerminalConOutOutputString (<br>
>    EFI_STATUS                  Status;   UINT8                       ValidBytes;   CHAR8<br>
> CrLfStr[2];+  CHAR8                       DecChar;+  UINTN<br>
> ModeSwitchLength;   //   //  flag used to indicate whether condition happens<br>
> which will cause   //  return EFI_WARN_UNKNOWN_GLYPH   //   BOOLEAN<br>
> Warning; -  ValidBytes  = 0;-  Warning     = FALSE;-  AsciiChar   = 0;-+  ValidBytes<br>
> = 0;+  Warning          = FALSE;+  AsciiChar        = 0;+  DecChar          = 0;+<br>
> ModeSwitchLength = LENGTH_DEC_ESCAPE;   //   //  get Terminal device data<br>
> structure pointer.   //@@ -217,17 +220,137 @@ TerminalConOutOutputString<br>
> (<br>
>    for (; *WString != CHAR_NULL; WString++) {      switch (TerminalDevice-<br>
> >TerminalType) {-     case TerminalTypePcAnsi:-    case TerminalTypeVt100:-<br>
> case TerminalTypeVt100Plus:-    case TerminalTypeTtyTerm:-    case<br>
> TerminalTypeLinux:+      if (!TerminalIsValidTextGraphics (*WString,<br>
> &GraphicChar, &AsciiChar, NULL)) {+        //+        // If it's not a graphic<br>
> character convert Unicode to ASCII.+        //+        GraphicChar =<br>
> (CHAR8)*WString;++        if (!(TerminalIsValidAscii (GraphicChar) ||<br>
> TerminalIsValidEfiCntlChar (GraphicChar))) {+          //+          // when this driver<br>
> use the OutputString to output control string,+          // TerminalDevice-<br>
> >OutputEscChar is set to let the Esc char+          // to be output to the terminal<br>
> emulation software.+          //+          if ((GraphicChar == 27) &&<br>
> TerminalDevice->OutputEscChar) {+            GraphicChar = 27;+          } else {+<br>
> GraphicChar = '?';+            Warning     = TRUE;+          }+        }++        AsciiChar =<br>
> GraphicChar;+      }+      Length = 1;+      Status = TerminalDevice->SerialIo-<br>
> >Write (+                                          TerminalDevice->SerialIo,+<br>
> &Length,+                                          &GraphicChar+                                          );++      if<br>
> (EFI_ERROR (Status)) {+        goto OutputError;+      }++      break;     case<br>
> TerminalTypeXtermR6:-    case TerminalTypeVt400:     case<br>
> TerminalTypeSCO:+      if (TerminalIsValidTextGraphics (*WString, NULL, NULL,<br>
> &DecChar) && !TerminalIsValidAscii (*WString)) {+        //+        // Box graphics<br>
> are split into 2 types simple and advanced.+        // Simple are drawn with dec<br>
> special graphics.+        // Advanced are drawn with utf8.+        // This checks for<br>
> simple because they have a lower value than the advanced.+        if(*WString<br>
> < BOXDRAW_DOUBLE_HORIZONTAL) {+          if (!TerminalDevice-<br>
> >DecSpecialGraphicsMode) {+            ValidBytes = 0;+<br>
> ModeSwitchLength = LENGTH_DEC_ESCAPE;+            Status = TerminalDevice-<br>
> >SerialIo->Write (+                                                TerminalDevice->SerialIo,+<br>
> &ModeSwitchLength,+                                                (UINT8<br>
> *)SetDecModeString+                                                );+            TerminalDevice-<br>
> >DecSpecialGraphicsMode = TRUE;+          } -      if<br>
> (!TerminalIsValidTextGraphics (*WString, &GraphicChar, &AsciiChar)) {+<br>
> GraphicChar = DecChar;+          Length = 1;+        } else {+          if<br>
> (TerminalDevice->DecSpecialGraphicsMode) {+            ModeSwitchLength =<br>
> LENGTH_DEC_ESCAPE;+            Status = TerminalDevice->SerialIo->Write (+<br>
> TerminalDevice->SerialIo,+                                                &ModeSwitchLength,+<br>
> (UINT8 *)ExitDecModeString+                                                );+              if (EFI_ERROR<br>
> (Status)) {+                goto OutputError;+              }++           TerminalDevice-<br>
> >DecSpecialGraphicsMode = FALSE;+          }++          UnicodeToUtf8 (*WString,<br>
> &Utf8Char, &ValidBytes);+          Length = ValidBytes;+        }+      } else {+        if<br>
> (TerminalDevice->DecSpecialGraphicsMode) {+          Status = TerminalDevice-<br>
> >SerialIo->Write (+                                              TerminalDevice->SerialIo,+<br>
> &ModeSwitchLength,+                                              (UINT8<br>
> *)ExitDecModeString+                                              );+          if (EFI_ERROR (Status))<br>
> {+            goto OutputError;+          }++          TerminalDevice-<br>
> >DecSpecialGraphicsMode = FALSE;+        }++        GraphicChar =<br>
> (CHAR8)*WString;++        if (!(TerminalIsValidAscii (GraphicChar) ||<br>
> TerminalIsValidEfiCntlChar (GraphicChar))) {+          //+          // when this driver<br>
> use the OutputString to output control string,+          // TerminalDevice-<br>
> >OutputEscChar is set to let the Esc char+          // to be output to the terminal<br>
> emulation software.+          //+          if ((GraphicChar == 27) &&<br>
> TerminalDevice->OutputEscChar) {+            GraphicChar = 27;+            Length =<br>
> 1;+          } else {+            UnicodeToUtf8 (*WString, &Utf8Char, &ValidBytes);+<br>
> Length = ValidBytes;+          }+        } else {+          Length = 1;+        }+      }++      if<br>
> (ValidBytes) {+        Status = TerminalDevice->SerialIo->Write (+<br>
> TerminalDevice->SerialIo,+                                            &Length,+<br>
> (UINT8 *)&Utf8Char+                                            );+        ValidBytes = 0;+      } else {+<br>
> Status = TerminalDevice->SerialIo->Write (+<br>
> TerminalDevice->SerialIo,+                                            &Length,+<br>
> &GraphicChar+                                            );+      }+    if (EFI_ERROR (Status)) {+<br>
> goto OutputError;+    }++    break;+    case TerminalTypeVt100:+    case<br>
> TerminalTypeTtyTerm:+      if (!TerminalIsValidTextGraphics (*WString,<br>
> &GraphicChar, &AsciiChar, NULL)) {         //         // If it's not a graphic character<br>
> convert Unicode to ASCII.         //@@ -248,14 +371,70 @@<br>
> TerminalConOutOutputString (<br>
>          }          AsciiChar = GraphicChar;-       } -      if (TerminalDevice-<br>
> >TerminalType != TerminalTypePcAnsi) {-        GraphicChar = AsciiChar;+<br>
> GraphicChar = AsciiChar;++      Length = 1;++      Status = TerminalDevice-<br>
> >SerialIo->Write (+                                          TerminalDevice->SerialIo,+<br>
> &Length,+                                          &GraphicChar+                                          );++      if<br>
> (EFI_ERROR (Status)) {+        goto OutputError;       } +        break;+    case<br>
> TerminalTypeVt100Plus:+    case TerminalTypeVt400:       Length = 1;+      if<br>
> (TerminalIsValidTextGraphics (*WString, NULL, NULL, &DecChar)) {+        if<br>
> (!TerminalDevice->DecSpecialGraphicsMode) {+          ModeSwitchLength =<br>
> LENGTH_DEC_ESCAPE;+          Status = TerminalDevice->SerialIo->Write (+<br>
> TerminalDevice->SerialIo,+                                              &ModeSwitchLength,+<br>
> (UINT8 *)SetDecModeString+                                              );+          TerminalDevice-<br>
> >DecSpecialGraphicsMode = TRUE;+        }++      GraphicChar = DecChar;+      }<br>
> else {+        if (TerminalDevice->DecSpecialGraphicsMode) {+<br>
> ModeSwitchLength = LENGTH_DEC_ESCAPE;+          Status = TerminalDevice-<br>
> >SerialIo->Write (+                                              TerminalDevice->SerialIo,+<br>
> &ModeSwitchLength,+                                              (UINT8<br>
> *)ExitDecModeString+                                              );++          if (EFI_ERROR (Status))<br>
> {+            goto OutputError;+          }++          TerminalDevice-<br>
> >DecSpecialGraphicsMode = FALSE;+        }++        GraphicChar =<br>
> (CHAR8)*WString;++        if (!(TerminalIsValidAscii (GraphicChar) ||<br>
> TerminalIsValidEfiCntlChar (GraphicChar))) {+          //+          // when this driver<br>
> use the OutputString to output control string,+          // TerminalDevice-<br>
> >OutputEscChar is set to let the Esc char+          // to be output to the terminal<br>
> emulation software.+          //+          if ((GraphicChar == 27) &&<br>
> TerminalDevice->OutputEscChar) {+            GraphicChar = 27;+          } else {+<br>
> GraphicChar = '?';+            Warning     = TRUE;+          }+        }+      }        Status =<br>
> TerminalDevice->SerialIo->Write (                                           TerminalDevice-<br>
> >SerialIo,@@ -268,7 +447,7 @@ TerminalConOutOutputString (<br>
>        }        break;-+    case TerminalTypeLinux:     case TerminalTypeVtUtf8:<br>
> UnicodeToUtf8 (*WString, &Utf8Char, &ValidBytes);       Length =<br>
> ValidBytes;@@ -280,8 +459,10 @@ TerminalConOutOutputString (<br>
>        if (EFI_ERROR (Status)) {         goto OutputError;       }+       break;     }+     //<br>
> //  Update cursor position.     //@@ -875,7 +1056,8 @@ BOOLEAN<br>
>  TerminalIsValidTextGraphics (   IN  CHAR16  Graphic,   OUT CHAR8   *PcAnsi,<br>
> OPTIONAL-  OUT CHAR8   *Ascii OPTIONAL+  OUT CHAR8   *Ascii, OPTIONAL+<br>
> OUT CHAR8   *DecSpecialGraphics OPTIONAL   ) {   UNICODE_TO_CHAR<br>
> *Table;@@ -897,6 +1079,9 @@ TerminalIsValidTextGraphics (<br>
>        if (Ascii != NULL) {         *Ascii = Table->Ascii;       }+      if<br>
> (DecSpecialGraphics != NULL){+        *DecSpecialGraphics = Table-<br>
> >DecSpecialGraphics;+      }        return TRUE;     }--<br>
> 2.32.0<br>
> <br>
> <br>
> <br>
> -=-=-=-=-=-=<br>
> Groups.io Links: You receive all messages sent to this group.<br>
> View/Reply Online (#79214): <a href="https://edk2.groups.io/g/devel/message/79214" rel="noreferrer" target="_blank">https://edk2.groups.io/g/devel/message/79214</a><br>
> Mute This Topic: <a href="https://groups.io/mt/84853186/1768756" rel="noreferrer" target="_blank">https://groups.io/mt/84853186/1768756</a><br>
> Group Owner: <a href="mailto:devel%2Bowner@edk2.groups.io" target="_blank">devel+owner@edk2.groups.io</a><br>
> Unsubscribe: <a href="https://edk2.groups.io/g/devel/unsub" rel="noreferrer" target="_blank">https://edk2.groups.io/g/devel/unsub</a> [<a href="mailto:zhichao.gao@intel.com" target="_blank">zhichao.gao@intel.com</a>]<br>
> -=-=-=-=-=-=<br>
> <br>
<br>
</blockquote></div>


 <div width="1" style="color:white;clear:both">_._,_._,_</div> <hr>   Groups.io Links:<p>   You receive all messages sent to this group.    <p> <a target="_blank" href="https://edk2.groups.io/g/devel/message/79693">View/Reply Online (#79693)</a> |    |  <a target="_blank" href="https://groups.io/mt/84853186/1813853">Mute This Topic</a>  | <a href="https://edk2.groups.io/g/devel/post">New Topic</a><br>    <a href="https://edk2.groups.io/g/devel/editsub/1813853">Your Subscription</a> | <a href="mailto:devel+owner@edk2.groups.io">Contact Group Owner</a> |  <a href="https://edk2.groups.io/g/devel/unsub">Unsubscribe</a>  [edk2-devel-archive@redhat.com]<br> <div width="1" style="color:white;clear:both">_._,_._,_</div>