]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1) StrGather (Build.exe) in compatible mode add a Framework Package Header to replace...
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 21 Nov 2008 15:07:50 +0000 (15:07 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 21 Nov 2008 15:07:50 +0000 (15:07 +0000)
2) VfrCompiler in compatible mode add a Framework Package Header to replace the original “ArrayLength” generated in the output.
3) HII Thunk module nows support Narrow Font registered using Framework New Pack HII interface.
4) Fix a bug in IfrLibCreatePopUp2 by updating the prototype. The previous way of using VA_START to get the address of parameter in the argument list and expecting the parameters that follows will be found using VA_ARG macro is wrong.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@6672 6f19259b-4bc3-4df7-8a09-765794883524

EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.h
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/SetupBrowser.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c

index 0ea1b5a3593a2e702c463c06bb858de0ed8fbc73..6c3741511c487204c3742c0b8fe8493be11b9d2f 100644 (file)
@@ -66,7 +66,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #pragma pack (push, 1)\r
 typedef struct {\r
-  UINT32                  BinaryLength;\r
+  EFI_HII_PACK_HEADER     FrameworkPackageHeader;\r
   EFI_HII_PACKAGE_HEADER  PackageHeader;\r
 } TIANO_AUTOGEN_PACKAGES_HEADER;\r
 #pragma pack (pop)\r
index c88ad767b983d62f29ee77ae3fa9ca8c88809e47..0aa4773abe2b85af727b911eeb5d4873a80613f4 100644 (file)
@@ -39,8 +39,9 @@ UINT64  mGuidCount = 0;
 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
@@ -49,9 +50,11 @@ GetPackageCount (
   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
@@ -63,23 +66,21 @@ GetPackageCount (
     // 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
@@ -144,6 +145,98 @@ UpdatePackListWithOnlyIfrPack (
   \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
@@ -170,7 +263,9 @@ PrepareUefiPackageListFromFrameworkHiiPackages (
   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
@@ -181,11 +276,29 @@ PrepareUefiPackageListFromFrameworkHiiPackages (
   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
@@ -200,10 +313,22 @@ PrepareUefiPackageListFromFrameworkHiiPackages (
 \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
@@ -331,6 +456,7 @@ UefiRegisterPackageList (
   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
@@ -339,7 +465,7 @@ UefiRegisterPackageList (
 \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
@@ -363,22 +489,29 @@ UefiRegisterPackageList (
     // 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
@@ -390,6 +523,7 @@ UefiRegisterPackageList (
   if (IfrPackageCount != 0) {\r
     InstallDefaultConfigAccessProtocol (Packages, ThunkContext);\r
   }\r
+  \r
   PackageListHeader = PrepareUefiPackageListFromFrameworkHiiPackages (Packages, &ThunkContext->TagGuid);\r
   Status = mHiiDatabase->NewPackageList (\r
               mHiiDatabase,\r
index ebfbdeceb1940b091a870d15321ff462b61213a0..ca7bbe810ad21f4c9f8de00e652ece0f86eb865e 100644 (file)
@@ -134,9 +134,9 @@ ThunkCreatePopUp (
     return EFI_UNSUPPORTED;\r
   }\r
 \r
-  VA_START (Marker, KeyValue);\r
+  VA_START (Marker, String);\r
   \r
-  Status = IfrLibCreatePopUp2 (NumberOfLines, KeyValue, Marker);\r
+  Status = IfrLibCreatePopUp2 (NumberOfLines, KeyValue, String, Marker);\r
 \r
   VA_END (Marker);\r
   \r
index 48a133da63c6e083438418fa952af198083398fe..ca870990e18a286eac72010e1db2989367bdf218 100644 (file)
@@ -267,20 +267,14 @@ GetIfrPackage (
     // 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
         return &TianoAutogenPackageHdrArray[Index]->PackageHeader;\r
         break;\r
-      case EFI_HII_PACKAGE_STRINGS:\r
-      case EFI_HII_PACKAGE_SIMPLE_FONTS:\r
+      case EFI_HII_STRING:\r
+      case EFI_HII_FONT:\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 NULL;\r