From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-il1-f169.google.com (mail-il1-f169.google.com [209.85.166.169]) by mx.groups.io with SMTP id smtpd.web10.18795.1629686661565461721 for ; Sun, 22 Aug 2021 19:44:21 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Vu47oDpw; spf=pass (domain: gmail.com, ip: 209.85.166.169, mailfrom: cadenkline9@gmail.com) Received: by mail-il1-f169.google.com with SMTP id s16so15646811ilo.9 for ; Sun, 22 Aug 2021 19:44:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=eB9Y3vXdx/PsRn9qV3it9ASjjVM3VrCTK3ZGrJxk4Sw=; b=Vu47oDpwZNBmwnfuUXCc3qPjmTOOSPsyu0pWaZaHBo2nXSDMOsyO+vkrVJbJxObG2K CqAmCz5MEvEjzZibc26zy0bvapJIkY6eWjCuCXo2f0tFsjI5mO6yNoe2UuFcte1CeCZo 86RsW8gPMNx0jyUjrxpRyqkaHSCCQGW6wuZbYczSkG8PLaMZW6AvpcUYgKgSye9orBUe AOeJspa2TYC00V55gmHF7djKbZqdbCQ6mEKN2dKAAZo67SaHYdlf3xzedh32nlbC97+7 OYYdlYaA8eti3SnSWQ+IS4mvkWo+Vrgon2EG7nV2medhyOC7V18Ui7V4nea+5JuWSsQS B9Ng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=eB9Y3vXdx/PsRn9qV3it9ASjjVM3VrCTK3ZGrJxk4Sw=; b=KwGTkCR3+9dBHLQK9KeHxOAvh79SKM8tZM8MZJ+j6Yc5WuYSYH9J5J8pw4aq4ZMvMQ YR8WhP4ahHOvTi1SLW+3/Urt2Z4NbKfZFLdnmdkIZERM1BUwunnboo1cc8Jj52yjAM0/ gb4m5RV3AdpXJBcrE07tcih1B2Tz6xLmo+beg2GtE9VLHgFBEDLMDlM59VBbqEO5mBZz FMvm5ZG1PM1xDUINa29KLLB2IE0gjjTUGYX/ctW+KwnFEgzeJLYivUZp8N/J/GWSdu/d c5eyNEveQus39ZPYjkye/2eP8pG5UQBe7lNDGFJtsOeK1VWEVRRYc1+/BEZXgL0UIchQ dHGQ== X-Gm-Message-State: AOAM531oT6xdyH+9thh1xiVG/bMRF1k05XSXjq7kE4B8pJNIuxGWoBHn ap+NU1nhLDDp9PqO6H3DzXAeeYiH+Qrkuw== X-Google-Smtp-Source: ABdhPJwRC7ZTFveew/1+L6iZQLpb1o6kmzIUODoGsFtwMLUlVZBZiiIZmEdLodvrx1FdRzAkz/UfbA== X-Received: by 2002:a92:b111:: with SMTP id t17mr21774066ilh.208.1629686660830; Sun, 22 Aug 2021 19:44:20 -0700 (PDT) Return-Path: Received: from cadenxps.indiana.edu ([2001:18e8:2:28b7:f000::1158]) by smtp.gmail.com with ESMTPSA id k7sm7489968iok.22.2021.08.22.19.44.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 22 Aug 2021 19:44:20 -0700 (PDT) From: "Caden Kline" To: devel@edk2.groups.io Cc: Jian J Wang , Hao A Wu , Zhichao Gao , Ray Ni , Nate DeSimone Subject: [PATCH v3 1/1] MdeModulePkg/Console: Improve encoding of box drawing characters Date: Sun, 22 Aug 2021 22:44:16 -0400 Message-Id: <20210823024416.377856-2-cadenkline9@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210823024416.377856-1-cadenkline9@gmail.com> References: <20210823024416.377856-1-cadenkline9@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Improved encoding of box drawing characters for different terminal types. This includes Dec special graphics mode and more utf8. Changes are made according to the below issue https://bugzilla.tianocore.org/show_bug.cgi?id=3D3580 Cc: Jian J Wang Cc: Hao A Wu Cc: Zhichao Gao Cc: Ray Ni Signed-off-by: Caden Kline Reviewed-by: Nate DeSimone --- MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h | 26 +- MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c | 2 +- MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c | 295 ++++++++= +++++++----- 3 files changed, 243 insertions(+), 80 deletions(-) diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h b/MdeMod= ulePkg/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;=0D LIST_ENTRY NotifyList;=0D EFI_EVENT KeyNotifyProcessEvent;=0D + BOOLEAN DecSpecialGraphicsMode;=0D } TERMINAL_DEV;=0D +//=0D +// This the length the escape sequences for entering and exiting Dec Speci= al Graphics Mode=0D +//=0D +#define LENGTH_DEC_ESCAPE 0x03=0D =0D #define INPUT_STATE_DEFAULT 0x00=0D #define INPUT_STATE_ESC 0x01=0D @@ -169,6 +174,7 @@ typedef struct { UINT16 Unicode;=0D CHAR8 PcAnsi;=0D CHAR8 Ascii;=0D + CHAR8 DecSpecialGraphics;=0D } UNICODE_TO_CHAR;=0D =0D //=0D @@ -1367,20 +1373,22 @@ Utf8ToUnicode ( /**=0D Detects if a Unicode char is for Box Drawing text graphics.=0D =0D - @param Graphic Unicode char to test.=0D - @param PcAnsi Optional pointer to return PCANSI equivalent of=0D - Graphic.=0D - @param Ascii Optional pointer to return ASCII equivalent of=0D - Graphic.=0D -=0D - @retval TRUE If Graphic is a supported Unicode Box Drawing chara= cter.=0D + @param Graphic Unicode char to test.=0D + @param PcAnsi Optional pointer to return PCANSI equivalent= of=0D + Graphic.=0D + @param Ascii Optional pointer to return ASCII equivalent = of=0D + Graphic.=0D + @param DecSpecialGraphics Optional pointer to return Dec Special Graph= ics equivalent of=0D + Graphic.=0D + @retval TRUE If Graphic is a supported Unicode Box Drawin= g character.=0D =0D **/=0D BOOLEAN=0D TerminalIsValidTextGraphics (=0D IN CHAR16 Graphic,=0D - OUT CHAR8 *PcAnsi, OPTIONAL=0D - OUT CHAR8 *Ascii OPTIONAL=0D + OUT CHAR8 *PcAnsi, OPTIONAL=0D + OUT CHAR8 *Ascii, OPTIONAL=0D + OUT CHAR8 *DecSpecialGraphics OPTIONAL=0D );=0D =0D /**=0D diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Ansi.c b/MdeModuleP= kg/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 ( =0D if ( !(TerminalIsValidAscii (*WString) ||=0D TerminalIsValidEfiCntlChar (*WString) ||=0D - TerminalIsValidTextGraphics (*WString, &GraphicChar, NULL) )) {=0D + TerminalIsValidTextGraphics (*WString, &GraphicChar, NULL, NULL) )= ) {=0D =0D return EFI_UNSUPPORTED;=0D }=0D diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c b/= MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c index aae470e9562c..7b328162325e 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 //=0D //=0D UNICODE_TO_CHAR UnicodeToPcAnsiOrAscii[] =3D {=0D - { BOXDRAW_HORIZONTAL, 0xc4, L'-' },=0D - { BOXDRAW_VERTICAL, 0xb3, L'|' },=0D - { BOXDRAW_DOWN_RIGHT, 0xda, L'/' },=0D - { BOXDRAW_DOWN_LEFT, 0xbf, L'\\' },=0D - { BOXDRAW_UP_RIGHT, 0xc0, L'\\' },=0D - { BOXDRAW_UP_LEFT, 0xd9, L'/' },=0D - { BOXDRAW_VERTICAL_RIGHT, 0xc3, L'|' },=0D - { BOXDRAW_VERTICAL_LEFT, 0xb4, L'|' },=0D - { BOXDRAW_DOWN_HORIZONTAL, 0xc2, L'+' },=0D - { BOXDRAW_UP_HORIZONTAL, 0xc1, L'+' },=0D - { BOXDRAW_VERTICAL_HORIZONTAL, 0xc5, L'+' },=0D - { BOXDRAW_DOUBLE_HORIZONTAL, 0xcd, L'-' },=0D - { BOXDRAW_DOUBLE_VERTICAL, 0xba, L'|' },=0D - { BOXDRAW_DOWN_RIGHT_DOUBLE, 0xd5, L'/' },=0D - { BOXDRAW_DOWN_DOUBLE_RIGHT, 0xd6, L'/' },=0D - { BOXDRAW_DOUBLE_DOWN_RIGHT, 0xc9, L'/' },=0D - { BOXDRAW_DOWN_LEFT_DOUBLE, 0xb8, L'\\' },=0D - { BOXDRAW_DOWN_DOUBLE_LEFT, 0xb7, L'\\' },=0D - { BOXDRAW_DOUBLE_DOWN_LEFT, 0xbb, L'\\' },=0D - { BOXDRAW_UP_RIGHT_DOUBLE, 0xd4, L'\\' },=0D - { BOXDRAW_UP_DOUBLE_RIGHT, 0xd3, L'\\' },=0D - { BOXDRAW_DOUBLE_UP_RIGHT, 0xc8, L'\\' },=0D - { BOXDRAW_UP_LEFT_DOUBLE, 0xbe, L'/' },=0D - { BOXDRAW_UP_DOUBLE_LEFT, 0xbd, L'/' },=0D - { BOXDRAW_DOUBLE_UP_LEFT, 0xbc, L'/' },=0D - { BOXDRAW_VERTICAL_RIGHT_DOUBLE, 0xc6, L'|' },=0D - { BOXDRAW_VERTICAL_DOUBLE_RIGHT, 0xc7, L'|' },=0D - { BOXDRAW_DOUBLE_VERTICAL_RIGHT, 0xcc, L'|' },=0D - { BOXDRAW_VERTICAL_LEFT_DOUBLE, 0xb5, L'|' },=0D - { BOXDRAW_VERTICAL_DOUBLE_LEFT, 0xb6, L'|' },=0D - { BOXDRAW_DOUBLE_VERTICAL_LEFT, 0xb9, L'|' },=0D - { BOXDRAW_DOWN_HORIZONTAL_DOUBLE, 0xd1, L'+' },=0D - { BOXDRAW_DOWN_DOUBLE_HORIZONTAL, 0xd2, L'+' },=0D - { BOXDRAW_DOUBLE_DOWN_HORIZONTAL, 0xcb, L'+' },=0D - { BOXDRAW_UP_HORIZONTAL_DOUBLE, 0xcf, L'+' },=0D - { BOXDRAW_UP_DOUBLE_HORIZONTAL, 0xd0, L'+' },=0D - { BOXDRAW_DOUBLE_UP_HORIZONTAL, 0xca, L'+' },=0D - { BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE, 0xd8, L'+' },=0D - { BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL, 0xd7, L'+' },=0D - { BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL, 0xce, L'+' },=0D + { BOXDRAW_HORIZONTAL, 0xc4, L'-', 0x71 },=0D + { BOXDRAW_VERTICAL, 0xb3, L'|', 0x78 },=0D + { BOXDRAW_DOWN_RIGHT, 0xda, L'/', 0x6c },=0D + { BOXDRAW_DOWN_LEFT, 0xbf, L'\\', 0x6b },=0D + { BOXDRAW_UP_RIGHT, 0xc0, L'\\', 0x6d },=0D + { BOXDRAW_UP_LEFT, 0xd9, L'/', 0x6a },=0D + { BOXDRAW_VERTICAL_RIGHT, 0xc3, L'|', 0x74 },=0D + { BOXDRAW_VERTICAL_LEFT, 0xb4, L'|', 0x75 },=0D + { BOXDRAW_DOWN_HORIZONTAL, 0xc2, L'+', 0x77 },=0D + { BOXDRAW_UP_HORIZONTAL, 0xc1, L'+', 0x76 },=0D + { BOXDRAW_VERTICAL_HORIZONTAL, 0xc5, L'+', 0x6e },=0D + { BOXDRAW_DOUBLE_HORIZONTAL, 0xcd, L'-', 0x71 },=0D + { BOXDRAW_DOUBLE_VERTICAL, 0xba, L'|', 0x78 },=0D + { BOXDRAW_DOWN_RIGHT_DOUBLE, 0xd5, L'/', 0x6c },=0D + { BOXDRAW_DOWN_DOUBLE_RIGHT, 0xd6, L'/', 0x6c },=0D + { BOXDRAW_DOUBLE_DOWN_RIGHT, 0xc9, L'/', 0x6c },=0D + { BOXDRAW_DOWN_LEFT_DOUBLE, 0xb8, L'\\', 0x6b },=0D + { BOXDRAW_DOWN_DOUBLE_LEFT, 0xb7, L'\\', 0x6b },=0D + { BOXDRAW_DOUBLE_DOWN_LEFT, 0xbb, L'\\', 0x6b },=0D + { BOXDRAW_UP_RIGHT_DOUBLE, 0xd4, L'\\', 0x6d },=0D + { BOXDRAW_UP_DOUBLE_RIGHT, 0xd3, L'\\', 0x6d },=0D + { BOXDRAW_DOUBLE_UP_RIGHT, 0xc8, L'\\', 0x6d },=0D + { BOXDRAW_UP_LEFT_DOUBLE, 0xbe, L'/', 0x6a },=0D + { BOXDRAW_UP_DOUBLE_LEFT, 0xbd, L'/', 0x6a },=0D + { BOXDRAW_DOUBLE_UP_LEFT, 0xbc, L'/', 0x6a },=0D + { BOXDRAW_VERTICAL_RIGHT_DOUBLE, 0xc6, L'|', 0x74 },=0D + { BOXDRAW_VERTICAL_DOUBLE_RIGHT, 0xc7, L'|', 0x74 },=0D + { BOXDRAW_DOUBLE_VERTICAL_RIGHT, 0xcc, L'|', 0x74 },=0D + { BOXDRAW_VERTICAL_LEFT_DOUBLE, 0xb5, L'|', 0x75 },=0D + { BOXDRAW_VERTICAL_DOUBLE_LEFT, 0xb6, L'|', 0x75 },=0D + { BOXDRAW_DOUBLE_VERTICAL_LEFT, 0xb9, L'|', 0x75 },=0D + { BOXDRAW_DOWN_HORIZONTAL_DOUBLE, 0xd1, L'+', 0x77 },=0D + { BOXDRAW_DOWN_DOUBLE_HORIZONTAL, 0xd2, L'+', 0x77 },=0D + { BOXDRAW_DOUBLE_DOWN_HORIZONTAL, 0xcb, L'+', 0x77 },=0D + { BOXDRAW_UP_HORIZONTAL_DOUBLE, 0xcf, L'+', 0x76 },=0D + { BOXDRAW_UP_DOUBLE_HORIZONTAL, 0xd0, L'+', 0x76 },=0D + { BOXDRAW_DOUBLE_UP_HORIZONTAL, 0xca, L'+', 0x76 },=0D + { BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE, 0xd8, L'+', 0x6e },=0D + { BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL, 0xd7, L'+', 0x6e },=0D + { BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL, 0xce, L'+', 0x6e },=0D =0D - { BLOCKELEMENT_FULL_BLOCK, 0xdb, L'*' },=0D - { BLOCKELEMENT_LIGHT_SHADE, 0xb0, L'+' },=0D + { BLOCKELEMENT_FULL_BLOCK, 0xdb, L'*', 0x61 },=0D + { BLOCKELEMENT_LIGHT_SHADE, 0xb0, L'+', 0x61 },=0D =0D - { GEOMETRICSHAPE_UP_TRIANGLE, '^', L'^' },=0D - { GEOMETRICSHAPE_RIGHT_TRIANGLE, '>', L'>' },=0D - { GEOMETRICSHAPE_DOWN_TRIANGLE, 'v', L'v' },=0D - { GEOMETRICSHAPE_LEFT_TRIANGLE, '<', L'<' },=0D + { GEOMETRICSHAPE_UP_TRIANGLE, '^', L'^', L'^' },=0D + { GEOMETRICSHAPE_RIGHT_TRIANGLE, '>', L'>', L'>' },=0D + { GEOMETRICSHAPE_DOWN_TRIANGLE, 'v', L'v', L'v' },=0D + { GEOMETRICSHAPE_LEFT_TRIANGLE, '<', L'<', L'<' },=0D =0D - { ARROW_LEFT, '<', L'<' },=0D - { ARROW_UP, '^', L'^' },=0D - { ARROW_RIGHT, '>', L'>' },=0D - { ARROW_DOWN, 'v', L'v' },=0D -=0D - { 0x0000, 0x00, L'\0' }=0D + { ARROW_LEFT, '<', L'<', L'<' },=0D + { ARROW_UP, '^', L'^', L'^' },=0D + { ARROW_RIGHT, '>', L'>', L'>' },=0D + { ARROW_DOWN, 'v', L'v', L'v' },=0D };=0D =0D CHAR16 mSetModeString[] =3D { ESC, '[', '=3D', '3', 'h', 0 };=0D @@ -80,6 +78,8 @@ CHAR16 mSetCursorPositionString[] =3D { ESC, '[', '0', '= 0', ';', '0', '0', 'H', 0 CHAR16 mCursorForwardString[] =3D { ESC, '[', '0', '0', 'C', 0 };=0D CHAR16 mCursorBackwardString[] =3D { ESC, '[', '0', '0', 'D', 0 };=0D =0D +CHAR8 SetDecModeString[] =3D {ESC, 0x28, 0x30};=0D +CHAR8 ExitDecModeString[] =3D {ESC, 0x28, 0x42};=0D //=0D // Body of the ConOut functions=0D //=0D @@ -183,16 +183,19 @@ TerminalConOutOutputString ( EFI_STATUS Status;=0D UINT8 ValidBytes;=0D CHAR8 CrLfStr[2];=0D + CHAR8 DecChar;=0D + UINTN ModeSwitchLength;=0D //=0D // flag used to indicate whether condition happens which will cause=0D // return EFI_WARN_UNKNOWN_GLYPH=0D //=0D BOOLEAN Warning;=0D =0D - ValidBytes =3D 0;=0D - Warning =3D FALSE;=0D - AsciiChar =3D 0;=0D -=0D + ValidBytes =3D 0;=0D + Warning =3D FALSE;=0D + AsciiChar =3D 0;=0D + DecChar =3D 0;=0D + ModeSwitchLength =3D LENGTH_DEC_ESCAPE;=0D //=0D // get Terminal device data structure pointer.=0D //=0D @@ -217,17 +220,104 @@ TerminalConOutOutputString ( for (; *WString !=3D CHAR_NULL; WString++) {=0D =0D switch (TerminalDevice->TerminalType) {=0D -=0D case TerminalTypePcAnsi:=0D - case TerminalTypeVt100:=0D - case TerminalTypeVt100Plus:=0D - case TerminalTypeTtyTerm:=0D - case TerminalTypeLinux:=0D + if (!TerminalIsValidTextGraphics (*WString, &GraphicChar, &AsciiChar= , NULL)) {=0D + //=0D + // If it's not a graphic character convert Unicode to ASCII.=0D + //=0D + GraphicChar =3D (CHAR8)*WString;=0D +=0D + if (!(TerminalIsValidAscii (GraphicChar) || TerminalIsValidEfiCntl= Char (GraphicChar))) {=0D + //=0D + // when this driver use the OutputString to output control strin= g,=0D + // TerminalDevice->OutputEscChar is set to let the Esc char=0D + // to be output to the terminal emulation software.=0D + //=0D + if ((GraphicChar =3D=3D ESC) && TerminalDevice->OutputEscChar) {= =0D + GraphicChar =3D ESC;=0D + } else {=0D + GraphicChar =3D '?';=0D + Warning =3D TRUE;=0D + }=0D + }=0D +=0D + AsciiChar =3D GraphicChar;=0D + }=0D + Length =3D 1;=0D + Status =3D TerminalDevice->SerialIo->Write (=0D + TerminalDevice->SerialIo,=0D + &Length,=0D + &GraphicChar=0D + );=0D +=0D + if (EFI_ERROR (Status)) {=0D + goto OutputError;=0D + }=0D +=0D + break;=0D case TerminalTypeXtermR6:=0D - case TerminalTypeVt400:=0D case TerminalTypeSCO:=0D + //=0D + // Box graphics are split into 2 types simple and advanced.=0D + // Simple are drawn with dec special graphics.=0D + // Advanced are drawn with utf8.=0D + // This checks for simple because they have a lower value than the a= dvanced.=0D + //=0D + if (TerminalIsValidTextGraphics (*WString, NULL, NULL, &DecChar) && = *WString < BOXDRAW_DOUBLE_HORIZONTAL) {=0D + if (!TerminalDevice->DecSpecialGraphicsMode) {=0D + ModeSwitchLength =3D LENGTH_DEC_ESCAPE;=0D + Status =3D TerminalDevice->SerialIo->Write (=0D + TerminalDevice->SerialIo,=0D + &ModeSwitchLength,=0D + (UINT8 *)SetDecModeString=0D + );=0D + if (EFI_ERROR (Status)) {=0D + goto OutputError;=0D + }=0D + TerminalDevice->DecSpecialGraphicsMode =3D TRUE;=0D + }=0D =0D - if (!TerminalIsValidTextGraphics (*WString, &GraphicChar, &AsciiChar= )) {=0D + GraphicChar =3D DecChar;=0D + Length =3D 1;=0D + } else {=0D + if (TerminalDevice->DecSpecialGraphicsMode) {=0D + Status =3D TerminalDevice->SerialIo->Write (=0D + TerminalDevice->SerialIo,=0D + &ModeSwitchLength,=0D + (UINT8 *)ExitDecModeString=0D + );=0D + if (EFI_ERROR (Status)) {=0D + goto OutputError;=0D + }=0D +=0D + TerminalDevice->DecSpecialGraphicsMode =3D FALSE;=0D + }=0D + UnicodeToUtf8 (*WString, &Utf8Char, &ValidBytes);=0D + Length =3D ValidBytes;=0D + }=0D +=0D + if (ValidBytes) {=0D + Status =3D TerminalDevice->SerialIo->Write (=0D + TerminalDevice->SerialIo,=0D + &Length,=0D + (UINT8 *)&Utf8Char=0D + );=0D + ValidBytes =3D 0;=0D + } else {=0D + Status =3D TerminalDevice->SerialIo->Write (=0D + TerminalDevice->SerialIo,=0D + &Length,=0D + &GraphicChar=0D + );=0D + }=0D + if (EFI_ERROR (Status)) {=0D + goto OutputError;=0D + }=0D +=0D + break;=0D + case TerminalTypeVt100:=0D + case TerminalTypeTtyTerm:=0D + if (!TerminalIsValidTextGraphics (*WString, &GraphicChar, &AsciiChar= , NULL)) {=0D //=0D // If it's not a graphic character convert Unicode to ASCII.=0D //=0D @@ -239,8 +329,8 @@ TerminalConOutOutputString ( // TerminalDevice->OutputEscChar is set to let the Esc char=0D // to be output to the terminal emulation software.=0D //=0D - if ((GraphicChar =3D=3D 27) && TerminalDevice->OutputEscChar) {= =0D - GraphicChar =3D 27;=0D + if ((GraphicChar =3D=3D ESC) && TerminalDevice->OutputEscChar) {= =0D + GraphicChar =3D ESC;=0D } else {=0D GraphicChar =3D '?';=0D Warning =3D TRUE;=0D @@ -248,14 +338,73 @@ TerminalConOutOutputString ( }=0D =0D AsciiChar =3D GraphicChar;=0D -=0D }=0D =0D - if (TerminalDevice->TerminalType !=3D TerminalTypePcAnsi) {=0D - GraphicChar =3D AsciiChar;=0D + GraphicChar =3D AsciiChar;=0D +=0D + Length =3D 1;=0D +=0D + Status =3D TerminalDevice->SerialIo->Write (=0D + TerminalDevice->SerialIo,=0D + &Length,=0D + &GraphicChar=0D + );=0D +=0D + if (EFI_ERROR (Status)) {=0D + goto OutputError;=0D }=0D =0D + break;=0D + case TerminalTypeVt100Plus:=0D + case TerminalTypeVt400:=0D Length =3D 1;=0D + if (TerminalIsValidTextGraphics (*WString, NULL, NULL, &DecChar)) {= =0D + if (!TerminalDevice->DecSpecialGraphicsMode) {=0D + ModeSwitchLength =3D LENGTH_DEC_ESCAPE;=0D + Status =3D TerminalDevice->SerialIo->Write (=0D + TerminalDevice->SerialIo,=0D + &ModeSwitchLength,=0D + (UINT8 *)SetDecModeString=0D + );=0D + if (EFI_ERROR (Status)) {=0D + goto OutputError;=0D + } =0D + TerminalDevice->DecSpecialGraphicsMode =3D TRUE;=0D + }=0D +=0D + GraphicChar =3D DecChar;=0D + } else {=0D + if (TerminalDevice->DecSpecialGraphicsMode) {=0D + ModeSwitchLength =3D LENGTH_DEC_ESCAPE;=0D + Status =3D TerminalDevice->SerialIo->Write (=0D + TerminalDevice->SerialIo,=0D + &ModeSwitchLength,=0D + (UINT8 *)ExitDecModeString=0D + );=0D +=0D + if (EFI_ERROR (Status)) {=0D + goto OutputError;=0D + }=0D +=0D + TerminalDevice->DecSpecialGraphicsMode =3D FALSE;=0D + }=0D +=0D + GraphicChar =3D (CHAR8)*WString;=0D +=0D + if (!(TerminalIsValidAscii (GraphicChar) || TerminalIsValidEfiCntl= Char (GraphicChar))) {=0D + //=0D + // when this driver use the OutputString to output control strin= g,=0D + // TerminalDevice->OutputEscChar is set to let the Esc char=0D + // to be output to the terminal emulation software.=0D + //=0D + if ((GraphicChar =3D=3D ESC) && TerminalDevice->OutputEscChar) {= =0D + GraphicChar =3D ESC;=0D + } else {=0D + GraphicChar =3D '?';=0D + Warning =3D TRUE;=0D + }=0D + }=0D + }=0D =0D Status =3D TerminalDevice->SerialIo->Write (=0D TerminalDevice->SerialIo,=0D @@ -268,7 +417,7 @@ TerminalConOutOutputString ( }=0D =0D break;=0D -=0D + case TerminalTypeLinux:=0D case TerminalTypeVtUtf8:=0D UnicodeToUtf8 (*WString, &Utf8Char, &ValidBytes);=0D Length =3D ValidBytes;=0D @@ -280,8 +429,10 @@ TerminalConOutOutputString ( if (EFI_ERROR (Status)) {=0D goto OutputError;=0D }=0D +=0D break;=0D }=0D +=0D //=0D // Update cursor position.=0D //=0D @@ -875,7 +1026,8 @@ BOOLEAN TerminalIsValidTextGraphics (=0D IN CHAR16 Graphic,=0D OUT CHAR8 *PcAnsi, OPTIONAL=0D - OUT CHAR8 *Ascii OPTIONAL=0D + OUT CHAR8 *Ascii, OPTIONAL=0D + OUT CHAR8 *DecSpecialGraphics OPTIONAL=0D )=0D {=0D UNICODE_TO_CHAR *Table;=0D @@ -897,6 +1049,9 @@ TerminalIsValidTextGraphics ( if (Ascii !=3D NULL) {=0D *Ascii =3D Table->Ascii;=0D }=0D + if (DecSpecialGraphics !=3D NULL){=0D + *DecSpecialGraphics =3D Table->DecSpecialGraphics;=0D + }=0D =0D return TRUE;=0D }=0D --=20 2.33.0