From nobody Wed May 1 09:26:18 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+79692+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+79692+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1629686662; cv=none; d=zohomail.com; s=zohoarc; b=mBRI1DDlp75WTaPHThwcv478t5hmA5lw8hNjwKv+SGkVWPWTijjeHmjspGw1FJSjyJ2SI+TMRIO2BiWl5uA3ikdzMapLEwl3f2DAu7HAfzI9YD0MXcaqD5jiKI9Tg6M69tlTHA1gzZP4N3N0l3vP2f/1D0M22ZQ1WFgxQZzUv9s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1629686662; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=QjNrx3gQzD2KQZvQGUwAlw2EbMs4JgoznEq1MyPZt8U=; b=AyuhNgKSMj+r+ojiomzscf8eGnSTHYSVlWhqhxhwKVNc1B8RVL21Hbobu7lu7/Gohr32oUAPr48FSBh7k/bKX4ATS0vbYepbUn/iITBgOKMMlGfxsRnGKojUsAqg4lNqT53T3zE4PpaH1b55iPF5piQA1K5L5K8F6YAVW3BEB7U= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+79692+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1629686662537816.0065637163109; Sun, 22 Aug 2021 19:44:22 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id B5n5YY1788612xlvWMJE4xBm; Sun, 22 Aug 2021 19:44:22 -0700 X-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 X-Received: by mail-il1-f169.google.com with SMTP id s16so15646811ilo.9 for ; Sun, 22 Aug 2021 19:44:21 -0700 (PDT) X-Gm-Message-State: IAHpqWgBlq18wkRpfqqJ2Zk0x1787277AA= 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) X-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: [edk2-devel] [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> In-Reply-To: <20210823024416.377856-1-cadenkline9@gmail.com> References: <20210823024416.377856-1-cadenkline9@gmail.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,cadenkline9@gmail.com Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1629686662; bh=/rSd64sVxl8WHL6n3rF1vGZPeZlutIxWkZMteILYLE8=; h=Cc:Date:From:Reply-To:Subject:To; b=bTwPv82DZ3nS1TtNcB5qZ6JutiUQtoLAhQSc00fRupPvmoNbRIp98T4PtEViAJFrFP0 KJI4n+QGlOOj8m4IusZGY0D/LZqsD91kyp+06E+VPQyuecNeD+g09bAbihXEPh2oeMmph Xcm7Zz1TFcjmJiTm7jxVo0g3MMCed5k55tM= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1629686663946100004 Content-Type: text/plain; charset="utf-8" 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; LIST_ENTRY NotifyList; EFI_EVENT KeyNotifyProcessEvent; + BOOLEAN DecSpecialGraphicsMode; } TERMINAL_DEV; +// +// This the length the escape sequences for entering and exiting Dec Speci= al Graphics Mode +// +#define LENGTH_DEC_ESCAPE 0x03 =20 #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; =20 // @@ -1367,20 +1373,22 @@ Utf8ToUnicode ( /** Detects if a Unicode char is for Box Drawing text graphics. =20 - @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 chara= cter. + @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 Graph= ics equivalent of + Graphic. + @retval TRUE If Graphic is a supported Unicode Box Drawin= g character. =20 **/ 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 ); =20 /** 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 ( =20 if ( !(TerminalIsValidAscii (*WString) || TerminalIsValidEfiCntlChar (*WString) || - TerminalIsValidTextGraphics (*WString, &GraphicChar, NULL) )) { + TerminalIsValidTextGraphics (*WString, &GraphicChar, NULL, NULL) )= ) { =20 return EFI_UNSUPPORTED; } 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 // // UNICODE_TO_CHAR UnicodeToPcAnsiOrAscii[] =3D { - { 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 }, =20 - { BLOCKELEMENT_FULL_BLOCK, 0xdb, L'*' }, - { BLOCKELEMENT_LIGHT_SHADE, 0xb0, L'+' }, + { BLOCKELEMENT_FULL_BLOCK, 0xdb, L'*', 0x61 }, + { BLOCKELEMENT_LIGHT_SHADE, 0xb0, L'+', 0x61 }, =20 - { 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'<' }, =20 - { 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' }, }; =20 CHAR16 mSetModeString[] =3D { ESC, '[', '=3D', '3', 'h', 0 }; @@ -80,6 +78,8 @@ CHAR16 mSetCursorPositionString[] =3D { ESC, '[', '0', '= 0', ';', '0', '0', 'H', 0 CHAR16 mCursorForwardString[] =3D { ESC, '[', '0', '0', 'C', 0 }; CHAR16 mCursorBackwardString[] =3D { ESC, '[', '0', '0', 'D', 0 }; =20 +CHAR8 SetDecModeString[] =3D {ESC, 0x28, 0x30}; +CHAR8 ExitDecModeString[] =3D {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; =20 - ValidBytes =3D 0; - Warning =3D FALSE; - AsciiChar =3D 0; - + ValidBytes =3D 0; + Warning =3D FALSE; + AsciiChar =3D 0; + DecChar =3D 0; + ModeSwitchLength =3D LENGTH_DEC_ESCAPE; // // get Terminal device data structure pointer. // @@ -217,17 +220,104 @@ TerminalConOutOutputString ( for (; *WString !=3D CHAR_NULL; WString++) { =20 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 =3D (CHAR8)*WString; + + if (!(TerminalIsValidAscii (GraphicChar) || TerminalIsValidEfiCntl= Char (GraphicChar))) { + // + // when this driver use the OutputString to output control strin= g, + // TerminalDevice->OutputEscChar is set to let the Esc char + // to be output to the terminal emulation software. + // + if ((GraphicChar =3D=3D ESC) && TerminalDevice->OutputEscChar) { + GraphicChar =3D ESC; + } else { + GraphicChar =3D '?'; + Warning =3D TRUE; + } + } + + AsciiChar =3D GraphicChar; + } + Length =3D 1; + Status =3D TerminalDevice->SerialIo->Write ( + TerminalDevice->SerialIo, + &Length, + &GraphicChar + ); + + if (EFI_ERROR (Status)) { + goto OutputError; + } + + break; case TerminalTypeXtermR6: - case TerminalTypeVt400: case TerminalTypeSCO: + // + // 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 a= dvanced. + // + if (TerminalIsValidTextGraphics (*WString, NULL, NULL, &DecChar) && = *WString < BOXDRAW_DOUBLE_HORIZONTAL) { + if (!TerminalDevice->DecSpecialGraphicsMode) { + ModeSwitchLength =3D LENGTH_DEC_ESCAPE; + Status =3D TerminalDevice->SerialIo->Write ( + TerminalDevice->SerialIo, + &ModeSwitchLength, + (UINT8 *)SetDecModeString + ); + if (EFI_ERROR (Status)) { + goto OutputError; + } + TerminalDevice->DecSpecialGraphicsMode =3D TRUE; + } =20 - if (!TerminalIsValidTextGraphics (*WString, &GraphicChar, &AsciiChar= )) { + GraphicChar =3D DecChar; + Length =3D 1; + } else { + if (TerminalDevice->DecSpecialGraphicsMode) { + Status =3D TerminalDevice->SerialIo->Write ( + TerminalDevice->SerialIo, + &ModeSwitchLength, + (UINT8 *)ExitDecModeString + ); + if (EFI_ERROR (Status)) { + goto OutputError; + } + + TerminalDevice->DecSpecialGraphicsMode =3D FALSE; + } + UnicodeToUtf8 (*WString, &Utf8Char, &ValidBytes); + Length =3D ValidBytes; + } + + if (ValidBytes) { + Status =3D TerminalDevice->SerialIo->Write ( + TerminalDevice->SerialIo, + &Length, + (UINT8 *)&Utf8Char + ); + ValidBytes =3D 0; + } else { + Status =3D 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. // @@ -239,8 +329,8 @@ TerminalConOutOutputString ( // TerminalDevice->OutputEscChar is set to let the Esc char // to be output to the terminal emulation software. // - if ((GraphicChar =3D=3D 27) && TerminalDevice->OutputEscChar) { - GraphicChar =3D 27; + if ((GraphicChar =3D=3D ESC) && TerminalDevice->OutputEscChar) { + GraphicChar =3D ESC; } else { GraphicChar =3D '?'; Warning =3D TRUE; @@ -248,14 +338,73 @@ TerminalConOutOutputString ( } =20 AsciiChar =3D GraphicChar; - } =20 - if (TerminalDevice->TerminalType !=3D TerminalTypePcAnsi) { - GraphicChar =3D AsciiChar; + GraphicChar =3D AsciiChar; + + Length =3D 1; + + Status =3D TerminalDevice->SerialIo->Write ( + TerminalDevice->SerialIo, + &Length, + &GraphicChar + ); + + if (EFI_ERROR (Status)) { + goto OutputError; } =20 + break; + case TerminalTypeVt100Plus: + case TerminalTypeVt400: Length =3D 1; + if (TerminalIsValidTextGraphics (*WString, NULL, NULL, &DecChar)) { + if (!TerminalDevice->DecSpecialGraphicsMode) { + ModeSwitchLength =3D LENGTH_DEC_ESCAPE; + Status =3D TerminalDevice->SerialIo->Write ( + TerminalDevice->SerialIo, + &ModeSwitchLength, + (UINT8 *)SetDecModeString + ); + if (EFI_ERROR (Status)) { + goto OutputError; + } =20 + TerminalDevice->DecSpecialGraphicsMode =3D TRUE; + } + + GraphicChar =3D DecChar; + } else { + if (TerminalDevice->DecSpecialGraphicsMode) { + ModeSwitchLength =3D LENGTH_DEC_ESCAPE; + Status =3D TerminalDevice->SerialIo->Write ( + TerminalDevice->SerialIo, + &ModeSwitchLength, + (UINT8 *)ExitDecModeString + ); + + if (EFI_ERROR (Status)) { + goto OutputError; + } + + TerminalDevice->DecSpecialGraphicsMode =3D FALSE; + } + + GraphicChar =3D (CHAR8)*WString; + + if (!(TerminalIsValidAscii (GraphicChar) || TerminalIsValidEfiCntl= Char (GraphicChar))) { + // + // when this driver use the OutputString to output control strin= g, + // TerminalDevice->OutputEscChar is set to let the Esc char + // to be output to the terminal emulation software. + // + if ((GraphicChar =3D=3D ESC) && TerminalDevice->OutputEscChar) { + GraphicChar =3D ESC; + } else { + GraphicChar =3D '?'; + Warning =3D TRUE; + } + } + } =20 Status =3D TerminalDevice->SerialIo->Write ( TerminalDevice->SerialIo, @@ -268,7 +417,7 @@ TerminalConOutOutputString ( } =20 break; - + case TerminalTypeLinux: case TerminalTypeVtUtf8: UnicodeToUtf8 (*WString, &Utf8Char, &ValidBytes); Length =3D ValidBytes; @@ -280,8 +429,10 @@ TerminalConOutOutputString ( if (EFI_ERROR (Status)) { goto OutputError; } + break; } + // // Update cursor position. // @@ -875,7 +1026,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 +1049,9 @@ TerminalIsValidTextGraphics ( if (Ascii !=3D NULL) { *Ascii =3D Table->Ascii; } + if (DecSpecialGraphics !=3D NULL){ + *DecSpecialGraphics =3D Table->DecSpecialGraphics; + } =20 return TRUE; } --=20 2.33.0 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#79692): https://edk2.groups.io/g/devel/message/79692 Mute This Topic: https://groups.io/mt/85077437/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-