我们可以通过EFI_HII_FONT_PROTOCOL【参考1】 中的 GetGlyph来取得一些字符的字形定义。
GetGlyph 的原型可以在 \MdePkg\Include\Protocol\HiiFont.h 中找到:
/**
Convert the glyph for a single character into a bitmap.
@param This A pointer to the EFI_HII_FONT_PROTOCOL instance.
@param Char The character to retrieve.
@param StringInfo Points to the string font and color
information or NULL if the string should use
the default system font and color.
@param Blt This must point to a NULL on entry. A buffer will
be allocated to hold the output and the pointer
updated on exit. It is the caller's responsibility
to free this buffer.
@param Baseline The number of pixels from the bottom of the bitmap
to the baseline.
@retval EFI_SUCCESS The glyph bitmap created.
@retval EFI_OUT_OF_RESOURCES Unable to allocate the output buffer Blt.
@retval EFI_WARN_UNKNOWN_GLYPH The glyph was unknown and was
replaced with the glyph for
Unicode character code 0xFFFD.
@retval EFI_INVALID_PARAMETER Blt is NULL, or Width is NULL, or
Height is NULL
**/
typedef
EFI_STATUS
(EFIAPI *EFI_HII_GET_GLYPH)(
IN CONST EFI_HII_FONT_PROTOCOL *This,
IN CONST CHAR16 Char,
IN CONST EFI_FONT_DISPLAY_INFO *StringInfo,
OUT EFI_IMAGE_OUTPUT **Blt,
OUT UINTN *Baseline OPTIONAL
);
其中 Char 是你要取对应字形的文字(特别注意是单个的CHAR16),StringInfo 为 NULL时取得的是系统默认的字体,输出结果在 Blt 中。最后一项含义我不清楚……
再看一下输出结果是 EFI_IMAGE_OUTPUT。它的定义在 \MdePkg\Include\Protocol\HiiImage.h中。其中含有一个Union的定义,在我们这里使用时,会按照 EFI_GRAPHICS_OUTPUT_BLT_PIXEL 给出。
最后写一个简单的测试程序如下,功能是取得“z”字符的字形。
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/ShellCEntryLib.h>
#include <Protocol/HiiFont.h>
extern EFI_BOOT_SERVICES *gBS;
int
EFIAPI
main (
IN int Argc,
IN CHAR16 **Argv
)
{
EFI_STATUS Status = 0;
UINTN BaseLine;
UINTN i,j;
EFI_HII_FONT_PROTOCOL *HiiFont = 0;
EFI_IMAGE_OUTPUT *Blt=NULL;
CHAR8 *c,*p;
Status = gBS->LocateProtocol (&gEfiHiiFontProtocolGuid, NULL, (VOID **) &HiiFont);
if (Status!=EFI_SUCCESS) {
Print(L"Error when LocateProtocol gEfiHiiFontProtocolGuid. Code[%r]\n",Status);
return EFI_SUCCESS;
}
Status = HiiFont->GetGlyph (
HiiFont, //Protocol instance
L'Z', //Show char 'Z'
NULL, //Use the defualt system font and color
&Blt, //GLYPH information
&BaseLine); //I don't know
Print(L"This is [%d]x[%d]\n",Blt->Width,Blt->Height);
c=(CHAR8*) Blt->Image.Bitmap;
for (j=0;j<Blt->Height;j++)
{
p=c;
for (i=0;i<Blt->Width;i++)
{
Print(L"%2X",(*c)&0xFF);
c=c+4;
}
Print(L" ");
c=p+1;
for (i=0;i<Blt->Width;i++)
{
Print(L"%2X",(*c)&0xFF);
c=c+4;
}
Print(L" ");
c=p+2;
for (i=0;i<Blt->Width;i++)
{
Print(L"%2X",(*c)&0xFF);
c=c+4;
}
c=p+(Blt->Width*4);
Print(L"\n");
}
c=(CHAR8*) Blt->Image.Bitmap;
for (j=0;j<Blt->Height;j++)
{
for (i=0;i<Blt->Width;i++)
{
if (*c!=0) {
Print(L"*");
}
else
{
Print(L" ");
}
c=c+4;
}
Print(L"\n");
}
return EFI_SUCCESS;
}
运行结果,首先输出的是 R G B 数组,隐隐约约能看到其中有一个形状
程序后面有一个判断,直接输出星号和空格,结果如下,这样就看到非常清楚了。
完整的代码下载
GetGlyph
唯一的问题是:我还不知道取得这个东西能有什么用途…….
参考:
1.UEFI spec 2.4 P1711



程序最后一个判断只显示了R 数组(封面不错,举火烧天)