<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>