4 Copyright (c) 2004 - 2008, Intel Corporation. <BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "FrontPage.h"
19 // Lookup table of ISO639-2 3 character language codes to ISO 639-1 2 character language codes
20 // Each entry is 5 CHAR8 values long. The first 3 CHAR8 values are the ISO 639-2 code.
21 // The last 2 CHAR8 values are the ISO 639-1 code.
23 GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 Iso639ToRfc3066ConversionTable
[] =
162 #define NARROW_GLYPH_NUMBER 8
163 #define WIDE_GLYPH_NUMBER 75
165 EFI_GUID mFontPackageGuid
= {
166 0x78941450, 0x90ab, 0x4fb1, {0xb7, 0x5f, 0x58, 0x92, 0x14, 0xe2, 0x4a, 0xc}
171 /// This 4-bytes total array length is required by HiiAddPackages()
176 // This is the Font package definition
178 EFI_HII_PACKAGE_HEADER Header
;
179 UINT16 NumberOfNarrowGlyphs
;
180 UINT16 NumberOfWideGlyphs
;
181 EFI_NARROW_GLYPH NarrowArray
[NARROW_GLYPH_NUMBER
];
182 EFI_WIDE_GLYPH WideArray
[WIDE_GLYPH_NUMBER
];
185 FONT_PACK_BIN mFontBin
= {
186 sizeof (FONT_PACK_BIN
),
188 sizeof (FONT_PACK_BIN
) - sizeof (UINT32
),
189 EFI_HII_PACKAGE_SIMPLE_FONTS
,
398 Routine to export glyphs to the HII database. This is in addition to whatever is defined in the Graphics Console driver.
406 EFI_HII_HANDLE HiiHandle
;
408 HiiHandle
= HiiAddPackages (
414 ASSERT (HiiHandle
!= NULL
);
418 Convert language code from RFC3066 to ISO639-2.
420 @param LanguageRfc3066 RFC3066 language code.
421 @param LanguageIso639 ISO639-2 language code.
423 @retval EFI_SUCCESS Language code converted.
424 @retval EFI_NOT_FOUND Language code not found.
429 ConvertRfc3066LanguageToIso639Language (
430 IN CHAR8
*LanguageRfc3066
,
431 OUT CHAR8
*LanguageIso639
436 if ((LanguageRfc3066
[2] != '-') && (LanguageRfc3066
[2] != 0)) {
437 CopyMem (LanguageIso639
, LanguageRfc3066
, 3);
441 for (Index
= 0; Iso639ToRfc3066ConversionTable
[Index
] != 0; Index
+= 5) {
442 if (CompareMem (LanguageRfc3066
, &Iso639ToRfc3066ConversionTable
[Index
+ 3], 2) == 0) {
443 CopyMem (LanguageIso639
, &Iso639ToRfc3066ConversionTable
[Index
], 3);
448 return EFI_NOT_FOUND
;
452 Get next language from language code list (with separator ';').
454 If LangCode is NULL, then ASSERT.
455 If Lang is NULL, then ASSERT.
457 @param LangCode On input: point to first language in the list. On
458 output: point to next language in the list, or
459 NULL if no more language in the list.
460 @param Lang The first language in the list.
466 IN OUT CHAR8
**LangCode
,
473 ASSERT (LangCode
!= NULL
);
474 ASSERT (*LangCode
!= NULL
);
475 ASSERT (Lang
!= NULL
);
478 StringPtr
= *LangCode
;
479 while (StringPtr
[Index
] != 0 && StringPtr
[Index
] != ';') {
483 CopyMem (Lang
, StringPtr
, Index
);
486 if (StringPtr
[Index
] == ';') {
489 *LangCode
= StringPtr
+ Index
;
493 Determine the current language that will be used
494 based on language related EFI Variables.
496 @param LangCodesSettingRequired - If required to set LangCode variable
501 BOOLEAN LangCodesSettingRequired
507 CHAR8 LangCode
[ISO_639_2_ENTRY_SIZE
];
510 CHAR8
*PlatformLangCodes
;
516 LangCodes
= (CHAR8
*)PcdGetPtr (PcdUefiVariableDefaultLangCodes
);
517 if (LangCodesSettingRequired
) {
518 if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate
)) {
520 // UEFI 2.1 depricated this variable so we support turning it off
522 Status
= gRT
->SetVariable (
524 &gEfiGlobalVariableGuid
,
525 EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
,
526 AsciiStrLen (LangCodes
),
532 PlatformLangCodes
= (CHAR8
*)PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes
);
533 Status
= gRT
->SetVariable (
534 L
"PlatformLangCodes",
535 &gEfiGlobalVariableGuid
,
536 EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
,
537 AsciiStrSize (PlatformLangCodes
),
542 if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate
)) {
544 // UEFI 2.1 depricated this variable so we support turning it off
548 // Find current LangCode from Lang NV Variable
550 Size
= ISO_639_2_ENTRY_SIZE
;
551 Status
= gRT
->GetVariable (
553 &gEfiGlobalVariableGuid
,
558 if (!EFI_ERROR (Status
)) {
559 Status
= EFI_NOT_FOUND
;
560 for (Index
= 0; LangCodes
[Index
] != 0; Index
+= ISO_639_2_ENTRY_SIZE
) {
561 if (CompareMem (&LangCodes
[Index
], LangCode
, ISO_639_2_ENTRY_SIZE
) == 0) {
562 Status
= EFI_SUCCESS
;
569 // If we cannot get language code from Lang variable,
570 // or LangCode cannot be found from language table,
571 // set the mDefaultLangCode to Lang variable.
573 if (EFI_ERROR (Status
)) {
574 Lang
= (CHAR8
*)PcdGetPtr (PcdUefiVariableDefaultLang
);
575 Status
= gRT
->SetVariable (
577 &gEfiGlobalVariableGuid
,
578 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
,
579 ISO_639_2_ENTRY_SIZE
,
586 PlatformLang
= BdsLibGetVariableAndSize (L
"PlatformLang", &gEfiGlobalVariableGuid
, &Size
);
587 if (PlatformLang
!= NULL
) {
589 // Check Current PlatformLang value against PlatformLangCode. Need a library that is TBD
590 // Set Invalid based on state of PlatformLang.
593 FreePool (PlatformLang
);
595 // No valid variable is set
600 PlatformLang
= (CHAR8
*)PcdGetPtr (PcdUefiVariableDefaultPlatformLang
);
601 Status
= gRT
->SetVariable (
603 &gEfiGlobalVariableGuid
,
604 EFI_VARIABLE_NON_VOLATILE
| EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_RUNTIME_ACCESS
,
605 AsciiStrSize (PlatformLang
),