]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c
UEFI HII: Merge UEFI HII support changes from branch.
[mirror_edk2.git] / MdeModulePkg / Universal / Console / GraphicsConsoleDxe / GraphicsConsole.c
index 37e816af019f1f721f9244743ba726c248fdf8c9..77a209e1e44c9d6c75b87a6a85a117a965a62ba2 100644 (file)
@@ -83,10 +83,19 @@ GRAPHICS_CONSOLE_DEV        mGraphicsConsoleDevTemplate = {
     {  0,  0, 0, 0, 0, 0 }   // Mode 3\r
   },\r
   (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL,\r
-  (EFI_HII_HANDLE) 0\r
+  (EFI_HII_HANDLE ) 0\r
 };\r
 \r
+#if (EFI_SPECIFICATION_VERSION >= 0x0002000A)\r
+EFI_HII_DATABASE_PROTOCOL   *mHiiDatabase;\r
+EFI_HII_FONT_PROTOCOL       *mHiiFont;\r
+BOOLEAN                     mFirstAccessFlag = TRUE;\r
+\r
+STATIC EFI_GUID             mFontPackageListGuid = {0xf5f219d3, 0x7006, 0x4648, 0xac, 0x8d, 0xd6, 0x1d, 0xfb, 0x7b, 0xc6, 0xad};\r
+\r
+#else\r
 EFI_HII_PROTOCOL            *mHii;\r
+#endif\r
 \r
 static CHAR16               mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };\r
 \r
@@ -194,6 +203,7 @@ GraphicsConsoleControllerDriverSupported (
   } else {\r
     goto Error;\r
   }\r
+\r
   //\r
   // Does Hii Exist?  If not, we aren't ready to run\r
   //\r
@@ -249,8 +259,6 @@ GraphicsConsoleControllerDriverStart (
 {\r
   EFI_STATUS                           Status;\r
   GRAPHICS_CONSOLE_DEV                 *Private;\r
-  EFI_HII_PACKAGES      *Package;\r
-  EFI_HII_FONT_PACK     *FontPack;\r
   UINTN                                NarrowFontSize;\r
   UINT32                               HorizontalResolution;\r
   UINT32                               VerticalResolution;\r
@@ -259,9 +267,8 @@ GraphicsConsoleControllerDriverStart (
   UINTN                                MaxMode;\r
   UINTN                                Columns;\r
   UINTN                                Rows;\r
-  UINT8                                *Location;\r
   UINT32                               ModeNumber;\r
-  \r
+\r
   ModeNumber = 0;\r
 \r
   //\r
@@ -301,17 +308,14 @@ GraphicsConsoleControllerDriverStart (
     }\r
   }\r
 \r
-  //\r
-  // Get the HII protocol. If Supported() succeeds, do we really\r
-  // need to get HII protocol again?\r
-  //\r
-  Status = EfiLocateHiiProtocol ();\r
-  if (EFI_ERROR (Status)) {\r
-    goto Error;\r
-  }\r
-\r
   NarrowFontSize  = ReturnNarrowFontSize ();\r
 \r
+#if 1\r
+  if (mFirstAccessFlag) {\r
+    HiiLibAddFontPackageToHiiDatabase (NarrowFontSize, (UINT8 *) UsStdNarrowGlyphData, &mFontPackageListGuid, &(Private->HiiHandle));\r
+    mFirstAccessFlag = FALSE;\r
+  }\r
+#else\r
   FontPack        = AllocateZeroPool (sizeof (EFI_HII_FONT_PACK) + NarrowFontSize);\r
   ASSERT (FontPack);\r
 \r
@@ -333,7 +337,7 @@ GraphicsConsoleControllerDriverStart (
   // Free the font database\r
   //\r
   FreePool (FontPack);\r
-\r
+#endif\r
   //\r
   // If the current mode information can not be retrieved, then attemp to set the default mode\r
   // of 800x600, 32 bit colot, 60 Hz refresh.\r
@@ -614,7 +618,14 @@ GraphicsConsoleControllerDriverStop (
     //\r
     // Remove the font pack\r
     //\r
+#if 1\r
+    Status = HiiLibRemovePackagesFromHiiDatabase (Private->HiiHandle);\r
+    if (!EFI_ERROR (Status)) {\r
+      mFirstAccessFlag = TRUE;\r
+    }\r
+#else    \r
     mHii->RemovePack (mHii, Private->HiiHandle);\r
+#endif\r
 \r
     //\r
     // Free our instance data\r
@@ -678,7 +689,7 @@ EfiLocateHiiProtocol (
 /*++\r
 \r
   Routine Description:\r
-    Find if the HII protocol is available. If yes, locate the HII protocol\r
+    Locate HII protocols for future usage.\r
 \r
   Arguments:\r
 \r
@@ -690,6 +701,43 @@ EfiLocateHiiProtocol (
   UINTN       Size;\r
   EFI_STATUS  Status;\r
 \r
+#if (EFI_SPECIFICATION_VERSION >= 0x0002000A)\r
+\r
+  //\r
+  // There should only be one - so buffer size is this\r
+  //\r
+  Size = sizeof (EFI_HANDLE);\r
+\r
+  Status = gBS->LocateHandle (\r
+                  ByProtocol,\r
+                  &gEfiHiiDatabaseProtocolGuid,\r
+                  NULL,\r
+                  &Size,\r
+                  (VOID **) &Handle\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  Status = gBS->HandleProtocol (\r
+                  Handle,\r
+                  &gEfiHiiDatabaseProtocolGuid,\r
+                  (VOID **) &mHiiDatabase\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  Status = gBS->HandleProtocol (\r
+                  Handle,\r
+                  &gEfiHiiFontProtocolGuid,\r
+                  (VOID **) &mHiiFont\r
+                  );\r
+  return Status;\r
+#else\r
+\r
   //\r
   // There should only be one - so buffer size is this\r
   //\r
@@ -710,11 +758,13 @@ EfiLocateHiiProtocol (
   Status = gBS->HandleProtocol (\r
                   Handle,\r
                   &gEfiHiiProtocolGuid,\r
-                  (VOID **)&mHii\r
+                  &mHii\r
                   );\r
 \r
   return Status;\r
+#endif\r
 }\r
+\r
 //\r
 // Body of the STO functions\r
 //\r
@@ -1090,15 +1140,31 @@ GraphicsConsoleConOutTestString (
 --*/\r
 {\r
   EFI_STATUS            Status;\r
-  UINT16                GlyphWidth;\r
-  UINT32                GlyphStatus;\r
   UINT16                Count;\r
-  GLYPH_UNION           *Glyph;\r
-\r
-  GlyphStatus = 0;\r
-  Count       = 0;\r
 \r
-  while (WString[Count]) {\r
+#if (EFI_SPECIFICATION_VERSION >= 0x0002000A)\r
+  EFI_IMAGE_OUTPUT      *Blt = NULL;\r
+#else\r
+  UINT16                GlyphWidth;\r
+  UINT32                GlyphStatus = 0;\r
+  GLYPH_UNION           *Glyph;  \r
+#endif\r
+\r
+  Count = 0;\r
+\r
+  while (WString[Count] != 0) {\r
+#if (EFI_SPECIFICATION_VERSION >= 0x0002000A)\r
+    Status = mHiiFont->GetGlyph (\r
+                         mHiiFont,\r
+                         WString[Count],\r
+                         NULL,\r
+                         &Blt,\r
+                         NULL\r
+                         );\r
+    SafeFreePool (Blt);\r
+    Blt = NULL;\r
+    Count++;\r
+#else\r
     Status = mHii->GetGlyph (\r
                     mHii,\r
                     WString,\r
@@ -1107,7 +1173,7 @@ GraphicsConsoleConOutTestString (
                     &GlyphWidth,\r
                     &GlyphStatus\r
                     );\r
-\r
+#endif\r
     if (EFI_ERROR (Status)) {\r
       return EFI_UNSUPPORTED;\r
     }\r
@@ -1654,6 +1720,69 @@ GetTextColors (
   return EFI_SUCCESS;\r
 }\r
 \r
+#if (EFI_SPECIFICATION_VERSION >= 0x0002000A)\r
+EFI_STATUS\r
+DrawUnicodeWeightAtCursorN (\r
+  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
+  IN  CHAR16                        *UnicodeWeight,\r
+  IN  UINTN                         Count\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+  GRAPHICS_CONSOLE_DEV              *Private;\r
+  EFI_IMAGE_OUTPUT                  *Blt;\r
+  EFI_STRING                        String;\r
+  EFI_FONT_DISPLAY_INFO             *FontInfo;\r
+\r
+  Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
+  //\r
+  // GOP protocol is required in UEFI mode.\r
+  //\r
+  ASSERT (Private->GraphicsOutput != NULL);\r
+\r
+  Blt = (EFI_IMAGE_OUTPUT *) AllocateZeroPool (sizeof (EFI_IMAGE_OUTPUT));\r
+  if (Blt == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  Blt->Width        = (UINT16) (Private->ModeData[This->Mode->Mode].GopWidth);\r
+  Blt->Height       = (UINT16) (Private->ModeData[This->Mode->Mode].GopHeight);\r
+  Blt->Image.Screen = Private->GraphicsOutput;\r
+\r
+  String = AllocateCopyPool ((Count + 1) * sizeof (CHAR16), UnicodeWeight);\r
+  if (String == NULL) {\r
+    SafeFreePool (Blt);\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  *(String + Count) = 0;\r
+\r
+  FontInfo = (EFI_FONT_DISPLAY_INFO *) AllocateZeroPool (sizeof (EFI_FONT_DISPLAY_INFO));\r
+  if (FontInfo == NULL) {\r
+    SafeFreePool (Blt);\r
+    SafeFreePool (String);\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  GetTextColors (This, &FontInfo->ForegroundColor, &FontInfo->BackgroundColor);\r
+\r
+  Status = mHiiFont->StringToImage (\r
+                       mHiiFont,\r
+                       EFI_HII_IGNORE_IF_NO_GLYPH | EFI_HII_DIRECT_TO_SCREEN,\r
+                       String,\r
+                       FontInfo,\r
+                       &Blt,\r
+                       This->Mode->CursorColumn * GLYPH_WIDTH + Private->ModeData[This->Mode->Mode].DeltaX,\r
+                       This->Mode->CursorRow * GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY,\r
+                       NULL,\r
+                       NULL,\r
+                       NULL\r
+                       );\r
+\r
+  SafeFreePool (Blt);\r
+  SafeFreePool (String);\r
+  SafeFreePool (FontInfo);\r
+  return Status;\r
+}\r
+#else\r
 STATIC\r
 EFI_STATUS\r
 DrawUnicodeWeightAtCursorN (\r
@@ -1794,6 +1923,7 @@ DrawUnicodeWeightAtCursorN (
 \r
   return ReturnStatus;\r
 }\r
+#endif\r
 \r
 STATIC\r
 EFI_STATUS\r