From nobody Fri May 3 14:01:24 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+79214+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+79214+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1628812870; cv=none; d=zohomail.com; s=zohoarc; b=PdHWwPHkH5JA8pzeY+jaKVKpJ2txAMgtII1w6+fwPQLpMIpkL5EyYAWbc05wB4pTh+w9YkbBb9DhMnCLmBtqg2EFGYCzl71Xij4zVZllVnIkW+zeCXlla//1h7QBfigfqeWr9pz4N5oDWZQfxsdxaTwGtrWSHKKKiJr0DPvCBkM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1628812870; 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=m/0y9WCBJoMgFZNLXvcdGuze1Xv2Iz6B8GCBDIKfoVU=; b=JUHXiqvjryFa76lpy5KSzu40hH6kkLm8l9A4TPJuqUhAaQCMnno8QG+ZhqP0XxlyAPe2nldoNvtGuIC3Q/xulz+LG91KR7rNEFSbZjLpX74tGaTCVftUFACx3amKRrZvhLCLAVnCsT2YqI9XoodwixE8Jeueh2kbGvVpm1C278c= 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+79214+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 1628812870737225.6197719855893; Thu, 12 Aug 2021 17:01:10 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id whL2YY1788612xCUXPhVEV7y; Thu, 12 Aug 2021 17:01:10 -0700 X-Received: from mail-il1-f174.google.com (mail-il1-f174.google.com [209.85.166.174]) by mx.groups.io with SMTP id smtpd.web08.30372.1628812869371675710 for ; Thu, 12 Aug 2021 17:01:09 -0700 X-Received: by mail-il1-f174.google.com with SMTP id w6so4029583ill.3 for ; Thu, 12 Aug 2021 17:01:09 -0700 (PDT) X-Gm-Message-State: 9PrICDCOWohaT55yFM7l9yjcx1787277AA= X-Google-Smtp-Source: ABdhPJycHk1HeSJj0lFtCHwJ3UFjSIpaBH3+j38/0AN0tN8zFeshDsJDCs4L9a0qaVSf/1qTJnJLPQ== X-Received: by 2002:a05:6e02:54c:: with SMTP id i12mr770047ils.103.1628812868666; Thu, 12 Aug 2021 17:01:08 -0700 (PDT) X-Received: from cadenxps.localdomain ([184.16.70.105]) by smtp.gmail.com with ESMTPSA id a6sm83371ilb.59.2021.08.12.17.01.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Aug 2021 17:01:08 -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 v2 1/1] MdeModulePkg/Console: Improve encoding of box drawing characters Date: Thu, 12 Aug 2021 20:00:22 -0400 Message-Id: <20210813000022.1145416-2-cadenkline9@gmail.com> In-Reply-To: <20210813000022.1145416-1-cadenkline9@gmail.com> References: <20210813000022.1145416-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=1628812870; bh=rSDG7SHsGLoc/xImuVccwz1uObzUpj45VOo4AGeLwBw=; h=Cc:Date:From:Reply-To:Subject:To; b=EiQaiHprtsUlwlzvIZiYu/uMuacxnDWIQ1SOoqnd2LONCfIde4nFKdb8k8elvOMqa4c tUGChpLqn4kGia7gyuwTzbBuibqgt/glbREinjspYwb9sPmnd37kJpvQjJZPD14/8lJ0x p7ynBTp99gynwWRxqR1DOWoHm2XpAkObGyc= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1628812872735100006 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. 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/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..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[] =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,137 @@ 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 27) && TerminalDevice->OutputEscChar) { + GraphicChar =3D 27; + } 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: + 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 =3D 0; + ModeSwitchLength =3D LENGTH_DEC_ESCAPE; + Status =3D TerminalDevice->SerialIo->Write ( + TerminalDevice->SerialIo, + &ModeSwitchLength, + (UINT8 *)SetDecModeString + ); + TerminalDevice->DecSpecialGraphicsMode =3D TRUE; + } =20 - if (!TerminalIsValidTextGraphics (*WString, &GraphicChar, &AsciiChar= )) { + GraphicChar =3D DecChar; + Length =3D 1; + } 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; + } + + UnicodeToUtf8 (*WString, &Utf8Char, &ValidBytes); + Length =3D ValidBytes; + } + } else { + if (TerminalDevice->DecSpecialGraphicsMode) { + 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 27) && TerminalDevice->OutputEscChar) { + GraphicChar =3D 27; + Length =3D 1; + } else { + UnicodeToUtf8 (*WString, &Utf8Char, &ValidBytes); + Length =3D ValidBytes; + } + } else { + Length =3D 1; + } + } + + 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. // @@ -248,14 +371,70 @@ 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 + ); + 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 27) && TerminalDevice->OutputEscChar) { + GraphicChar =3D 27; + } else { + GraphicChar =3D '?'; + Warning =3D TRUE; + } + } + } =20 Status =3D TerminalDevice->SerialIo->Write ( TerminalDevice->SerialIo, @@ -268,7 +447,7 @@ TerminalConOutOutputString ( } =20 break; - + case TerminalTypeLinux: case TerminalTypeVtUtf8: UnicodeToUtf8 (*WString, &Utf8Char, &ValidBytes); Length =3D 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 !=3D NULL) { *Ascii =3D Table->Ascii; } + if (DecSpecialGraphics !=3D NULL){ + *DecSpecialGraphics =3D Table->DecSpecialGraphics; + } =20 return TRUE; } --=20 2.32.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 (#79214): https://edk2.groups.io/g/devel/message/79214 Mute This Topic: https://groups.io/mt/84853186/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-