이제 우리 글꼴을 HII 데이터베이스에 추가할 시점이다.
새로운 애플리케이션을 초기화한다.
그리고 애플리케이션을 이용하기 위해서 INF 파일을 선언한다.
또한 HII 서비스(ex. HiiAddPackages
함수)용 라이브러리를 사용하므로 처음부터 포함시키도록 하자.
알파벳 문자열은 해당 언어의 모든 문자가 올바르게 출력되었는지 확인하는 데 도움이 된다.
Copy EFI_WIDE_GLYPH gSimpleFontWideGlyphData[] = {
{ 0x00, 0x00, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
};
UINT32 gSimpleFontWideBytes = sizeof(gSimpleFontWideGlyphData);
EFI_NARROW_GLYPH gSimpleFontNarrowGlyphData[] = {
{ 0x400, 0x00, { 0x60,0x30,0x00,0xfe,0x66,0x62,0x60,0x68,0x78,0x68,0x60,0x60,0x62,0x66,0xfe,0x00,0x00,0x00,0x00}},
{ 0x401, 0x00, { 0x66,0x66,0x00,0xfe,0x66,0x62,0x60,0x68,0x78,0x68,0x60,0x60,0x62,0x66,0xfe,0x00,0x00,0x00,0x00}},
{ 0x402, 0x00, { 0x00,0x00,0x00,0xfc,0x64,0x60,0x60,0x6c,0x76,0x66,0x66,0x66,0x66,0x66,0xe6,0x0c,0x00,0x00,0x00}},
{ 0x403, 0x00, { 0x0c,0x18,0x00,0xfe,0x66,0x62,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00}},
{ 0x404, 0x00, { 0x00,0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc8,0xf8,0xc8,0xc0,0xc0,0xc2,0x66,0x3c,0x00,0x00,0x00,0x00}},
...
{ 0x45c, 0x00, { 0x00,0x00,0x00,0x0c,0x18,0x30,0x00,0xe6,0x66,0x6c,0x78,0x78,0x6c,0x66,0xe6,0x00,0x00,0x00,0x00}},
{ 0x45d, 0x00, { 0x00,0x00,0x00,0x60,0x30,0x18,0x00,0xc6,0xc6,0xce,0xde,0xf6,0xe6,0xc6,0xc6,0x00,0x00,0x00,0x00}},
{ 0x45e, 0x00, { 0x00,0x00,0x00,0x00,0x6c,0x38,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7e,0x06,0x06,0x0c,0xf8,0x00}},
{ 0x45f, 0x00, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0xfe,0x10,0x10,0x00,0x00}},
};
UINT32 gSimpleFontNarrowBytes = sizeof(gSimpleFontNarrowGlyphData);
이제 기본 코드를 작성할 차례이다.
Copy #include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
#include <Library/HiiLib.h>
#include <Library/MemoryAllocationLib.h>
extern EFI_WIDE_GLYPH gSimpleFontWideGlyphData [] ;
extern UINT32 gSimpleFontWideBytes;
extern EFI_NARROW_GLYPH gSimpleFontNarrowGlyphData [] ;
extern UINT32 gSimpleFontNarrowBytes;
EFI_STATUS
EFIAPI
UefiMain (
IN EFI_HANDLE ImageHandle ,
IN EFI_SYSTEM_TABLE * SystemTable
)
{
UINT8 * FontPackage = CreateSimpleFontPkg(gSimpleFontWideGlyphData ,
gSimpleFontWideBytes ,
gSimpleFontNarrowGlyphData ,
gSimpleFontNarrowBytes) ;
EFI_HII_HANDLE Handle = HiiAddPackages( & gHIIAddRussianFontGuid ,
NULL ,
FontPackage ,
HIIAddRussianFontStrings ,
NULL ) ;
FreePool(FontPackage) ;
if ( Handle == NULL )
{
Print(L "Error! Can't perform HiiAddPackages\n" ) ;
return EFI_INVALID_PARAMETER;
}
Print(L "en-US ID=1: %s \n" , HiiGetString( Handle , 1 , "en-US" )) ;
Print(L "en-US ID=2: %s \n" , HiiGetString( Handle , STRING_TOKEN(STR_HELLO) , "en-US" )) ;
Print(L "en-US ID=3: %s \n" , HiiGetString( Handle , STRING_TOKEN(STR_BYE) , "en-US" )) ;
Print(L "en-US ID=4: %s \n" , HiiGetString( Handle , STRING_TOKEN(STR_ALPHABET_UPPERCASE) , "en-US" )) ;
Print(L "en-US ID=5: %s \n" , HiiGetString( Handle , STRING_TOKEN(STR_ALPHABET_LOWERCASE) , "en-US" )) ;
Print(L "fr-FR ID=1: %s \n" , HiiGetString( Handle , 1 , "fr-FR" )) ;
Print(L "fr-FR ID=2: %s \n" , HiiGetString( Handle , STRING_TOKEN(STR_HELLO) , "fr-FR" )) ;
Print(L "fr-FR ID=3: %s \n" , HiiGetString( Handle , STRING_TOKEN(STR_BYE) , "fr-FR" )) ;
Print(L "fr-FR ID=4: %s \n" , HiiGetString( Handle , STRING_TOKEN(STR_ALPHABET_UPPERCASE) , "fr-FR" )) ;
Print(L "fr-FR ID=5: %s \n" , HiiGetString( Handle , STRING_TOKEN(STR_ALPHABET_LOWERCASE) , "fr-FR" )) ;
Print(L "ru-RU ID=1: %s \n" , HiiGetString( Handle , 1 , "ru-RU" )) ;
Print(L "ru-RU ID=2: %s \n" , HiiGetString( Handle , STRING_TOKEN(STR_HELLO) , "ru-RU" )) ;
Print(L "ru-RU ID=3: %s \n" , HiiGetString( Handle , STRING_TOKEN(STR_BYE) , "ru-RU" )) ;
Print(L "ru-RU ID=4: %s \n" , HiiGetString( Handle , STRING_TOKEN(STR_ALPHABET_UPPERCASE) , "ru-RU" )) ;
Print(L "ru-RU ID=5: %s \n" , HiiGetString( Handle , STRING_TOKEN(STR_ALPHABET_LOWERCASE) , "ru-RU" )) ;
return EFI_SUCCESS;
}
함수에서 글꼴 패키지에 필요한 배열을 할당해야 한다. 패키지 자체를 위한 공간을 할당하는 것 외에도 모든 데이터 앞에 추가할 패키지 크기에 대해 4바이트를 추가해야 한다. 알다시피 이것은 HiiAddPackages
함수에 필요한 데이터 형식이다.
이제 패키지 데이터를 채우자. 먼저 헤더를 채운다.
애플리케이션을 빌드하고 실행하면, 러시아어 문자열이 올바르게 출력되는 것을 볼 수 있다.
애플리케이션의 시작 부분과 끝 부분에 러시아어로 일부 문자열을 출력해보겠다.