From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-yb1-f177.google.com (mail-yb1-f177.google.com [209.85.219.177]) by mx.groups.io with SMTP id smtpd.web12.18822.1629686966833737597 for ; Sun, 22 Aug 2021 19:49:27 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20161025 header.b=OFhUktk3; spf=pass (domain: gmail.com, ip: 209.85.219.177, mailfrom: cadenkline9@gmail.com) Received: by mail-yb1-f177.google.com with SMTP id z18so31273868ybg.8 for ; Sun, 22 Aug 2021 19:49:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=62zppeEBrHWXa4C00bejxjBEkwOUcQCXxYeWXjMHMCw=; b=OFhUktk31d6Xf3vDsq1dkGK/UUYIM3AodqfJWZXNPjpyETR1vphXDRtzSkXoMSezrV Ww8mB05scfiCKNugc1dP9Btr9bvF5nEEa2u2zAbxDfCbqF6DqqlltvKhXunhmdV4nHOP xiQuXQf6rxpkQWif2yqr1WWmKH1WDBAi7nwkVPlOoshqlASWRTnsz9zz3mNfhpZENFWK f9szkzKLeK9EyaVqUiKHjxYJyRcpmqWtfYePJPKmjTnBZd2Ewqndnnrg0DTyxnGs4LBI WjJIlr3pGH4AXVF0ngsVjOIhFHhiEqW0RmxVPjlW5eXSSgTwlpHSOx5u8BfVvPff9ruT feeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=62zppeEBrHWXa4C00bejxjBEkwOUcQCXxYeWXjMHMCw=; b=riKOB5rVKnMPQhmEaZ/+2yrBLkb8auRX4hPxxy2bUuEwAB7vzwJ2/G96RvEa95rjto Ju1rDObYGkAK8zVLHlKUFf2heWFvPQrq+v4nry2aIzgz/PLF9ryv0OZMIDh6a6Vbow9S Wk+LJVjt6OlVeB37Nnpi2JucBPmMQKeiZc4a7eP7J5W9s0iTPsdClgSUOqxusUZZiiTm jxdAG+YrB5VcAIMqwdIkPMzgKShV/LDsHPitwEumSFvDONnvM15hNOJLCdTOI/BamCWU YrVcoxcwlbyQFxQrKbAWIz81Q629QwIAdUyXgObJSFKnDSVUeeLLe7g23prACTeEgBFL OcLw== X-Gm-Message-State: AOAM533cx+7neLAzQD30yZiejOylYLLc3FHJ+csv5hm/uy/yfGHBEAOc dfHB7dGZIeE0cOTJ3XwGEw5XZDkD6w0kNBg9OIY= X-Google-Smtp-Source: ABdhPJwRQzJFSzdNHQhJyw6RcFZRzpIQSFsxM+Hou+O37WH1h+lHrUci5Vsky2v08hL2lZstG3kbHOnL9O04TXJIcS0= X-Received: by 2002:a25:8082:: with SMTP id n2mr40457371ybk.79.1629686965930; Sun, 22 Aug 2021 19:49:25 -0700 (PDT) MIME-Version: 1.0 References: <20210813000022.1145416-1-cadenkline9@gmail.com> <20210813000022.1145416-2-cadenkline9@gmail.com> In-Reply-To: From: "Caden Kline" Date: Sun, 22 Aug 2021 22:49:14 -0400 Message-ID: Subject: Re: [edk2-devel] [PATCH v2 1/1] MdeModulePkg/Console: Improve encoding of box drawing characters To: "Gao, Zhichao" Cc: "devel@edk2.groups.io" , "Wang, Jian J" , "Wu, Hao A" , "Ni, Ray" , "Desimone, Nathaniel L" Content-Type: multipart/alternative; boundary="000000000000b30ddd05ca3110db" --000000000000b30ddd05ca3110db Content-Type: text/plain; charset="UTF-8" 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. I'm not sure how to bring the other threads into this one. So here are the links to v3 https://edk2.groups.io/g/devel/message/79691 https://edk2.groups.io/g/devel/message/79692 On Tue, Aug 17, 2021 at 9:50 PM Gao, Zhichao wrote: > Hi Caden/Nate, > > This patch aims to make the terminal output character set to be expected > as > https://github.com/tianocore/tianocore.github.io/wiki/Tasks-Terminal-driver-improvements > . > 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. > > For the poor man's line drawing, our code is using '\' and '/' instead of > '+'. Should we change it to match the table? > > Caden, > > 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 > https://github.com/ZhichaoGao/edk2/commit/b9a47188d7228a47897413ca73c265143edfec29#diff-e3ef4106fc8f77b7d4ac5679f4104281cbf9a0322606703f2a6be152960c1125R300 > . > > Thanks, > Zhichao > > > > > -----Original Message----- > > From: devel@edk2.groups.io On Behalf Of Caden > > Kline > > Sent: Friday, August 13, 2021 8:00 AM > > To: devel@edk2.groups.io > > Cc: Wang, Jian J ; Wu, Hao A >; > > Gao, Zhichao ; Ni, Ray ; > > Desimone, Nathaniel L > > Subject: [edk2-devel] [PATCH v2 1/1] MdeModulePkg/Console: Improve > > encoding of box drawing characters > > > > Improved encoding of box drawing characters for different terminal types. > > This includes Dec special graphics mode and more utf8. > > > > Cc: Jian J Wang > > Cc: Hao A Wu > > Cc: Zhichao Gao > > Cc: Ray Ni > > Signed-off-by: Caden Kline > > Reviewed-by: Nate DeSimone > > --- > > > > Notes: > > v2: > > - code style changes to fix indents and comments [Hao A Wu] > > > > MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h | 26 +- > > MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c | 2 +- > > MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c | 321 > > +++++++++++++++----- > > 3 files changed, 271 insertions(+), 78 deletions(-) > > > > diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h > > b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h > > index 360e58e84743..1eab439531dc 100644 > > --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h > > +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h > > @@ -122,7 +122,12 @@ typedef struct { > > EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleInputEx; LIST_ENTRY > > NotifyList; EFI_EVENT > KeyNotifyProcessEvent;+ BOOLEAN > > DecSpecialGraphicsMode; } TERMINAL_DEV;+//+// This the length the > > escape sequences for entering and exiting Dec Special Graphics > > Mode+//+#define LENGTH_DEC_ESCAPE 0x03 #define > > INPUT_STATE_DEFAULT 0x00 #define INPUT_STATE_ESC > > 0x01@@ -169,6 +174,7 @@ typedef struct { > > UINT16 Unicode; CHAR8 PcAnsi; CHAR8 Ascii;+ CHAR8 > > DecSpecialGraphics; } UNICODE_TO_CHAR; //@@ -1367,20 +1373,22 @@ > > Utf8ToUnicode ( > > /** Detects if a Unicode char is for Box Drawing text graphics. - > @param > > Graphic Unicode char to test.- @param PcAnsi Optional > pointer to > > return PCANSI equivalent of- Graphic.- @param > Ascii Optional > > pointer to return ASCII equivalent of- Graphic.-- > @retval TRUE > > If Graphic is a supported Unicode Box Drawing character.+ @param > Graphic > > Unicode char to test.+ @param PcAnsi Optional pointer to > return > > PCANSI equivalent of+ Graphic.+ @param > Ascii > > Optional pointer to return ASCII equivalent of+ > Graphic.+ > > @param DecSpecialGraphics Optional pointer to return Dec Special > Graphics > > equivalent of+ Graphic.+ @retval TRUE > If Graphic is a > > supported Unicode Box Drawing character. **/ BOOLEAN > > TerminalIsValidTextGraphics ( IN CHAR16 Graphic,- OUT CHAR8 > *PcAnsi, > > OPTIONAL- OUT CHAR8 *Ascii OPTIONAL+ OUT CHAR8 *PcAnsi, > > OPTIONAL+ OUT CHAR8 *Ascii, OPTIONAL+ OUT CHAR8 > > *DecSpecialGraphics OPTIONAL ); /**diff --git > > a/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c > > b/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c > > index f117d90b9de3..5ae5a4f0212e 100644 > > --- a/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c > > +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c > > @@ -63,7 +63,7 @@ AnsiTestString ( > > if ( !(TerminalIsValidAscii (*WString) || > TerminalIsValidEfiCntlChar > > (*WString) ||- TerminalIsValidTextGraphics (*WString, > &GraphicChar, > > NULL) )) {+ TerminalIsValidTextGraphics (*WString, &GraphicChar, > NULL, > > NULL) )) { return EFI_UNSUPPORTED; }diff --git > > a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c > > b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c > > index aae470e9562c..6da1fa64a2f3 100644 > > --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c > > +++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c > > @@ -16,61 +16,59 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > > // // UNICODE_TO_CHAR UnicodeToPcAnsiOrAscii[] = {- > > { BOXDRAW_HORIZONTAL, 0xc4, L'-' },- { BOXDRAW_VERTICAL, > > 0xb3, L'|' },- { BOXDRAW_DOWN_RIGHT, 0xda, L'/' },- > > { BOXDRAW_DOWN_LEFT, 0xbf, L'\\' },- { > BOXDRAW_UP_RIGHT, > > 0xc0, L'\\' },- { BOXDRAW_UP_LEFT, 0xd9, L'/' },- > > { BOXDRAW_VERTICAL_RIGHT, 0xc3, L'|' },- > > { BOXDRAW_VERTICAL_LEFT, 0xb4, L'|' },- > > { BOXDRAW_DOWN_HORIZONTAL, 0xc2, L'+' },- > > { BOXDRAW_UP_HORIZONTAL, 0xc1, L'+' },- > > { BOXDRAW_VERTICAL_HORIZONTAL, 0xc5, L'+' },- > > { BOXDRAW_DOUBLE_HORIZONTAL, 0xcd, L'-' },- > > { BOXDRAW_DOUBLE_VERTICAL, 0xba, L'|' },- > > { BOXDRAW_DOWN_RIGHT_DOUBLE, 0xd5, L'/' },- > > { BOXDRAW_DOWN_DOUBLE_RIGHT, 0xd6, L'/' },- > > { BOXDRAW_DOUBLE_DOWN_RIGHT, 0xc9, L'/' },- > > { BOXDRAW_DOWN_LEFT_DOUBLE, 0xb8, L'\\' },- > > { BOXDRAW_DOWN_DOUBLE_LEFT, 0xb7, L'\\' },- > > { BOXDRAW_DOUBLE_DOWN_LEFT, 0xbb, L'\\' },- > > { BOXDRAW_UP_RIGHT_DOUBLE, 0xd4, L'\\' },- > > { BOXDRAW_UP_DOUBLE_RIGHT, 0xd3, L'\\' },- > > { BOXDRAW_DOUBLE_UP_RIGHT, 0xc8, L'\\' },- > > { BOXDRAW_UP_LEFT_DOUBLE, 0xbe, L'/' },- > > { BOXDRAW_UP_DOUBLE_LEFT, 0xbd, L'/' },- > > { BOXDRAW_DOUBLE_UP_LEFT, 0xbc, L'/' },- > > { BOXDRAW_VERTICAL_RIGHT_DOUBLE, 0xc6, L'|' },- > > { BOXDRAW_VERTICAL_DOUBLE_RIGHT, 0xc7, L'|' },- > > { BOXDRAW_DOUBLE_VERTICAL_RIGHT, 0xcc, L'|' },- > > { BOXDRAW_VERTICAL_LEFT_DOUBLE, 0xb5, L'|' },- > > { BOXDRAW_VERTICAL_DOUBLE_LEFT, 0xb6, L'|' },- > > { BOXDRAW_DOUBLE_VERTICAL_LEFT, 0xb9, L'|' },- > > { BOXDRAW_DOWN_HORIZONTAL_DOUBLE, 0xd1, L'+' },- > > { BOXDRAW_DOWN_DOUBLE_HORIZONTAL, 0xd2, L'+' },- > > { BOXDRAW_DOUBLE_DOWN_HORIZONTAL, 0xcb, L'+' },- > > { BOXDRAW_UP_HORIZONTAL_DOUBLE, 0xcf, L'+' },- > > { BOXDRAW_UP_DOUBLE_HORIZONTAL, 0xd0, L'+' },- > > { BOXDRAW_DOUBLE_UP_HORIZONTAL, 0xca, L'+' },- > > { BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE, 0xd8, L'+' },- > > { BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL, 0xd7, L'+' },- > > { BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL, 0xce, L'+' },+ > > { BOXDRAW_HORIZONTAL, 0xc4, L'-', 0x71 },+ { > BOXDRAW_VERTICAL, > > 0xb3, L'|', 0x78 },+ { BOXDRAW_DOWN_RIGHT, 0xda, > L'/', 0x6c },+ > > { BOXDRAW_DOWN_LEFT, 0xbf, L'\\', 0x6b },+ > > { BOXDRAW_UP_RIGHT, 0xc0, L'\\', 0x6d },+ { > BOXDRAW_UP_LEFT, > > 0xd9, L'/', 0x6a },+ { BOXDRAW_VERTICAL_RIGHT, 0xc3, > L'|', 0x74 },+ > > { BOXDRAW_VERTICAL_LEFT, 0xb4, L'|', 0x75 },+ > > { BOXDRAW_DOWN_HORIZONTAL, 0xc2, L'+', 0x77 },+ > > { BOXDRAW_UP_HORIZONTAL, 0xc1, L'+', 0x76 },+ > > { BOXDRAW_VERTICAL_HORIZONTAL, 0xc5, L'+', 0x6e },+ > > { BOXDRAW_DOUBLE_HORIZONTAL, 0xcd, L'-', 0x71 },+ > > { BOXDRAW_DOUBLE_VERTICAL, 0xba, L'|', 0x78 },+ > > { BOXDRAW_DOWN_RIGHT_DOUBLE, 0xd5, L'/', 0x6c },+ > > { BOXDRAW_DOWN_DOUBLE_RIGHT, 0xd6, L'/', 0x6c },+ > > { BOXDRAW_DOUBLE_DOWN_RIGHT, 0xc9, L'/', 0x6c },+ > > { BOXDRAW_DOWN_LEFT_DOUBLE, 0xb8, L'\\', 0x6b },+ > > { BOXDRAW_DOWN_DOUBLE_LEFT, 0xb7, L'\\', 0x6b },+ > > { BOXDRAW_DOUBLE_DOWN_LEFT, 0xbb, L'\\', 0x6b },+ > > { BOXDRAW_UP_RIGHT_DOUBLE, 0xd4, L'\\', 0x6d },+ > > { BOXDRAW_UP_DOUBLE_RIGHT, 0xd3, L'\\', 0x6d },+ > > { BOXDRAW_DOUBLE_UP_RIGHT, 0xc8, L'\\', 0x6d },+ > > { BOXDRAW_UP_LEFT_DOUBLE, 0xbe, L'/', 0x6a },+ > > { BOXDRAW_UP_DOUBLE_LEFT, 0xbd, L'/', 0x6a },+ > > { BOXDRAW_DOUBLE_UP_LEFT, 0xbc, L'/', 0x6a },+ > > { BOXDRAW_VERTICAL_RIGHT_DOUBLE, 0xc6, L'|', 0x74 },+ > > { BOXDRAW_VERTICAL_DOUBLE_RIGHT, 0xc7, L'|', 0x74 },+ > > { BOXDRAW_DOUBLE_VERTICAL_RIGHT, 0xcc, L'|', 0x74 },+ > > { BOXDRAW_VERTICAL_LEFT_DOUBLE, 0xb5, L'|', 0x75 },+ > > { BOXDRAW_VERTICAL_DOUBLE_LEFT, 0xb6, L'|', 0x75 },+ > > { BOXDRAW_DOUBLE_VERTICAL_LEFT, 0xb9, L'|', 0x75 },+ > > { BOXDRAW_DOWN_HORIZONTAL_DOUBLE, 0xd1, L'+', 0x77 },+ > > { BOXDRAW_DOWN_DOUBLE_HORIZONTAL, 0xd2, L'+', 0x77 },+ > > { BOXDRAW_DOUBLE_DOWN_HORIZONTAL, 0xcb, L'+', 0x77 },+ > > { BOXDRAW_UP_HORIZONTAL_DOUBLE, 0xcf, L'+', 0x76 },+ > > { BOXDRAW_UP_DOUBLE_HORIZONTAL, 0xd0, L'+', 0x76 },+ > > { BOXDRAW_DOUBLE_UP_HORIZONTAL, 0xca, L'+', 0x76 },+ > > { BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE, 0xd8, L'+', 0x6e },+ > > { BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL, 0xd7, L'+', 0x6e },+ > > { BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL, 0xce, L'+', 0x6e }, - > > { BLOCKELEMENT_FULL_BLOCK, 0xdb, L'*' },- > > { BLOCKELEMENT_LIGHT_SHADE, 0xb0, L'+' },+ > > { BLOCKELEMENT_FULL_BLOCK, 0xdb, L'*', 0x61 },+ > > { BLOCKELEMENT_LIGHT_SHADE, 0xb0, L'+', 0x61 }, - > > { GEOMETRICSHAPE_UP_TRIANGLE, '^', L'^' },- > > { GEOMETRICSHAPE_RIGHT_TRIANGLE, '>', L'>' },- > > { GEOMETRICSHAPE_DOWN_TRIANGLE, 'v', L'v' },- > > { GEOMETRICSHAPE_LEFT_TRIANGLE, '<', L'<' },+ > > { GEOMETRICSHAPE_UP_TRIANGLE, '^', L'^', L'^' },+ > > { GEOMETRICSHAPE_RIGHT_TRIANGLE, '>', L'>', L'>' },+ > > { GEOMETRICSHAPE_DOWN_TRIANGLE, 'v', L'v', L'v' },+ > > { GEOMETRICSHAPE_LEFT_TRIANGLE, '<', L'<', L'<' }, - { > ARROW_LEFT, > > '<', L'<' },- { ARROW_UP, '^', L'^' },- { > ARROW_RIGHT, > > '>', L'>' },- { ARROW_DOWN, 'v', L'v' },-- { > 0x0000, > > 0x00, L'\0' }+ { ARROW_LEFT, '<', L'<', L'<' > },+ { ARROW_UP, > > '^', L'^', L'^' },+ { ARROW_RIGHT, '>', > L'>', L'>' },+ > > { ARROW_DOWN, 'v', L'v', L'v' }, }; CHAR16 > mSetModeString[] > > = { ESC, '[', '=', '3', 'h', 0 };@@ -80,6 +78,8 @@ CHAR16 > > mSetCursorPositionString[] = { ESC, '[', '0', '0', ';', '0', '0', 'H', 0 > > CHAR16 mCursorForwardString[] = { ESC, '[', '0', '0', 'C', 0 }; > CHAR16 > > mCursorBackwardString[] = { ESC, '[', '0', '0', 'D', 0 }; +CHAR8 > > SetDecModeString[] = {ESC, 0x28, 0x30};+CHAR8 > ExitDecModeString[] > > = {ESC, 0x28, 0x42}; // // Body of the ConOut functions //@@ -183,16 > +183,19 > > @@ TerminalConOutOutputString ( > > EFI_STATUS Status; UINT8 > ValidBytes; CHAR8 > > CrLfStr[2];+ CHAR8 DecChar;+ UINTN > > ModeSwitchLength; // // flag used to indicate whether condition > happens > > which will cause // return EFI_WARN_UNKNOWN_GLYPH // BOOLEAN > > Warning; - ValidBytes = 0;- Warning = FALSE;- AsciiChar = > 0;-+ ValidBytes > > = 0;+ Warning = FALSE;+ AsciiChar = 0;+ DecChar > = 0;+ > > ModeSwitchLength = LENGTH_DEC_ESCAPE; // // get Terminal device data > > structure pointer. //@@ -217,17 +220,137 @@ TerminalConOutOutputString > > ( > > for (; *WString != CHAR_NULL; WString++) { switch > (TerminalDevice- > > >TerminalType) {- case TerminalTypePcAnsi:- case > TerminalTypeVt100:- > > case TerminalTypeVt100Plus:- case TerminalTypeTtyTerm:- case > > TerminalTypeLinux:+ if (!TerminalIsValidTextGraphics (*WString, > > &GraphicChar, &AsciiChar, NULL)) {+ //+ // If it's not a > graphic > > character convert Unicode to ASCII.+ //+ GraphicChar = > > (CHAR8)*WString;++ if (!(TerminalIsValidAscii (GraphicChar) || > > TerminalIsValidEfiCntlChar (GraphicChar))) {+ //+ // > when this driver > > use the OutputString to output control string,+ // > TerminalDevice- > > >OutputEscChar is set to let the Esc char+ // to be output to > the terminal > > emulation software.+ //+ if ((GraphicChar == 27) && > > TerminalDevice->OutputEscChar) {+ GraphicChar = 27;+ > } else {+ > > GraphicChar = '?';+ Warning = TRUE;+ }+ > }++ AsciiChar = > > GraphicChar;+ }+ Length = 1;+ Status = > TerminalDevice->SerialIo- > > >Write (+ > TerminalDevice->SerialIo,+ > > &Length,+ &GraphicChar+ > );++ if > > (EFI_ERROR (Status)) {+ goto OutputError;+ }++ break; > case > > TerminalTypeXtermR6:- case TerminalTypeVt400: case > > TerminalTypeSCO:+ if (TerminalIsValidTextGraphics (*WString, NULL, > NULL, > > &DecChar) && !TerminalIsValidAscii (*WString)) {+ //+ // > Box graphics > > are split into 2 types simple and advanced.+ // Simple are drawn > with dec > > special graphics.+ // Advanced are drawn with utf8.+ // > This checks for > > simple because they have a lower value than the advanced.+ > if(*WString > > < BOXDRAW_DOUBLE_HORIZONTAL) {+ if (!TerminalDevice- > > >DecSpecialGraphicsMode) {+ ValidBytes = 0;+ > > ModeSwitchLength = LENGTH_DEC_ESCAPE;+ Status = > TerminalDevice- > > >SerialIo->Write (+ > TerminalDevice->SerialIo,+ > > &ModeSwitchLength,+ (UINT8 > > *)SetDecModeString+ );+ > TerminalDevice- > > >DecSpecialGraphicsMode = TRUE;+ } - if > > (!TerminalIsValidTextGraphics (*WString, &GraphicChar, &AsciiChar)) {+ > > GraphicChar = DecChar;+ Length = 1;+ } else {+ > if > > (TerminalDevice->DecSpecialGraphicsMode) {+ ModeSwitchLength = > > LENGTH_DEC_ESCAPE;+ Status = TerminalDevice->SerialIo->Write > (+ > > TerminalDevice->SerialIo,+ > &ModeSwitchLength,+ > > (UINT8 *)ExitDecModeString+ > );+ if (EFI_ERROR > > (Status)) {+ goto OutputError;+ }++ > TerminalDevice- > > >DecSpecialGraphicsMode = FALSE;+ }++ UnicodeToUtf8 > (*WString, > > &Utf8Char, &ValidBytes);+ Length = ValidBytes;+ }+ > } else {+ if > > (TerminalDevice->DecSpecialGraphicsMode) {+ Status = > TerminalDevice- > > >SerialIo->Write (+ > TerminalDevice->SerialIo,+ > > &ModeSwitchLength,+ (UINT8 > > *)ExitDecModeString+ );+ > if (EFI_ERROR (Status)) > > {+ goto OutputError;+ }++ TerminalDevice- > > >DecSpecialGraphicsMode = FALSE;+ }++ GraphicChar = > > (CHAR8)*WString;++ if (!(TerminalIsValidAscii (GraphicChar) || > > TerminalIsValidEfiCntlChar (GraphicChar))) {+ //+ // > when this driver > > use the OutputString to output control string,+ // > TerminalDevice- > > >OutputEscChar is set to let the Esc char+ // to be output to > the terminal > > emulation software.+ //+ if ((GraphicChar == 27) && > > TerminalDevice->OutputEscChar) {+ GraphicChar = 27;+ > Length = > > 1;+ } else {+ UnicodeToUtf8 (*WString, &Utf8Char, > &ValidBytes);+ > > Length = ValidBytes;+ }+ } else {+ Length = > 1;+ }+ }++ if > > (ValidBytes) {+ Status = TerminalDevice->SerialIo->Write (+ > > TerminalDevice->SerialIo,+ > &Length,+ > > (UINT8 *)&Utf8Char+ );+ > ValidBytes = 0;+ } else {+ > > Status = TerminalDevice->SerialIo->Write (+ > > TerminalDevice->SerialIo,+ > &Length,+ > > &GraphicChar+ );+ }+ > if (EFI_ERROR (Status)) {+ > > goto OutputError;+ }++ break;+ case TerminalTypeVt100:+ case > > TerminalTypeTtyTerm:+ if (!TerminalIsValidTextGraphics (*WString, > > &GraphicChar, &AsciiChar, NULL)) { // // If it's not a > graphic character > > convert Unicode to ASCII. //@@ -248,14 +371,70 @@ > > TerminalConOutOutputString ( > > } AsciiChar = GraphicChar;- } - if > (TerminalDevice- > > >TerminalType != TerminalTypePcAnsi) {- GraphicChar = AsciiChar;+ > > GraphicChar = AsciiChar;++ Length = 1;++ Status = > TerminalDevice- > > >SerialIo->Write (+ > TerminalDevice->SerialIo,+ > > &Length,+ &GraphicChar+ > );++ if > > (EFI_ERROR (Status)) {+ goto OutputError; } + > break;+ case > > TerminalTypeVt100Plus:+ case TerminalTypeVt400: Length = 1;+ > if > > (TerminalIsValidTextGraphics (*WString, NULL, NULL, &DecChar)) {+ > if > > (!TerminalDevice->DecSpecialGraphicsMode) {+ ModeSwitchLength = > > LENGTH_DEC_ESCAPE;+ Status = TerminalDevice->SerialIo->Write (+ > > TerminalDevice->SerialIo,+ > &ModeSwitchLength,+ > > (UINT8 *)SetDecModeString+ > );+ TerminalDevice- > > >DecSpecialGraphicsMode = TRUE;+ }++ GraphicChar = > DecChar;+ } > > else {+ if (TerminalDevice->DecSpecialGraphicsMode) {+ > > ModeSwitchLength = LENGTH_DEC_ESCAPE;+ Status = TerminalDevice- > > >SerialIo->Write (+ > TerminalDevice->SerialIo,+ > > &ModeSwitchLength,+ (UINT8 > > *)ExitDecModeString+ );++ > if (EFI_ERROR (Status)) > > {+ goto OutputError;+ }++ TerminalDevice- > > >DecSpecialGraphicsMode = FALSE;+ }++ GraphicChar = > > (CHAR8)*WString;++ if (!(TerminalIsValidAscii (GraphicChar) || > > TerminalIsValidEfiCntlChar (GraphicChar))) {+ //+ // > when this driver > > use the OutputString to output control string,+ // > TerminalDevice- > > >OutputEscChar is set to let the Esc char+ // to be output to > the terminal > > emulation software.+ //+ if ((GraphicChar == 27) && > > TerminalDevice->OutputEscChar) {+ GraphicChar = 27;+ > } else {+ > > GraphicChar = '?';+ Warning = TRUE;+ }+ > }+ } Status = > > TerminalDevice->SerialIo->Write ( > TerminalDevice- > > >SerialIo,@@ -268,7 +447,7 @@ TerminalConOutOutputString ( > > } break;-+ case TerminalTypeLinux: case > TerminalTypeVtUtf8: > > UnicodeToUtf8 (*WString, &Utf8Char, &ValidBytes); Length = > > ValidBytes;@@ -280,8 +459,10 @@ TerminalConOutOutputString ( > > if (EFI_ERROR (Status)) { goto OutputError; }+ > break; }+ // > > // Update cursor position. //@@ -875,7 +1056,8 @@ BOOLEAN > > TerminalIsValidTextGraphics ( IN CHAR16 Graphic, OUT CHAR8 > *PcAnsi, > > OPTIONAL- OUT CHAR8 *Ascii OPTIONAL+ OUT CHAR8 *Ascii, OPTIONAL+ > > OUT CHAR8 *DecSpecialGraphics OPTIONAL ) { UNICODE_TO_CHAR > > *Table;@@ -897,6 +1079,9 @@ TerminalIsValidTextGraphics ( > > if (Ascii != NULL) { *Ascii = Table->Ascii; }+ > if > > (DecSpecialGraphics != NULL){+ *DecSpecialGraphics = Table- > > >DecSpecialGraphics;+ } return TRUE; }-- > > 2.32.0 > > > > > > > > -=-=-=-=-=-= > > Groups.io Links: You receive all messages sent to this group. > > View/Reply Online (#79214): https://edk2.groups.io/g/devel/message/79214 > > Mute This Topic: https://groups.io/mt/84853186/1768756 > > Group Owner: devel+owner@edk2.groups.io > > Unsubscribe: https://edk2.groups.io/g/devel/unsub [zhichao.gao@intel.com > ] > > -=-=-=-=-=-= > > > > --000000000000b30ddd05ca3110db Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
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.
=C2=A0I'm not sure how to bring the other threads into this one. So = here are the links to v3
https://edk2.groups.io/g/devel/message/79691
https://edk2.groups.io/g/devel/= message/79692

On Tue, Aug 17, 2021 at 9:50 PM Gao, Zhichao <zhichao.gao@intel.com> wrote:
Hi Caden/Nate,
This patch aims to make the terminal output character set to be expected as= https://git= hub.com/tianocore/tianocore.github.io/wiki/Tasks-Terminal-driver-improvemen= ts.
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 ab= ove link.

For the poor man's line drawing, our code is using '\' and '= ;/' instead of '+'. Should we change it to match the table?

Caden,

The patch thru email is not separated for every lines, it mixed up. So it i= s hard to give comment thru email. So I give my comments thru https://github.com/ZhichaoGao/ed= k2/commit/b9a47188d7228a47897413ca73c265143edfec29#diff-e3ef4106fc8f77b7d4a= c5679f4104281cbf9a0322606703f2a6be152960c1125R300.

Thanks,
Zhichao



> -----Original Message-----
> From: devel@= edk2.groups.io <devel@edk2.groups.io> On Behalf Of Caden
> Kline
> Sent: Friday, August 13, 2021 8:00 AM
> To: devel@ed= k2.groups.io
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A <hao.a.wu@intel.com>;
> Gao, Zhichao <zhichao.gao@intel.com>; Ni, Ray <ray.ni@intel.com>;
> Desimone, Nathaniel L <nathaniel.l.desimone@intel.com>
> Subject: [edk2-devel] [PATCH v2 1/1] MdeModulePkg/Console: Improve
> encoding of box drawing characters
>
> Improved encoding of box drawing characters for different terminal typ= es.
> This includes Dec special graphics mode and more utf8.
>
> Cc: Jian J Wang <jian.j.wang@intel.com>
> Cc: Hao A Wu <hao.a.wu@intel.com>
> Cc: Zhichao Gao <zhichao.gao@intel.com>
> Cc: Ray Ni <r= ay.ni@intel.com>
> Signed-off-by: Caden Kline <cadenkline9@gmail.com>
> Reviewed-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
> ---
>
> Notes:
>=C2=A0 =C2=A0 =C2=A0v2:
>=C2=A0 =C2=A0 =C2=A0- code style changes to fix indents and comments [H= ao A Wu]
>
>=C2=A0 MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h=C2=A0 =C2= =A0 =C2=A0 =C2=A0|=C2=A0 26 +-
>=C2=A0 MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0|=C2=A0 =C2=A02 +-
>=C2=A0 MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c | 32= 1
> +++++++++++++++-----
>=C2=A0 3 files changed, 271 insertions(+), 78 deletions(-)
>
> diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
> b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
> index 360e58e84743..1eab439531dc 100644
> --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
> +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
> @@ -122,7 +122,12 @@ typedef struct {
>=C2=A0 =C2=A0 EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL=C2=A0 =C2=A0SimpleInput= Ex;=C2=A0 =C2=A0LIST_ENTRY
> NotifyList;=C2=A0 =C2=A0EFI_EVENT=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0KeyNotifyProc= essEvent;+=C2=A0 BOOLEAN
> DecSpecialGraphicsMode; } TERMINAL_DEV;+//+// This the length the
> escape sequences for entering and exiting Dec Special Graphics
> Mode+//+#define LENGTH_DEC_ESCAPE=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A00x03=C2=A0 #define
> INPUT_STATE_DEFAULT=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A00x00 #define INPUT_STATE_ESC
> 0x01@@ -169,6 +174,7 @@ typedef struct {
>=C2=A0 =C2=A0 UINT16=C2=A0 Unicode;=C2=A0 =C2=A0CHAR8=C2=A0 =C2=A0PcAns= i;=C2=A0 =C2=A0CHAR8=C2=A0 =C2=A0Ascii;+=C2=A0 CHAR8
> DecSpecialGraphics; } UNICODE_TO_CHAR;=C2=A0 //@@ -1367,20 +1373,22 @@=
> Utf8ToUnicode (
>=C2=A0 /**=C2=A0 =C2=A0Detects if a Unicode char is for Box Drawing tex= t graphics. -=C2=A0 @param
> Graphic=C2=A0 =C2=A0 =C2=A0 Unicode char to test.-=C2=A0 @param=C2=A0 = PcAnsi=C2=A0 =C2=A0 =C2=A0 =C2=A0Optional pointer to
> return PCANSI equivalent of-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Graphic.-=C2=A0 @param=C2=A0 Ascii= =C2=A0 =C2=A0 =C2=A0 =C2=A0 Optional
> pointer to return ASCII equivalent of-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Graphic.--=C2=A0 @retva= l TRUE
> If Graphic is a supported Unicode Box Drawing character.+=C2=A0 @param= =C2=A0 Graphic
> Unicode char to test.+=C2=A0 @param=C2=A0 PcAnsi=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 Optional pointer to return
> PCANSI equivalent of+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Graphic.+=C2=A0 @pa= ram=C2=A0 Ascii
> Optional pointer to return ASCII equivalent of+=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 Graphic.+
> @param=C2=A0 DecSpecialGraphics=C2=A0 Optional pointer to return Dec S= pecial Graphics
> equivalent of+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Graphic.+=C2=A0 @retval TR= UE=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 If Graphic is a > supported Unicode Box Drawing character.=C2=A0 **/ BOOLEAN
> TerminalIsValidTextGraphics (=C2=A0 =C2=A0IN=C2=A0 CHAR16=C2=A0 Graphi= c,-=C2=A0 OUT CHAR8=C2=A0 =C2=A0*PcAnsi,
> OPTIONAL-=C2=A0 OUT CHAR8=C2=A0 =C2=A0*Ascii OPTIONAL+=C2=A0 OUT CHAR8= =C2=A0 =C2=A0*PcAnsi,
> OPTIONAL+=C2=A0 OUT CHAR8=C2=A0 =C2=A0*Ascii,=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0OPTIONAL+=C2=A0 OUT CHAR8
> *DecSpecialGraphics OPTIONAL=C2=A0 =C2=A0);=C2=A0 /**diff --git
> a/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c
> b/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c
> index f117d90b9de3..5ae5a4f0212e 100644
> --- a/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c
> +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c
> @@ -63,7 +63,7 @@ AnsiTestString (
>=C2=A0 =C2=A0 =C2=A0 =C2=A0if ( !(TerminalIsValidAscii (*WString) ||=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0TerminalIsValidEfiCntlChar
> (*WString) ||-=C2=A0 =C2=A0 =C2=A0 =C2=A0 TerminalIsValidTextGraphics = (*WString, &GraphicChar,
> NULL) )) {+=C2=A0 =C2=A0 =C2=A0 =C2=A0 TerminalIsValidTextGraphics (*W= String, &GraphicChar, NULL,
> NULL) )) {=C2=A0 =C2=A0 =C2=A0 =C2=A0 return EFI_UNSUPPORTED;=C2=A0 = =C2=A0 =C2=A0}diff --git
> a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
> b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
> index aae470e9562c..6da1fa64a2f3 100644
> --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
> +++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
> @@ -16,61 +16,59 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
>=C2=A0 // // UNICODE_TO_CHAR=C2=A0 UnicodeToPcAnsiOrAscii[] =3D {-
> { BOXDRAW_HORIZONTAL,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A00xc4, L'-' },-=C2=A0 { BOXDRAW_VERTICAL,
> 0xb3, L'|' },-=C2=A0 { BOXDRAW_DOWN_RIGHT,=C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00xda, L'/' },-
> { BOXDRAW_DOWN_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 0xbf, L'\\' },-=C2=A0 { BOXDRAW_UP_RIGHT,
> 0xc0, L'\\' },-=C2=A0 { BOXDRAW_UP_LEFT,=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0xd9, L'/' },-
> { BOXDRAW_VERTICAL_RIGHT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A00xc3, L'|' },-
> { BOXDRAW_VERTICAL_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 0xb4, L'|' },-
> { BOXDRAW_DOWN_HORIZONTAL,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0x= c2, L'+' },-
> { BOXDRAW_UP_HORIZONTAL,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 0xc1, L'+' },-
> { BOXDRAW_VERTICAL_HORIZONTAL,=C2=A0 =C2=A0 =C2=A0 =C2=A0 0xc5, L'= +' },-
> { BOXDRAW_DOUBLE_HORIZONTAL,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0xcd, L= '-' },-
> { BOXDRAW_DOUBLE_VERTICAL,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0x= ba, L'|' },-
> { BOXDRAW_DOWN_RIGHT_DOUBLE,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0xd5, L= '/' },-
> { BOXDRAW_DOWN_DOUBLE_RIGHT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0xd6, L= '/' },-
> { BOXDRAW_DOUBLE_DOWN_RIGHT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0xc9, L= '/' },-
> { BOXDRAW_DOWN_LEFT_DOUBLE,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00x= b8, L'\\' },-
> { BOXDRAW_DOWN_DOUBLE_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00x= b7, L'\\' },-
> { BOXDRAW_DOUBLE_DOWN_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00x= bb, L'\\' },-
> { BOXDRAW_UP_RIGHT_DOUBLE,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0x= d4, L'\\' },-
> { BOXDRAW_UP_DOUBLE_RIGHT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0x= d3, L'\\' },-
> { BOXDRAW_DOUBLE_UP_RIGHT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0x= c8, L'\\' },-
> { BOXDRAW_UP_LEFT_DOUBLE,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A00xbe, L'/' },-
> { BOXDRAW_UP_DOUBLE_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A00xbd, L'/' },-
> { BOXDRAW_DOUBLE_UP_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A00xbc, L'/' },-
> { BOXDRAW_VERTICAL_RIGHT_DOUBLE,=C2=A0 =C2=A0 =C2=A0 0xc6, L'|'= ; },-
> { BOXDRAW_VERTICAL_DOUBLE_RIGHT,=C2=A0 =C2=A0 =C2=A0 0xc7, L'|'= ; },-
> { BOXDRAW_DOUBLE_VERTICAL_RIGHT,=C2=A0 =C2=A0 =C2=A0 0xcc, L'|'= ; },-
> { BOXDRAW_VERTICAL_LEFT_DOUBLE,=C2=A0 =C2=A0 =C2=A0 =C2=A00xb5, L'= |' },-
> { BOXDRAW_VERTICAL_DOUBLE_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A00xb6, L'= |' },-
> { BOXDRAW_DOUBLE_VERTICAL_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A00xb9, L'= |' },-
> { BOXDRAW_DOWN_HORIZONTAL_DOUBLE,=C2=A0 =C2=A0 =C2=A00xd1, L'+'= ; },-
> { BOXDRAW_DOWN_DOUBLE_HORIZONTAL,=C2=A0 =C2=A0 =C2=A00xd2, L'+'= ; },-
> { BOXDRAW_DOUBLE_DOWN_HORIZONTAL,=C2=A0 =C2=A0 =C2=A00xcb, L'+'= ; },-
> { BOXDRAW_UP_HORIZONTAL_DOUBLE,=C2=A0 =C2=A0 =C2=A0 =C2=A00xcf, L'= +' },-
> { BOXDRAW_UP_DOUBLE_HORIZONTAL,=C2=A0 =C2=A0 =C2=A0 =C2=A00xd0, L'= +' },-
> { BOXDRAW_DOUBLE_UP_HORIZONTAL,=C2=A0 =C2=A0 =C2=A0 =C2=A00xca, L'= +' },-
> { BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE, 0xd8, L'+' },-
> { BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL, 0xd7, L'+' },-
> { BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL, 0xce, L'+' },+
> { BOXDRAW_HORIZONTAL,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A00xc4, L'-',=C2=A0 0x71 },+=C2=A0 { BOXDRAW_VERTICAL, > 0xb3, L'|',=C2=A0 0x78 },+=C2=A0 { BOXDRAW_DOWN_RIGHT,=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00xda, L'/',= =C2=A0 0x6c },+
> { BOXDRAW_DOWN_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 0xbf, L'\\', 0x6b },+
> { BOXDRAW_UP_RIGHT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A00xc0, L'\\', 0x6d },+=C2=A0 { BOXDRAW_UP_LEFT,<= br> > 0xd9, L'/',=C2=A0 0x6a },+=C2=A0 { BOXDRAW_VERTICAL_RIGHT,=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00xc3, L'|',=C2=A0 0x74= },+
> { BOXDRAW_VERTICAL_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 0xb4, L'|',=C2=A0 0x75 },+
> { BOXDRAW_DOWN_HORIZONTAL,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0x= c2, L'+',=C2=A0 0x77 },+
> { BOXDRAW_UP_HORIZONTAL,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 0xc1, L'+',=C2=A0 0x76 },+
> { BOXDRAW_VERTICAL_HORIZONTAL,=C2=A0 =C2=A0 =C2=A0 =C2=A0 0xc5, L'= +',=C2=A0 0x6e },+
> { BOXDRAW_DOUBLE_HORIZONTAL,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0xcd, L= '-',=C2=A0 0x71 },+
> { BOXDRAW_DOUBLE_VERTICAL,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0x= ba, L'|',=C2=A0 0x78 },+
> { BOXDRAW_DOWN_RIGHT_DOUBLE,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0xd5, L= '/',=C2=A0 0x6c },+
> { BOXDRAW_DOWN_DOUBLE_RIGHT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0xd6, L= '/',=C2=A0 0x6c },+
> { BOXDRAW_DOUBLE_DOWN_RIGHT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0xc9, L= '/',=C2=A0 0x6c },+
> { BOXDRAW_DOWN_LEFT_DOUBLE,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00x= b8, L'\\', 0x6b },+
> { BOXDRAW_DOWN_DOUBLE_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00x= b7, L'\\', 0x6b },+
> { BOXDRAW_DOUBLE_DOWN_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00x= bb, L'\\', 0x6b },+
> { BOXDRAW_UP_RIGHT_DOUBLE,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0x= d4, L'\\', 0x6d },+
> { BOXDRAW_UP_DOUBLE_RIGHT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0x= d3, L'\\', 0x6d },+
> { BOXDRAW_DOUBLE_UP_RIGHT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0x= c8, L'\\', 0x6d },+
> { BOXDRAW_UP_LEFT_DOUBLE,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A00xbe, L'/',=C2=A0 0x6a },+
> { BOXDRAW_UP_DOUBLE_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A00xbd, L'/',=C2=A0 0x6a },+
> { BOXDRAW_DOUBLE_UP_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A00xbc, L'/',=C2=A0 0x6a },+
> { BOXDRAW_VERTICAL_RIGHT_DOUBLE,=C2=A0 =C2=A0 =C2=A0 0xc6, L'|'= ;,=C2=A0 0x74 },+
> { BOXDRAW_VERTICAL_DOUBLE_RIGHT,=C2=A0 =C2=A0 =C2=A0 0xc7, L'|'= ;,=C2=A0 0x74 },+
> { BOXDRAW_DOUBLE_VERTICAL_RIGHT,=C2=A0 =C2=A0 =C2=A0 0xcc, L'|'= ;,=C2=A0 0x74 },+
> { BOXDRAW_VERTICAL_LEFT_DOUBLE,=C2=A0 =C2=A0 =C2=A0 =C2=A00xb5, L'= |',=C2=A0 0x75 },+
> { BOXDRAW_VERTICAL_DOUBLE_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A00xb6, L'= |',=C2=A0 0x75 },+
> { BOXDRAW_DOUBLE_VERTICAL_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A00xb9, L'= |',=C2=A0 0x75 },+
> { BOXDRAW_DOWN_HORIZONTAL_DOUBLE,=C2=A0 =C2=A0 =C2=A00xd1, L'+'= ;,=C2=A0 0x77 },+
> { BOXDRAW_DOWN_DOUBLE_HORIZONTAL,=C2=A0 =C2=A0 =C2=A00xd2, L'+'= ;,=C2=A0 0x77 },+
> { BOXDRAW_DOUBLE_DOWN_HORIZONTAL,=C2=A0 =C2=A0 =C2=A00xcb, L'+'= ;,=C2=A0 0x77 },+
> { BOXDRAW_UP_HORIZONTAL_DOUBLE,=C2=A0 =C2=A0 =C2=A0 =C2=A00xcf, L'= +',=C2=A0 0x76 },+
> { BOXDRAW_UP_DOUBLE_HORIZONTAL,=C2=A0 =C2=A0 =C2=A0 =C2=A00xd0, L'= +',=C2=A0 0x76 },+
> { BOXDRAW_DOUBLE_UP_HORIZONTAL,=C2=A0 =C2=A0 =C2=A0 =C2=A00xca, L'= +',=C2=A0 0x76 },+
> { BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE, 0xd8, L'+',=C2=A0 0x6e }= ,+
> { BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL, 0xd7, L'+',=C2=A0 0x6e }= ,+
> { BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL, 0xce, L'+',=C2=A0 0x6e }= , -
> { BLOCKELEMENT_FULL_BLOCK,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0x= db, L'*' },-
> { BLOCKELEMENT_LIGHT_SHADE,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00x= b0, L'+' },+
> { BLOCKELEMENT_FULL_BLOCK,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0x= db, L'*',=C2=A0 0x61 },+
> { BLOCKELEMENT_LIGHT_SHADE,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00x= b0, L'+',=C2=A0 0x61 }, -
> { GEOMETRICSHAPE_UP_TRIANGLE,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'^&= #39;, L'^' },-
> { GEOMETRICSHAPE_RIGHT_TRIANGLE,=C2=A0 =C2=A0 =C2=A0 '>', L= '>' },-
> { GEOMETRICSHAPE_DOWN_TRIANGLE,=C2=A0 =C2=A0 =C2=A0 =C2=A0'v',= L'v' },-
> { GEOMETRICSHAPE_LEFT_TRIANGLE,=C2=A0 =C2=A0 =C2=A0 =C2=A0'<= 9;, L'<' },+
> { GEOMETRICSHAPE_UP_TRIANGLE,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'^&= #39;,=C2=A0 L'^',=C2=A0 L'^' },+
> { GEOMETRICSHAPE_RIGHT_TRIANGLE,=C2=A0 =C2=A0 =C2=A0 '>',= =C2=A0 L'>',=C2=A0 L'>' },+
> { GEOMETRICSHAPE_DOWN_TRIANGLE,=C2=A0 =C2=A0 =C2=A0 =C2=A0'v',= =C2=A0 L'v',=C2=A0 L'v' },+
> { GEOMETRICSHAPE_LEFT_TRIANGLE,=C2=A0 =C2=A0 =C2=A0 =C2=A0'<= 9;,=C2=A0 L'<',=C2=A0 L'<' }, -=C2=A0 { ARROW_LEFT, > '<', L'<' },-=C2=A0 { ARROW_UP,=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0'^', L'^' },-=C2=A0 { ARROW_RIGHT,
> '>', L'>' },-=C2=A0 { ARROW_DOWN,=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0'v', L'v' },--=C2=A0 { 0x0000,
> 0x00, L'\0' }+=C2=A0 { ARROW_LEFT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'<'= ;,=C2=A0 L'<',=C2=A0 L'<' },+=C2=A0 { ARROW_UP,
> '^',=C2=A0 L'^',=C2=A0 L'^' },+=C2=A0 { ARROW_= RIGHT,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 '>',=C2=A0 L'>',=C2=A0 L'>'= },+
> { ARROW_DOWN,=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'v',=C2=A0 L'v',=C2=A0 L&= #39;v' }, };=C2=A0 CHAR16 mSetModeString[]
> =3D { ESC, '[', '=3D', '3', 'h', 0 };@= @ -80,6 +78,8 @@ CHAR16
> mSetCursorPositionString[]=C2=A0 =3D { ESC, '[', '0', = '0', ';', '0', '0', 'H', 0
>=C2=A0 CHAR16 mCursorForwardString[]=C2=A0 =C2=A0 =C2=A0 =3D { ESC, = 9;[', '0', '0', 'C', 0 }; CHAR16
> mCursorBackwardString[]=C2=A0 =C2=A0 =C2=A0=3D { ESC, '[', = 9;0', '0', 'D', 0 }; +CHAR8
> SetDecModeString[]=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D {ESC, 0x28, 0= x30};+CHAR8=C2=A0 ExitDecModeString[]
> =3D {ESC, 0x28, 0x42}; // // Body of the ConOut functions //@@ -183,16= +183,19
> @@ TerminalConOutOutputString (
>=C2=A0 =C2=A0 EFI_STATUS=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 Status;=C2=A0 =C2=A0UINT8=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ValidBytes;=C2=A0 =C2= =A0CHAR8
> CrLfStr[2];+=C2=A0 CHAR8=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0DecChar;+=C2=A0 UINTN
> ModeSwitchLength;=C2=A0 =C2=A0//=C2=A0 =C2=A0//=C2=A0 flag used to ind= icate whether condition happens
> which will cause=C2=A0 =C2=A0//=C2=A0 return EFI_WARN_UNKNOWN_GLYPH=C2= =A0 =C2=A0//=C2=A0 =C2=A0BOOLEAN
> Warning; -=C2=A0 ValidBytes=C2=A0 =3D 0;-=C2=A0 Warning=C2=A0 =C2=A0 = =C2=A0=3D FALSE;-=C2=A0 AsciiChar=C2=A0 =C2=A0=3D 0;-+=C2=A0 ValidBytes
> =3D 0;+=C2=A0 Warning=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D FALSE;+=C2= =A0 AsciiChar=C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D 0;+=C2=A0 DecChar=C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =3D 0;+
> ModeSwitchLength =3D LENGTH_DEC_ESCAPE;=C2=A0 =C2=A0//=C2=A0 =C2=A0//= =C2=A0 get Terminal device data
> structure pointer.=C2=A0 =C2=A0//@@ -217,17 +220,137 @@ TerminalConOut= OutputString
> (
>=C2=A0 =C2=A0 for (; *WString !=3D CHAR_NULL; WString++) {=C2=A0 =C2=A0= =C2=A0 switch (TerminalDevice-
> >TerminalType) {-=C2=A0 =C2=A0 =C2=A0case TerminalTypePcAnsi:-=C2= =A0 =C2=A0 case TerminalTypeVt100:-
> case TerminalTypeVt100Plus:-=C2=A0 =C2=A0 case TerminalTypeTtyTerm:-= =C2=A0 =C2=A0 case
> TerminalTypeLinux:+=C2=A0 =C2=A0 =C2=A0 if (!TerminalIsValidTextGraphi= cs (*WString,
> &GraphicChar, &AsciiChar, NULL)) {+=C2=A0 =C2=A0 =C2=A0 =C2=A0= //+=C2=A0 =C2=A0 =C2=A0 =C2=A0 // If it's not a graphic
> character convert Unicode to ASCII.+=C2=A0 =C2=A0 =C2=A0 =C2=A0 //+=C2= =A0 =C2=A0 =C2=A0 =C2=A0 GraphicChar =3D
> (CHAR8)*WString;++=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!(TerminalIsValidAsc= ii (GraphicChar) ||
> TerminalIsValidEfiCntlChar (GraphicChar))) {+=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 //+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 // when this driver
> use the OutputString to output control string,+=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 // TerminalDevice-
> >OutputEscChar is set to let the Esc char+=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 // to be output to the terminal
> emulation software.+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 //+=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 if ((GraphicChar =3D=3D 27) &&
> TerminalDevice->OutputEscChar) {+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 GraphicChar =3D 27;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else {+ > GraphicChar =3D '?';+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= Warning=C2=A0 =C2=A0 =C2=A0=3D TRUE;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }+= =C2=A0 =C2=A0 =C2=A0 =C2=A0 }++=C2=A0 =C2=A0 =C2=A0 =C2=A0 AsciiChar =3D > GraphicChar;+=C2=A0 =C2=A0 =C2=A0 }+=C2=A0 =C2=A0 =C2=A0 Length =3D 1;= +=C2=A0 =C2=A0 =C2=A0 Status =3D TerminalDevice->SerialIo-
> >Write (+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 TerminalDevice->SerialIo,+
> &Length,+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 &GraphicChar+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 );++=C2=A0 =C2=A0 =C2=A0 if
> (EFI_ERROR (Status)) {+=C2=A0 =C2=A0 =C2=A0 =C2=A0 goto OutputError;+= =C2=A0 =C2=A0 =C2=A0 }++=C2=A0 =C2=A0 =C2=A0 break;=C2=A0 =C2=A0 =C2=A0case=
> TerminalTypeXtermR6:-=C2=A0 =C2=A0 case TerminalTypeVt400:=C2=A0 =C2= =A0 =C2=A0case
> TerminalTypeSCO:+=C2=A0 =C2=A0 =C2=A0 if (TerminalIsValidTextGraphics = (*WString, NULL, NULL,
> &DecChar) && !TerminalIsValidAscii (*WString)) {+=C2=A0 = =C2=A0 =C2=A0 =C2=A0 //+=C2=A0 =C2=A0 =C2=A0 =C2=A0 // Box graphics
> are split into 2 types simple and advanced.+=C2=A0 =C2=A0 =C2=A0 =C2= =A0 // Simple are drawn with dec
> special graphics.+=C2=A0 =C2=A0 =C2=A0 =C2=A0 // Advanced are drawn wi= th utf8.+=C2=A0 =C2=A0 =C2=A0 =C2=A0 // This checks for
> simple because they have a lower value than the advanced.+=C2=A0 =C2= =A0 =C2=A0 =C2=A0 if(*WString
> < BOXDRAW_DOUBLE_HORIZONTAL) {+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 i= f (!TerminalDevice-
> >DecSpecialGraphicsMode) {+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 ValidBytes =3D 0;+
> ModeSwitchLength =3D LENGTH_DEC_ESCAPE;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 Status =3D TerminalDevice-
> >SerialIo->Write (+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 TerminalDevice->SerialI= o,+
> &ModeSwitchLength,+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (UINT8
> *)SetDecModeString+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 );+=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 TerminalDevice-
> >DecSpecialGraphicsMode =3D TRUE;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 } -=C2=A0 =C2=A0 =C2=A0 if
> (!TerminalIsValidTextGraphics (*WString, &GraphicChar, &AsciiC= har)) {+
> GraphicChar =3D DecChar;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Length =3D= 1;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 } else {+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= if
> (TerminalDevice->DecSpecialGraphicsMode) {+=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 ModeSwitchLength =3D
> LENGTH_DEC_ESCAPE;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Status = =3D TerminalDevice->SerialIo->Write (+
> TerminalDevice->SerialIo,+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &ModeSwitchLength,= +
> (UINT8 *)ExitDecModeString+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 );+=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (EFI_ERROR
> (Status)) {+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 go= to OutputError;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }++=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0TerminalDevice-
> >DecSpecialGraphicsMode =3D FALSE;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 }++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 UnicodeToUtf8 (*WString,
> &Utf8Char, &ValidBytes);+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Le= ngth =3D ValidBytes;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 }+=C2=A0 =C2=A0 =C2=A0 } e= lse {+=C2=A0 =C2=A0 =C2=A0 =C2=A0 if
> (TerminalDevice->DecSpecialGraphicsMode) {+=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 Status =3D TerminalDevice-
> >SerialIo->Write (+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 TerminalDevice->SerialIo,+
> &ModeSwitchLength,+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (UINT8
> *)ExitDecModeString+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 );+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 if (EFI_ERROR (Status))
> {+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto OutputError;+=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 }++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 TerminalD= evice-
> >DecSpecialGraphicsMode =3D FALSE;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 }++= =C2=A0 =C2=A0 =C2=A0 =C2=A0 GraphicChar =3D
> (CHAR8)*WString;++=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!(TerminalIsValidAsc= ii (GraphicChar) ||
> TerminalIsValidEfiCntlChar (GraphicChar))) {+=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 //+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 // when this driver
> use the OutputString to output control string,+=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 // TerminalDevice-
> >OutputEscChar is set to let the Esc char+=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 // to be output to the terminal
> emulation software.+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 //+=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 if ((GraphicChar =3D=3D 27) &&
> TerminalDevice->OutputEscChar) {+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 GraphicChar =3D 27;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Lengt= h =3D
> 1;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else {+=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 UnicodeToUtf8 (*WString, &Utf8Char, &ValidByte= s);+
> Length =3D ValidBytes;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }+=C2=A0 =C2= =A0 =C2=A0 =C2=A0 } else {+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Length =3D 1;= +=C2=A0 =C2=A0 =C2=A0 =C2=A0 }+=C2=A0 =C2=A0 =C2=A0 }++=C2=A0 =C2=A0 =C2=A0= if
> (ValidBytes) {+=C2=A0 =C2=A0 =C2=A0 =C2=A0 Status =3D TerminalDevice-&= gt;SerialIo->Write (+
> TerminalDevice->SerialIo,+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &Length,+
> (UINT8 *)&Utf8Char+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 );+=C2=A0 =C2=A0 =C2=A0 =C2=A0 ValidByte= s =3D 0;+=C2=A0 =C2=A0 =C2=A0 } else {+
> Status =3D TerminalDevice->SerialIo->Write (+
> TerminalDevice->SerialIo,+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &Length,+
> &GraphicChar+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 );+=C2=A0 =C2=A0 =C2=A0 }+=C2=A0 =C2=A0 if (EFI= _ERROR (Status)) {+
> goto OutputError;+=C2=A0 =C2=A0 }++=C2=A0 =C2=A0 break;+=C2=A0 =C2=A0 = case TerminalTypeVt100:+=C2=A0 =C2=A0 case
> TerminalTypeTtyTerm:+=C2=A0 =C2=A0 =C2=A0 if (!TerminalIsValidTextGrap= hics (*WString,
> &GraphicChar, &AsciiChar, NULL)) {=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0//=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0// If it's not a graphic char= acter
> convert Unicode to ASCII.=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0//@@ -248,1= 4 +371,70 @@
> TerminalConOutOutputString (
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = AsciiChar =3D GraphicChar;-=C2=A0 =C2=A0 =C2=A0 =C2=A0} -=C2=A0 =C2=A0 =C2= =A0 if (TerminalDevice-
> >TerminalType !=3D TerminalTypePcAnsi) {-=C2=A0 =C2=A0 =C2=A0 =C2= =A0 GraphicChar =3D AsciiChar;+
> GraphicChar =3D AsciiChar;++=C2=A0 =C2=A0 =C2=A0 Length =3D 1;++=C2=A0= =C2=A0 =C2=A0 Status =3D TerminalDevice-
> >SerialIo->Write (+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 TerminalDevice->SerialIo,+
> &Length,+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 &GraphicChar+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 );++=C2=A0 =C2=A0 =C2=A0 if
> (EFI_ERROR (Status)) {+=C2=A0 =C2=A0 =C2=A0 =C2=A0 goto OutputError;= =C2=A0 =C2=A0 =C2=A0 =C2=A0} +=C2=A0 =C2=A0 =C2=A0 =C2=A0 break;+=C2=A0 =C2= =A0 case
> TerminalTypeVt100Plus:+=C2=A0 =C2=A0 case TerminalTypeVt400:=C2=A0 =C2= =A0 =C2=A0 =C2=A0Length =3D 1;+=C2=A0 =C2=A0 =C2=A0 if
> (TerminalIsValidTextGraphics (*WString, NULL, NULL, &DecChar)) {+= =C2=A0 =C2=A0 =C2=A0 =C2=A0 if
> (!TerminalDevice->DecSpecialGraphicsMode) {+=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 ModeSwitchLength =3D
> LENGTH_DEC_ESCAPE;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Status =3D Termi= nalDevice->SerialIo->Write (+
> TerminalDevice->SerialIo,+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &ModeSwitchLength,+
> (UINT8 *)SetDecModeString+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 );+=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 TerminalDevice-
> >DecSpecialGraphicsMode =3D TRUE;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 }++= =C2=A0 =C2=A0 =C2=A0 GraphicChar =3D DecChar;+=C2=A0 =C2=A0 =C2=A0 }
> else {+=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (TerminalDevice->DecSpecialGr= aphicsMode) {+
> ModeSwitchLength =3D LENGTH_DEC_ESCAPE;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 Status =3D TerminalDevice-
> >SerialIo->Write (+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 TerminalDevice->SerialIo,+
> &ModeSwitchLength,+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (UINT8
> *)ExitDecModeString+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 );++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 if (EFI_ERROR (Status))
> {+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto OutputError;+=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 }++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 TerminalD= evice-
> >DecSpecialGraphicsMode =3D FALSE;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 }++= =C2=A0 =C2=A0 =C2=A0 =C2=A0 GraphicChar =3D
> (CHAR8)*WString;++=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!(TerminalIsValidAsc= ii (GraphicChar) ||
> TerminalIsValidEfiCntlChar (GraphicChar))) {+=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 //+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 // when this driver
> use the OutputString to output control string,+=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 // TerminalDevice-
> >OutputEscChar is set to let the Esc char+=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 // to be output to the terminal
> emulation software.+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 //+=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 if ((GraphicChar =3D=3D 27) &&
> TerminalDevice->OutputEscChar) {+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 GraphicChar =3D 27;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else {+ > GraphicChar =3D '?';+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= Warning=C2=A0 =C2=A0 =C2=A0=3D TRUE;+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }+= =C2=A0 =C2=A0 =C2=A0 =C2=A0 }+=C2=A0 =C2=A0 =C2=A0 }=C2=A0 =C2=A0 =C2=A0 = =C2=A0 Status =3D
> TerminalDevice->SerialIo->Write (=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0TerminalDevice-
> >SerialIo,@@ -268,7 +447,7 @@ TerminalConOutOutputString (
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 }=C2=A0 =C2=A0 =C2=A0 =C2=A0 break;-+=C2=A0= =C2=A0 case TerminalTypeLinux:=C2=A0 =C2=A0 =C2=A0case TerminalTypeVtUtf8:=
> UnicodeToUtf8 (*WString, &Utf8Char, &ValidBytes);=C2=A0 =C2=A0= =C2=A0 =C2=A0Length =3D
> ValidBytes;@@ -280,8 +459,10 @@ TerminalConOutOutputString (
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (EFI_ERROR (Status)) {=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0goto OutputError;=C2=A0 =C2=A0 =C2=A0 =C2=A0}+=C2=A0 =C2= =A0 =C2=A0 =C2=A0break;=C2=A0 =C2=A0 =C2=A0}+=C2=A0 =C2=A0 =C2=A0//
> //=C2=A0 Update cursor position.=C2=A0 =C2=A0 =C2=A0//@@ -875,7 +1056,= 8 @@ BOOLEAN
>=C2=A0 TerminalIsValidTextGraphics (=C2=A0 =C2=A0IN=C2=A0 CHAR16=C2=A0 = Graphic,=C2=A0 =C2=A0OUT CHAR8=C2=A0 =C2=A0*PcAnsi,
> OPTIONAL-=C2=A0 OUT CHAR8=C2=A0 =C2=A0*Ascii OPTIONAL+=C2=A0 OUT CHAR8= =C2=A0 =C2=A0*Ascii, OPTIONAL+
> OUT CHAR8=C2=A0 =C2=A0*DecSpecialGraphics OPTIONAL=C2=A0 =C2=A0) {=C2= =A0 =C2=A0UNICODE_TO_CHAR
> *Table;@@ -897,6 +1079,9 @@ TerminalIsValidTextGraphics (
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (Ascii !=3D NULL) {=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0*Ascii =3D Table->Ascii;=C2=A0 =C2=A0 =C2=A0 =C2=A0}+=C2=A0= =C2=A0 =C2=A0 if
> (DecSpecialGraphics !=3D NULL){+=C2=A0 =C2=A0 =C2=A0 =C2=A0 *DecSpecia= lGraphics =3D Table-
> >DecSpecialGraphics;+=C2=A0 =C2=A0 =C2=A0 }=C2=A0 =C2=A0 =C2=A0 =C2= =A0 return TRUE;=C2=A0 =C2=A0 =C2=A0}--
> 2.32.0
>
>
>
> -=3D-=3D-=3D-=3D-=3D-=3D
> Groups.io Links: You receive all messages sent to this group.
> View/Reply Online (#79214): https://edk2.groups.io/= g/devel/message/79214
> Mute This Topic: https://groups.io/mt/84853186/1768756=
> Group Owner: devel+owner@edk2.groups.io
> Unsubscribe: https://edk2.groups.io/g/devel/unsub [zhichao.gao@intel.co= m]
> -=3D-=3D-=3D-=3D-=3D-=3D
>

--000000000000b30ddd05ca3110db--