From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by mx.groups.io with SMTP id smtpd.web11.79.1630014824916096543 for ; Thu, 26 Aug 2021 14:53:45 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@intel.onmicrosoft.com header.s=selector2-intel-onmicrosoft-com header.b=AjF/K1g7; spf=pass (domain: intel.com, ip: 192.55.52.93, mailfrom: nathaniel.l.desimone@intel.com) X-IronPort-AV: E=McAfee;i="6200,9189,10088"; a="214721698" X-IronPort-AV: E=Sophos;i="5.84,354,1620716400"; d="scan'208";a="214721698" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Aug 2021 14:53:43 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,354,1620716400"; d="scan'208";a="517072717" Received: from fmsmsx604.amr.corp.intel.com ([10.18.126.84]) by fmsmga004.fm.intel.com with ESMTP; 26 Aug 2021 14:53:43 -0700 Received: from fmsmsx610.amr.corp.intel.com (10.18.126.90) by fmsmsx604.amr.corp.intel.com (10.18.126.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.10; Thu, 26 Aug 2021 14:53:43 -0700 Received: from fmsmsx611.amr.corp.intel.com (10.18.126.91) by fmsmsx610.amr.corp.intel.com (10.18.126.90) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.10; Thu, 26 Aug 2021 14:53:42 -0700 Received: from FMSEDG603.ED.cps.intel.com (10.1.192.133) by fmsmsx611.amr.corp.intel.com (10.18.126.91) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.10 via Frontend Transport; Thu, 26 Aug 2021 14:53:42 -0700 Received: from NAM11-CO1-obe.outbound.protection.outlook.com (104.47.56.176) by edgegateway.intel.com (192.55.55.68) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2242.10; Thu, 26 Aug 2021 14:53:42 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=PDFxiKBrYt/lD9T9lKnYwbAtEno0BueZDtpREpFkHc17FyJlqYyqYilWQMnVt1/TYqoPr8mr6XfvUaeYBlrroqlaNoAWYVpE14S8AWqsZifTVqWPV6tRO7LoqOBgY/LYsFttc/8H8ynHkQl7AWhInGROuQ3oMBsbu1tjtNirSlYqSnWemFDpZB+DsoWxCs3LQYz7shuTDnzWAb1SQRJuck350KSBoxYhVTIX8z9PvObhLvI9vmu5opp8gkWQV9fp6AHFi9y3GQ8BkjPuleoe4p1l8RwiCCDEaIaY93BkGbR+N7C7yLkwIr6dTcVEE5g6Wxmzo/pkomVujm+gaQqq2w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=rC6K1HebLcyzMaW6CVo4DgDeaa2idrYufR2sUD5gyBc=; b=bPYcZElI2IX8VHwbk8vgjMSvChPCn9rhcvbX1jsMCsdB9FYbBqKbsrf7yGjozGCMW6Lbz18KeepU7fwqREr4VOlhQiNcWyLBdcTqwa8CHkPxYxXv57oJdZwudAWmGdDOFl4Fz7Ia69T8uz7vZO//pd66aHYJg4c4wOB91sMA2fWkgNvurR5PJo8UUkccun1zdFLVAB+2dVOi3k2YdLjaGbZDPYTFxRbl2BkPo4j4Fa2wjt8MDiLKFqq3syxLoMupYZiPzaYdubLNrmMdLAx/VhdbZs4/42VfYO1B8pTOl7fF6zsrV9xqQoINuZGArefkArAC6tZC2a613gZrXagmKg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=rC6K1HebLcyzMaW6CVo4DgDeaa2idrYufR2sUD5gyBc=; b=AjF/K1g7Fcu/l1J5s98fsivKU5JxRKXPW93RCujoskj3T7fcPRR/KUajNf7nbPE56B2ByKfh/pT+dEqObSL9A3AhafCDTZFtejLpOEtG1YvMDoeNDrcfBTvNHCoHQMUc+MDEKHWp+DwJW5521VVwUASHn4Q5Y4Ug6XRPeOpHRCY= Received: from MWHPR1101MB2160.namprd11.prod.outlook.com (2603:10b6:301:5b::12) by MWHPR11MB1567.namprd11.prod.outlook.com (2603:10b6:301:d::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4457.18; Thu, 26 Aug 2021 21:53:39 +0000 Received: from MWHPR1101MB2160.namprd11.prod.outlook.com ([fe80::4421:2284:94aa:8d3a]) by MWHPR1101MB2160.namprd11.prod.outlook.com ([fe80::4421:2284:94aa:8d3a%3]) with mapi id 15.20.4436.024; Thu, 26 Aug 2021 21:53:37 +0000 From: "Nate DeSimone" To: Caden Kline , "devel@edk2.groups.io" CC: "Wang, Jian J" , "Wu, Hao A" , "Gao, Zhichao" , "Ni, Ray" Subject: Re: [PATCH v3 1/1] MdeModulePkg/Console: Improve encoding of box drawing characters Thread-Topic: [PATCH v3 1/1] MdeModulePkg/Console: Improve encoding of box drawing characters Thread-Index: AQHXl8jOGab32I7a7EeNycf7+AuJo6uGWc6Q Date: Thu, 26 Aug 2021 21:53:37 +0000 Message-ID: References: <20210823024416.377856-1-cadenkline9@gmail.com> <20210823024416.377856-2-cadenkline9@gmail.com> In-Reply-To: <20210823024416.377856-2-cadenkline9@gmail.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-reaction: no-action dlp-version: 11.5.1.3 dlp-product: dlpe-windows authentication-results: gmail.com; dkim=none (message not signed) header.d=none;gmail.com; dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: cbc84e42-233f-4800-d734-08d968dbf5b6 x-ms-traffictypediagnostic: MWHPR11MB1567: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:1265; x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: W++Bf+lJ2fjDR9uknwJvupL2Ds/CbWTyWZFMYO5iVWSnTczdkZJISlBTlT31uyNnxjRaYexa+pUMlw9lb7hNHpfUQxiJYr17abP0XEzNH4O4klFmR+VM2e4FKgzsFNrHBkzxn/kVSM278N7OmytEbFvSqOOI49PwNYE3Bv1ENRZ+Ylu7PXnYVQRLraoTS2JXLHizOH27YSc1QC+ldOshQapRLtHeLpTdBF+DRHklxBhjYC+c3umzZTAeuW1s5zga6CFfAFljBPphokE/FvtjYQxef1snDGgQa16LiErJz99eoBxNV0Izk6pgbXO8xYt8bpAAxlpJdq630Yr43//gg9wD3snmS7yGCg0huGRXS+eoovKHf5CCOntr2mE5UPScB7yVoIg27GqfN6v1W/wl7Ke/d4l8DYKIWldJ8B2q8iUC+QcoFUhkQay8TGLoijqUqmuG6VGQemxYmoMVa8V9ZVY182o3sP3ERZ/6GTy/pDNGJHzqrK2IG7ax08jBHmrge2SIC/EvyuZuQ5yT7gREMLNP0jdMUWrX4udY7+rBbc984Z26KQ72POipbs8FxreABH+oJht6eM9k/5RiAJotKeLfY9QQhv9VRhuPAaQCLmsTK1SZJ7Yc+vuLmD2Df95WmTcIVgOxMYpGl7tPgENJUKd2AiFFM2DYZAOHDUlr8ispcRfPhRWfsIYpdkkSOuyC9xaVR2e3lMYwEyeDqSglbHDD+mF0iGXOS+77rpGL6/k/SKk74ck03ksSGjdQGAByDnN/S2IoLlYUbhqQK7eQzhrwCrKHL3rZT5cbWxIfY4w= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MWHPR1101MB2160.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(366004)(66556008)(8936002)(76116006)(52536014)(66946007)(122000001)(66446008)(38070700005)(30864003)(71200400001)(38100700002)(5660300002)(107886003)(64756008)(2906002)(4326008)(66476007)(8676002)(53546011)(508600001)(186003)(26005)(966005)(6506007)(7696005)(86362001)(9686003)(83380400001)(33656002)(110136005)(54906003)(316002)(55016002)(579004);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?a1X0CVpo30SPlzLo+FAMs0T23zaB3RvhCPKHpn3uK6cAVByXsBz+aYYJaNAL?= =?us-ascii?Q?084jA+TCD4O9HGLwKRxZrdhlo6qMSWAkP3g5BKHjxY6NAV4TYiQc417zBOg4?= =?us-ascii?Q?Yr/WQIIrvsCkTVYuoZjuhE3A2eCAAGT5kFZ6zlE4NE90w1XoeKqEBqPBS6iH?= =?us-ascii?Q?dTT74RJYiWp6AuN6U2vfo7gf0YDvhis8pUGvKEmCincRa9O3oA35tL7tFY/q?= =?us-ascii?Q?+1P6wJnEOIcmBSZdbfbvzWLVs4Qa4cueoiSgt3pkLLs27nUmyCGHDVWtvITr?= =?us-ascii?Q?W6cG9iKCx8OuyR5ORBlcmY1lqU4LiC5QMBLRScMMXd0ddk0/qLCWr1bs0ITT?= =?us-ascii?Q?aalZZYcrYiBRGYz5P8UtASW9GE7cJn7TuFBj03/hmJlA1LQbxELXicbjjr7e?= =?us-ascii?Q?HRmVBHNx02FA3nMAo0J1CFXdpoyhu5/IcFxV5+MTR63O65duuSGUv17Z5YCY?= =?us-ascii?Q?ql2l7jGVlU/F9BVnqYJCjCVSpb1hdIrw+h2F2E7RvF7gPW/fOlJ7N3bc/Gmf?= =?us-ascii?Q?Ckh2NHqSdvM3HY2Fzz/8w/b7qIhHFgsg9gWSbiV160Tj6Rnw3aeZ0HtNG7Ij?= =?us-ascii?Q?tOwCcwk3Odj9duxEtZksNQOSNtJVBURC5OVQcM2z2I/Cm977bUkmWgP8tnN+?= =?us-ascii?Q?ZdZJOSbs3PKu8ccFVZesLxNLJkN8nJ5i6V8uhC6T6mpP9ExuaZDxPxHKmA7v?= =?us-ascii?Q?mt0NmVWy0lPdAQM7L6StfvCFlx+boAnI6OGa3kU5bGII6JZp4u/eeBweMUfZ?= =?us-ascii?Q?fIL6pN42N8VyyEUIMTlCFAtvDaIft2jqN3fGUI2Yme5Do8drxe8NBwxNSK8k?= =?us-ascii?Q?0B59ALUVhchhOHfFyeocejyjjePVNjcrgNc7wx/eEPu/oG+40QF5Yw1t8UVf?= =?us-ascii?Q?3STWUA6bM3jhOLtfeO/sx5eKEMyOkzPGnbLhiCo3WcsI19SxYIEtDoMBEpet?= =?us-ascii?Q?SmnHQN5IBkt9zL8JrV+oKihEgxaoEBx1IYwWEfFMePgDf/+WKDhRg+XzK0y7?= =?us-ascii?Q?VqP3YeQpVcaaeD+/RqM5cvZPK/C57gs+7JUFqGnJ4YiQwUqLgPOF1JhjhN2J?= =?us-ascii?Q?eqS70PJXbSo6lVgy3Yn+Dg7Cn6PbgxqHp0NHC0G/R1Oin4yBhZ9+n6TXmXo9?= =?us-ascii?Q?hXxpTIHey+hCQYptKbdBHfjNv86aESkG9a+hyPYJim99tN63Oik5WE/wtmI5?= =?us-ascii?Q?nAsOhxm+fymmdGoP6IwR424RbdsFoG+dua2AY2EQPJFhxWNbaCnfLMJ6EaFg?= =?us-ascii?Q?X5eFyaKKAaheRGziy61LYPP7DbbFrut0lozt8F61TiaHXfpRZ7cMlFdAczXh?= =?us-ascii?Q?LaodcXt58ABl20jr4adJxi0I?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MWHPR1101MB2160.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: cbc84e42-233f-4800-d734-08d968dbf5b6 X-MS-Exchange-CrossTenant-originalarrivaltime: 26 Aug 2021 21:53:37.6234 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 0+VLUxK7qBYKcengBPs1XiQAvNP+KbcXCzRWgaEyFPw7z6+jY7qa50wUK3kEvec1jBCBl1++HEH/oW1oRS9pdozkTv28uObS/fKWhV7jGHY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR11MB1567 Return-Path: nathaniel.l.desimone@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable HI Caden, You accidentally added a bunch of trailing white space on line 371, but tha= t should be fixable during the check-in process. Reviewed-by: Nate DeSimone -----Original Message----- From: Caden Kline =20 Sent: Sunday, August 22, 2021 7:44 PM To: devel@edk2.groups.io Cc: Wang, Jian J ; Wu, Hao A ; G= ao, Zhichao ; Ni, Ray ; Desimone, = Nathaniel L Subject: [PATCH v3 1/1] MdeModulePkg/Console: Improve encoding of box drawi= ng characters 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