EFI_STATUS\r
GetPackageCount (\r
IN CONST EFI_HII_PACKAGES *Packages,\r
- UINTN *IfrPackageCount,\r
- UINTN *StringPackageCount\r
+ OUT UINTN *IfrPackageCount,\r
+ OUT UINTN *StringPackageCount,\r
+ OUT UINTN *FontPackageCount\r
)\r
{\r
UINTN Index;\r
ASSERT (Packages != NULL);\r
ASSERT (IfrPackageCount != NULL);\r
ASSERT (StringPackageCount != NULL);\r
+ ASSERT (FontPackageCount != NULL);\r
\r
*IfrPackageCount = 0;\r
*StringPackageCount = 0;\r
+ *FontPackageCount = 0;\r
\r
TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) (((UINT8 *) &Packages->GuidId) + sizeof (Packages->GuidId));\r
\r
// may not be the exact number of valid package number in the binary generated \r
// by HII Build tool.\r
//\r
- switch (TianoAutogenPackageHdrArray[Index]->PackageHeader.Type) {\r
- case EFI_HII_PACKAGE_FORMS:\r
+ switch (TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader.Type) {\r
+ case EFI_HII_IFR:\r
*IfrPackageCount += 1;\r
break;\r
- case EFI_HII_PACKAGE_STRINGS:\r
+ case EFI_HII_STRING:\r
*StringPackageCount += 1;\r
break;\r
\r
- case EFI_HII_PACKAGE_SIMPLE_FONTS:\r
+ case EFI_HII_FONT:\r
+ *FontPackageCount += 1;\r
break;\r
\r
//\r
// The following fonts are invalid for a module that using Framework to UEFI thunk layer.\r
//\r
- case EFI_HII_PACKAGE_KEYBOARD_LAYOUT:\r
- case EFI_HII_PACKAGE_FONTS:\r
- case EFI_HII_PACKAGE_IMAGES:\r
default:\r
ASSERT (FALSE);\r
return EFI_INVALID_PARAMETER;\r
\r
}\r
\r
+/**\r
+ Caculate the size of UEFI Simple Font Package that is needed to \r
+ convert all the font a Framework Font Paackage.\r
+\r
+ ONLY Narrow Font is supported. Wide Font is discarded. \r
+\r
+ If the Package Header is not of EFI_HII_FONT type, then ASSERT.\r
+\r
+ @param The Package header of the Framework Font Package.\r
+ \r
+ @return The size of the UEFI Simple Font Package.\r
+ \r
+**/\r
+UINTN\r
+GetUefiSimpleFontPackSize (\r
+ IN CONST EFI_HII_PACK_HEADER * PackHeader\r
+ )\r
+{\r
+ UINTN Size;\r
+ EFI_HII_FONT_PACK *FwFontPack;\r
+\r
+ FwFontPack = (EFI_HII_FONT_PACK *) PackHeader;\r
+\r
+ ASSERT (FwFontPack->Header.Type == EFI_HII_FONT);\r
+ \r
+ Size = sizeof (EFI_HII_SIMPLE_FONT_PACKAGE_HDR) \r
+ + (FwFontPack->NumberOfNarrowGlyphs * sizeof (EFI_NARROW_GLYPH));\r
+\r
+ return Size;\r
+}\r
+\r
+\r
+/**\r
+ Convert Font Package in Framework format to a newly allocated UEFI\r
+ Simple Font Package.\r
+\r
+ ONLY Narrow Font is supported. Wide Font is discarded. \r
+\r
+ If memory allocation fails, then ASSERT.\r
+\r
+ @param FwFontPack Framework Font Package.\r
+\r
+ @reture UEFI Simple Font Package.\r
+**/\r
+EFI_HII_SIMPLE_FONT_PACKAGE_HDR *\r
+FrameworkFontPackToUefiSimpliedFont (\r
+ IN CONST EFI_HII_PACK_HEADER * PackHeader\r
+ )\r
+{\r
+ EFI_HII_SIMPLE_FONT_PACKAGE_HDR *FontPack;\r
+ UINTN Size;\r
+ EFI_NARROW_GLYPH *FwNarrowGlyph;\r
+ EFI_NARROW_GLYPH *NarrowGlyph;\r
+ UINTN Idx;\r
+ EFI_HII_FONT_PACK *FwFontPack;\r
+\r
+ Size = GetUefiSimpleFontPackSize (PackHeader);\r
+\r
+ FwFontPack = (EFI_HII_FONT_PACK *) PackHeader;\r
+\r
+ FontPack = AllocateZeroPool (Size);\r
+ ASSERT (FontPack != NULL);\r
+\r
+ //\r
+ // Prepare the Header information.\r
+ //\r
+ FontPack->Header.Length = (UINT32) Size;\r
+ FontPack->Header.Type = EFI_HII_PACKAGE_SIMPLE_FONTS;\r
+\r
+ FontPack->NumberOfNarrowGlyphs = FwFontPack->NumberOfNarrowGlyphs;\r
+ \r
+ //\r
+ // ONLY Narrow Font is supported. Wide Font is discarded. \r
+ //\r
+ FontPack->NumberOfWideGlyphs = 0;\r
+ \r
+ //\r
+ // Copy Narrow Glyph\r
+ //\r
+ NarrowGlyph = (EFI_NARROW_GLYPH *) (FontPack + 1);\r
+ FwNarrowGlyph = (EFI_NARROW_GLYPH *) (FwFontPack + 1);\r
+ CopyMem (NarrowGlyph, FwNarrowGlyph, sizeof (EFI_NARROW_GLYPH) * FwFontPack->NumberOfNarrowGlyphs);\r
+ for (Idx = 0; Idx < FwFontPack->NumberOfNarrowGlyphs; Idx++) {\r
+ //\r
+ // Clear the GLYPH_NON_BREAKING (EFI_GLYPH_WIDE is used here as they are all 0x02)\r
+ // attribute which is not defined in UEFI EFI_NARROW_GLYPH\r
+ //\r
+ NarrowGlyph[Idx].Attributes = (UINT8) (NarrowGlyph[Idx].Attributes & ~(EFI_GLYPH_WIDE));\r
+ }\r
+\r
+ return FontPack;\r
+}\r
\r
/**\r
Prepare a UEFI Package List from a Framework HII package list registered\r
UINT32 PackageLength;\r
EFI_HII_PACKAGE_HEADER PackageHeader;\r
UINTN Index;\r
- TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
+ TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
+ EFI_HII_SIMPLE_FONT_PACKAGE_HDR *FontPack;\r
+ \r
\r
ASSERT (Packages != NULL);\r
ASSERT (PackageListGuid != NULL);\r
PackageListLength = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
\r
for (Index = 0; Index < NumberOfPackages; Index++) {\r
- CopyMem (&PackageLength, &TianoAutogenPackageHdrArray[Index]->BinaryLength, sizeof (UINT32));\r
- //\r
- //TIANO_AUTOGEN_PACKAGES_HEADER.BinaryLength include the BinaryLength itself.\r
- //\r
- PackageListLength += (PackageLength - sizeof(UINT32)); \r
+ if (TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader.Type == EFI_HII_FONT) {\r
+ //\r
+ // There is no tool to generate Font package in Framework HII's implementation.\r
+ // Therefore, Font Package be a C structure defined in Framework HII code. \r
+ // Therefore, Font Package will be in Framework HII format defined by EFI_HII_FONT_PACK.\r
+ // We need to create a UEFI Simple Font Package and copy over all data. Hence, EFI_HII_FONT\r
+ // is handled differently than EFI_HII_IFR and EFI_HII_STRING.\r
+ //\r
+ PackageListLength = (UINT32) (PackageListLength + GetUefiSimpleFontPackSize (&TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader));\r
+ \r
+ } else {\r
+ //\r
+ // For EFI_HII_IFR and EFI_HII_STRING, EDK II's VFR Compiler and Build.exe will generate a binary in a format\r
+ // defined by TIANO_AUTOGEN_PACKAGES_HEADER. A Framework HII's EFI_HII_PACK_HEADER is inserted before\r
+ // the UEFI package data.\r
+ //\r
+ CopyMem (&PackageLength, &TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader.Length, sizeof (UINT32));\r
+ //\r
+ // EFI_HII_PACK_HEADER.FrameworkPackageHeader.Length include the sizeof FrameworkPackageHeader itself.\r
+ //\r
+ PackageListLength += (PackageLength - sizeof(EFI_HII_PACK_HEADER));\r
+ \r
+ }\r
}\r
\r
//\r
\r
PackageListData = ((UINT8 *) PackageListHeader) + sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
\r
+ //\r
+ // Build the UEFI Package List.\r
+ //\r
for (Index = 0; Index < NumberOfPackages; Index++) {\r
- CopyMem (&PackageLength, &(TianoAutogenPackageHdrArray[Index]->BinaryLength), sizeof (UINT32));\r
- PackageLength -= sizeof (UINT32);\r
- CopyMem (PackageListData, &(TianoAutogenPackageHdrArray[Index]->PackageHeader), PackageLength);\r
+ if (TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader.Type == EFI_HII_FONT) {\r
+ PackageLength = (UINT32) GetUefiSimpleFontPackSize (&TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader);\r
+ FontPack = FrameworkFontPackToUefiSimpliedFont (&TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader);\r
+ CopyMem (PackageListData, FontPack, PackageLength);\r
+ FreePool (FontPack);\r
+ \r
+ } else {\r
+ CopyMem (&PackageLength, &(TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader.Length), sizeof (UINT32));\r
+ PackageLength -= sizeof (EFI_HII_PACK_HEADER);\r
+ CopyMem (PackageListData, &(TianoAutogenPackageHdrArray[Index]->PackageHeader), PackageLength);\r
+ \r
+ }\r
PackageListData += PackageLength;\r
}\r
\r
EFI_STATUS Status;\r
UINTN StringPackageCount;\r
UINTN IfrPackageCount;\r
+ UINTN FontPackageCount;\r
EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
HII_THUNK_CONTEXT *ThunkContext;\r
HII_THUNK_CONTEXT *ThunkContextToRemove;\r
\r
PackageListHeader = NULL;\r
\r
- Status = GetPackageCount (Packages, &IfrPackageCount, &StringPackageCount);\r
+ Status = GetPackageCount (Packages, &IfrPackageCount, &StringPackageCount, &FontPackageCount);\r
ASSERT_EFI_ERROR (Status);\r
\r
if (IfrPackageCount > 1) {\r
// If Packages->GuidId is NULL, the caller of FramworkHii->NewPack is registering\r
// packages with at least 1 StringPack and 1 IfrPack. Therefore, Packages->GuidId is\r
// not used as the name of the package list. Formset GUID is used as the Package List\r
- // GUID.\r
+ // GUID instead.\r
//\r
- ASSERT (StringPackageCount >=1 && IfrPackageCount == 1);\r
- IfrPackage = GetIfrPackage (Packages);\r
- GetFormSetGuid (IfrPackage, &ThunkContext->TagGuid);\r
+ ASSERT ((StringPackageCount >=1 && IfrPackageCount == 1) || (FontPackageCount > 0));\r
+ if (IfrPackageCount > 0) {\r
+ IfrPackage = GetIfrPackage (Packages);\r
+ GetFormSetGuid (IfrPackage, &ThunkContext->TagGuid);\r
+ } else {\r
+ ASSERT (FontPackageCount > 0);\r
+ GenerateRandomGuid (&ThunkContext->TagGuid);\r
+ }\r
+ \r
} else {\r
ThunkContextToRemove = TagGuidToIfrPackThunkContext (Private, Packages->GuidId);\r
\r
if (IfrPackageCount > 0 && \r
StringPackageCount > 0 && \r
- (ThunkContextToRemove!= NULL)) {\r
+ (ThunkContextToRemove != NULL)) {\r
DEBUG((EFI_D_WARN, "Framework code registers HII package list with the same GUID more than once.\n"));\r
- DEBUG((EFI_D_WARN, "This package list should be already registered. Just return successfully.\n"));\r
+ DEBUG((EFI_D_WARN, "Remove the previously registered package list and register the new one.\n"));\r
HiiRemovePack (This, ThunkContextToRemove->FwHiiHandle);\r
}\r
CopyGuid (&ThunkContext->TagGuid, Packages->GuidId);\r
+ \r
}\r
\r
//\r
if (IfrPackageCount != 0) {\r
InstallDefaultConfigAccessProtocol (Packages, ThunkContext);\r
}\r
+ \r
PackageListHeader = PrepareUefiPackageListFromFrameworkHiiPackages (Packages, &ThunkContext->TagGuid);\r
Status = mHiiDatabase->NewPackageList (\r
mHiiDatabase,\r