4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This module provide help function for displaying unicode string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "UefiLibInternal.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 WChar;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} UNICODE_WIDTH_ENTRY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGLOBAL_REMOVE_IF_UNREFERENCED CONST UNICODE_WIDTH_ENTRY mUnicodeWidthTable[] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // General script area
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x1FFF, 1},
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Merge the blocks and replace them with the above entry as they fall to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * the same category and they are all narrow glyph. This will reduce search
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * time and table size. The merge will omit the reserved code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Remove the above item if below is un-commented.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x007F, 1}, // C0 controls and basic Latin. 0x0000-0x007F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x00FF, 1}, // C1 controls and Latin-1 support. 0x0080-0x00FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x017F, 1}, // Latin extended-A. 0x0100-0x017F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x024F, 1}, // Latin extended-B. 0x0180-0x024F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x02AF, 1}, // IPA extensions. 0x0250-0x02AF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x02FF, 1}, // Spacing modifier letters. 0x02B0-0x02FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x036F, 1}, // Combining diacritical marks. 0x0300-0x036F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x03FF, 1}, // Greek. 0x0370-0x03FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x04FF, 1}, // Cyrillic. 0x0400-0x04FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x052F, 0}, // Unassigned. As Armenian in ver3.0. 0x0500-0x052F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x058F, 1}, // Armenian. 0x0530-0x058F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x05FF, 1}, // Hebrew. 0x0590-0x05FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x06FF, 1}, // Arabic. 0x0600-0x06FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x08FF, 0}, // Unassigned. 0x0700-0x08FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x097F, 1}, // Devanagari. 0x0900-0x097F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x09FF, 1}, // Bengali. 0x0980-0x09FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x0A7F, 1}, // Gurmukhi. 0x0A00-0x0A7F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x0AFF, 1}, // Gujarati. 0x0A80-0x0AFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x0B7F, 1}, // Oriya. 0x0B00-0x0B7F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x0BFF, 1}, // Tamil. (See page 7-92). 0x0B80-0x0BFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x0C7F, 1}, // Telugu. 0x0C00-0x0C7F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x0CFF, 1}, // Kannada. (See page 7-100). 0x0C80-0x0CFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x0D7F, 1}, // Malayalam (See page 7-104). 0x0D00-0x0D7F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x0DFF, 0}, // Unassigned. 0x0D80-0x0DFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x0E7F, 1}, // Thai. 0x0E00-0x0E7F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x0EFF, 1}, // Lao. 0x0E80-0x0EFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x0FBF, 1}, // Tibetan. 0x0F00-0x0FBF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x109F, 0}, // Unassigned. 0x0FC0-0x109F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x10FF, 1}, // Georgian. 0x10A0-0x10FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x11FF, 1}, // Hangul Jamo. 0x1100-0x11FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x1DFF, 0}, // Unassigned. 0x1200-0x1DFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x1EFF, 1}, // Latin extended additional. 0x1E00-0x1EFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x1FFF, 1}, // Greek extended. 0x1F00-0x1FFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Symbol area
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x2FFF, 1},
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Merge the blocks and replace them with the above entry as they fall to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * the same category and they are all narrow glyph. This will reduce search
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * time and table size. The merge will omit the reserved code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Remove the above item if below is un-commented.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x206F, 1}, // General punctuation. (See page7-154). 0x200-0x206F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x209F, 1}, // Superscripts and subscripts. 0x2070-0x209F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x20CF, 1}, // Currency symbols. 0x20A0-0x20CF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x20FF, 1}, // Combining diacritical marks for symbols. 0x20D0-0x20FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x214F, 1}, // Letterlike sympbols. 0x2100-0x214F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x218F, 1}, // Number forms. 0x2150-0x218F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x21FF, 1}, // Arrows. 0x2190-0x21FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x22FF, 1}, // Mathematical operators. 0x2200-0x22FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x23FF, 1}, // Miscellaneous technical. 0x2300-0x23FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x243F, 1}, // Control pictures. 0x2400-0x243F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x245F, 1}, // Optical character recognition. 0x2440-0x245F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x24FF, 1}, // Enclosed alphanumerics. 0x2460-0x24FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x257F, 1}, // Box drawing. 0x2500-0x257F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x259F, 1}, // Block elements. 0x2580-0x259F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x25FF, 1}, // Geometric shapes. 0x25A0-0x25FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x26FF, 1}, // Miscellaneous symbols. 0x2600-0x26FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x27BF, 1}, // Dingbats. 0x2700-0x27BF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x2FFF, 0}, // Reserved. 0x27C0-0x2FFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // CJK phonetics and symbol area
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x33FF, 2},
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Merge the blocks and replace them with the above entry as they fall to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * the same category and they are all wide glyph. This will reduce search
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * time and table size. The merge will omit the reserved code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Remove the above item if below is un-commented.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x303F, 2}, // CJK symbols and punctuation. 0x3000-0x303F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x309F, 2}, // Hiragana. 0x3040-0x309F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x30FF, 2}, // Katakana. 0x30A0-0x30FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x312F, 2}, // Bopomofo. 0x3100-0x312F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x318F, 2}, // Hangul compatibility jamo. 0x3130-0x318F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x319F, 2}, // Kanbun. 0x3190-0x319F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x31FF, 0}, // Reserved. As Bopomofo extended in ver3.0. 0x31A0-0x31FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x32FF, 2}, // Enclosed CJK letters and months. 0x3200-0x32FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x33FF, 2}, // CJK compatibility. 0x3300-0x33FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // CJK ideograph area
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x9FFF, 2},
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Merge the blocks and replace them with the above entry as they fall to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * the same category and they are all wide glyph. This will reduce search
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * time and table size. The merge will omit the reserved code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Remove the above item if below is un-commented.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x4DFF, 0}, // Reserved. 0x3400-0x4DBF as CJK unified ideographs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // extension A in ver3.0. 0x3400-0x4DFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0x9FFF, 2}, // CJK unified ideographs. 0x4E00-0x9FFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Reserved
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0xABFF, 0}, // Reserved. 0xA000-0xA490 as Yi syllables. 0xA490-0xA4D0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // as Yi radicals in ver3.0. 0xA000-0xABFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Hangul syllables
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0xD7FF, 2},
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Merge the blocks and replace them with the above entry as they fall to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * the same category and they are all wide glyph. This will reduce search
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * time and table size. The merge will omit the reserved code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Remove the above item if below is un-commented.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0xD7A3, 2}, // Hangul syllables. 0xAC00-0xD7A3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0xD7FF, 0}, // Reserved. 0xD7A3-0xD7FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Surrogates area
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0xDFFF, 0}, // Surrogates, not used now. 0xD800-0xDFFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Private use area
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0xF8FF, 0}, // Private use area. 0xE000-0xF8FF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Compatibility area and specials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0xFAFF, 2}, // CJK compatibility ideographs. 0xF900-0xFAFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0xFB4F, 1}, // Alphabetic presentation forms. 0xFB00-0xFB4F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0xFDFF, 1}, // Arabic presentation forms-A. 0xFB50-0xFDFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0xFE1F, 0}, // Reserved. As variation selectors in ver3.0. 0xFE00-0xFE1F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0xFE2F, 1}, // Combining half marks. 0xFE20-0xFE2F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0xFE4F, 2}, // CJK compatibility forms. 0xFE30-0xFE4F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0xFE6F, 1}, // Small Form Variants. 0xFE50-0xFE6F
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0xFEFF, 1}, // Arabic presentation forms-B. 0xFE70-0xFEFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0xFFEF, 1}, // Half width and full width forms. 0xFF00-0xFFEF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {(CHAR16)0xFFFF, 0}, // Speicials. 0xFFF0-0xFFFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieves the width of a Unicode character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function computes and returns the width of the Unicode character specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync by UnicodeChar.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param UnicodeChar A Unicode character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval 0 The width if UnicodeChar could not be determined.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval 1 UnicodeChar is a narrow glyph.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval 2 UnicodeChar is a wide glyph.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetGlyphWidth (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 UnicodeChar
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Low;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN High;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST UNICODE_WIDTH_ENTRY *Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Low = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync High = (sizeof (mUnicodeWidthTable)) / (sizeof (UNICODE_WIDTH_ENTRY)) - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (Low <= High) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = (Low + High) >> 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = &(mUnicodeWidthTable[Index]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (UnicodeChar <= Item->WChar) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (UnicodeChar > Item->WChar) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Low = Index + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (UnicodeChar <= mUnicodeWidthTable[Index - 1].WChar) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync High = Index - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Index - 1 < UnicodeChar <= Index. Found
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Low <= High) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Item->Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Computes the display length of a Null-terminated Unicode String.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function computes and returns the display length of the Null-terminated Unicode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string specified by String. If String is NULL then 0 is returned. If any of the widths
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the Unicode characters in String can not be determined, then 0 is returned. The display
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync width of String can be computed by summing the display widths of each Unicode character
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync in String. Unicode characters that are narrow glyphs have a width of 1, and Unicode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync characters that are width glyphs have a width of 2.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If String is not aligned on a 16-bit boundary, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param String A pointer to a Null-terminated Unicode string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The display length of the Null-terminated Unicode string specified by String.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUnicodeStringDisplayLength (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *String
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*String != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = GetGlyphWidth (*String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Width == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length += Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Draws a dialog box to the console output device specified by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConOut defined in the EFI_SYSTEM_TABLE and waits for a keystroke
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync from the console input device specified by ConIn defined in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SYSTEM_TABLE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If there are no strings in the variable argument list, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If all the strings in the variable argument list are empty, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Attribute Specifies the foreground and background color of the popup.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Key A pointer to the EFI_KEY value of the key that was
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pressed. This is an optional parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If it is NULL then no wait for a keypress will be performed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ... The variable argument list that contains pointers to Null-
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync terminated Unicode strings to display in the dialog box.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The variable argument list is terminated by a NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCreatePopUp (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Attribute,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_INPUT_KEY *Key, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_LIST Args;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SIMPLE_TEXT_OUTPUT_MODE SavedConsoleMode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Columns;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Rows;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Column;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Row;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NumberOfLines;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN MaxLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Line;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN EventIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Determine the length of the longest line in the popup and the the total
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // number of lines in the popup
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_START (Args, Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MaxLength = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NumberOfLines = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((String = VA_ARG (Args, CHAR16 *)) != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MaxLength = MAX (MaxLength, StrLen (String));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NumberOfLines++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_END (Args);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the total number of lines in the popup is zero, then ASSERT()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (NumberOfLines != 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the maximum length of all the strings is zero, then ASSERT()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (MaxLength != 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Cache a pointer to the Simple Text Output Protocol in the EFI System Table
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConOut = gST->ConOut;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Save the current console cursor position and attributes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&SavedConsoleMode, ConOut->Mode, sizeof (SavedConsoleMode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Retrieve the number of columns and rows in the current console mode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConOut->QueryMode (ConOut, SavedConsoleMode.Mode, &Columns, &Rows);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Disable cursor and set the foreground and background colors specified by Attribute
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConOut->EnableCursor (ConOut, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConOut->SetAttribute (ConOut, Attribute);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Limit NumberOfLines to height of the screen minus 3 rows for the box itself
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NumberOfLines = MIN (NumberOfLines, Rows - 3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Limit MaxLength to width of the screen minus 2 columns for the box itself
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MaxLength = MIN (MaxLength, Columns - 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Compute the starting row and starting column for the popup
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row = (Rows - (NumberOfLines + 3)) / 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column = (Columns - (MaxLength + 2)) / 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate a buffer for a single line of the popup with borders and a Null-terminator
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line = AllocateZeroPool ((MaxLength + 3) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Line != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Draw top of popup box
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem16 (Line, (MaxLength + 2) * 2, BOXDRAW_HORIZONTAL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line[0] = BOXDRAW_DOWN_RIGHT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line[MaxLength + 1] = BOXDRAW_DOWN_LEFT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line[MaxLength + 2] = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConOut->SetCursorPosition (ConOut, Column, Row++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConOut->OutputString (ConOut, Line);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Draw middle of the popup with strings
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_START (Args, Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((String = VA_ARG (Args, CHAR16 *)) != NULL && NumberOfLines > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = StrLen (String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem16 (Line, (MaxLength + 2) * 2, L' ');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Length <= MaxLength) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Length <= MaxLength
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Line + 1 + (MaxLength - Length) / 2, String , Length * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Length > MaxLength
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Line + 1, String + (Length - MaxLength) / 2 , MaxLength * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line[0] = BOXDRAW_VERTICAL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line[MaxLength + 1] = BOXDRAW_VERTICAL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line[MaxLength + 2] = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConOut->SetCursorPosition (ConOut, Column, Row++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConOut->OutputString (ConOut, Line);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NumberOfLines--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_END (Args);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Draw bottom of popup box
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem16 (Line, (MaxLength + 2) * 2, BOXDRAW_HORIZONTAL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line[0] = BOXDRAW_UP_RIGHT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line[MaxLength + 1] = BOXDRAW_UP_LEFT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line[MaxLength + 2] = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConOut->SetCursorPosition (ConOut, Column, Row++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConOut->OutputString (ConOut, Line);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the allocated line buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Line);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Restore the cursor visibility, position, and attributes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConOut->EnableCursor (ConOut, SavedConsoleMode.CursorVisible);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConOut->SetCursorPosition (ConOut, SavedConsoleMode.CursorColumn, SavedConsoleMode.CursorRow);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConOut->SetAttribute (ConOut, SavedConsoleMode.Attribute);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Wait for a keystroke
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConIn->ReadKeyStroke (gST->ConIn, Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}