]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Universal/Console/GraphicsConsole/Dxe/GraphicsConsole.c
Retiring the ANT/JAVA build and removing the older EDK II packages that required...
[mirror_edk2.git] / EdkModulePkg / Universal / Console / GraphicsConsole / Dxe / GraphicsConsole.c
diff --git a/EdkModulePkg/Universal/Console/GraphicsConsole/Dxe/GraphicsConsole.c b/EdkModulePkg/Universal/Console/GraphicsConsole/Dxe/GraphicsConsole.c
deleted file mode 100644 (file)
index 21cf9db..0000000
+++ /dev/null
@@ -1,1821 +0,0 @@
-/**@file\r
-  This is the main routine for initializing the Graphics Console support routines.\r
-Remaining Tasks\r
-  Add all standard Glyphs from EFI 1.02 Specification\r
-  Implement optimal automatic Mode creation algorithm\r
-  Solve palette issues for mixed graphics and text\r
-  When does this protocol reset the palette?\r
-    \r
-Copyright (c) 2006 - 2007 Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials                          \r
-are licensed and made available under the terms and conditions of the BSD License         \r
-which accompanies this distribution.  The full text of the license may be found at        \r
-http://opensource.org/licenses/bsd-license.php                                            \r
-                                                                                          \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
-\r
-**/\r
-\r
-#include "GraphicsConsole.h"\r
-\r
-STATIC\r
-EFI_STATUS\r
-GetTextColors (\r
-  IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
-  OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Foreground,\r
-  OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Background\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-DrawUnicodeWeightAtCursorN (\r
-  IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
-  IN  CHAR16                        *UnicodeWeight,\r
-  IN  UINTN                         Count\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EraseCursor (\r
-  IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This\r
-  );\r
-\r
-//\r
-// Globals\r
-//\r
-GRAPHICS_CONSOLE_DEV        mGraphicsConsoleDevTemplate = {\r
-  GRAPHICS_CONSOLE_DEV_SIGNATURE,\r
-  (EFI_GRAPHICS_OUTPUT_PROTOCOL *) NULL,\r
-  (EFI_UGA_DRAW_PROTOCOL *) NULL,\r
-  {\r
-    GraphicsConsoleConOutReset,\r
-    GraphicsConsoleConOutOutputString,\r
-    GraphicsConsoleConOutTestString,\r
-    GraphicsConsoleConOutQueryMode,\r
-    GraphicsConsoleConOutSetMode,\r
-    GraphicsConsoleConOutSetAttribute,\r
-    GraphicsConsoleConOutClearScreen,\r
-    GraphicsConsoleConOutSetCursorPosition,\r
-    GraphicsConsoleConOutEnableCursor,\r
-    (EFI_SIMPLE_TEXT_OUTPUT_MODE *) NULL\r
-  },\r
-  {\r
-    0,\r
-    0,\r
-    EFI_TEXT_ATTR(EFI_LIGHTGRAY, EFI_BLACK),\r
-    0,\r
-    0,\r
-    TRUE\r
-  },\r
-  {\r
-    { 80, 25, 0, 0, 0, 0 },  // Mode 0\r
-    { 80, 50, 0, 0, 0, 0 },  // Mode 1 \r
-    {  0,  0, 0, 0, 0, 0 }   // Mode 2\r
-  },\r
-  (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL,\r
-  (EFI_HII_HANDLE) 0\r
-};\r
-\r
-EFI_HII_PROTOCOL            *mHii;\r
-\r
-static CHAR16               mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };\r
-\r
-static EFI_GRAPHICS_OUTPUT_BLT_PIXEL        mEfiColors[16] = {\r
-  //\r
-  // B     G     R\r
-  //\r
-  {0x00, 0x00, 0x00, 0x00},  // BLACK\r
-  {0x98, 0x00, 0x00, 0x00},  // BLUE\r
-  {0x00, 0x98, 0x00, 0x00},  // GREEN\r
-  {0x98, 0x98, 0x00, 0x00},  // CYAN\r
-  {0x00, 0x00, 0x98, 0x00},  // RED\r
-  {0x98, 0x00, 0x98, 0x00},  // MAGENTA\r
-  {0x00, 0x98, 0x98, 0x00},  // BROWN\r
-  {0x98, 0x98, 0x98, 0x00},  // LIGHTGRAY\r
-  {0x30, 0x30, 0x30, 0x00},  // DARKGRAY - BRIGHT BLACK\r
-  {0xff, 0x00, 0x00, 0x00},  // LIGHTBLUE - ?\r
-  {0x00, 0xff, 0x00, 0x00},  // LIGHTGREEN - ?\r
-  {0xff, 0xff, 0x00, 0x00},  // LIGHTCYAN\r
-  {0x00, 0x00, 0xff, 0x00},  // LIGHTRED\r
-  {0xff, 0x00, 0xff, 0x00},  // LIGHTMAGENTA\r
-  {0x00, 0xff, 0xff, 0x00},  // LIGHTBROWN\r
-  {0xff, 0xff, 0xff, 0x00}  // WHITE\r
-};\r
-\r
-static EFI_NARROW_GLYPH     mCursorGlyph = {\r
-  0x0000,\r
-  0x00,\r
-  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF }\r
-};\r
-\r
-EFI_DRIVER_BINDING_PROTOCOL gGraphicsConsoleDriverBinding = {\r
-  GraphicsConsoleControllerDriverSupported,\r
-  GraphicsConsoleControllerDriverStart,\r
-  GraphicsConsoleControllerDriverStop,\r
-  0xa,\r
-  NULL,\r
-  NULL\r
-};\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleControllerDriverSupported (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     Controller,\r
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
-  )\r
-{\r
-  EFI_STATUS                Status;\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
-  EFI_UGA_DRAW_PROTOCOL     *UgaDraw;\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
-\r
-  UgaDraw = NULL;\r
-  //\r
-  // Open the IO Abstraction(s) needed to perform the supported test\r
-  //\r
-  Status = gBS->OpenProtocol (\r
-                  Controller,\r
-                  &gEfiGraphicsOutputProtocolGuid,\r
-                  (VOID **) &GraphicsOutput,\r
-                  This->DriverBindingHandle,\r
-                  Controller,\r
-                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
-                  );\r
-  \r
-  if (EFI_ERROR (Status)) {\r
-    GraphicsOutput = NULL;\r
-    //\r
-    // Open Graphics Output Protocol failed, try to open UGA Draw Protocol\r
-    //\r
-    Status = gBS->OpenProtocol (\r
-                    Controller,\r
-                    &gEfiUgaDrawProtocolGuid,\r
-                    (VOID **) &UgaDraw,\r
-                    This->DriverBindingHandle,\r
-                    Controller,\r
-                    EFI_OPEN_PROTOCOL_BY_DRIVER\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-  }\r
-\r
-  //\r
-  // We need to ensure that we do not layer on top of a virtual handle.\r
-  // We need to ensure that the handles produced by the conspliter do not\r
-  // get used.\r
-  //\r
-  Status = gBS->OpenProtocol (\r
-                  Controller,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  (VOID **) &DevicePath,\r
-                  This->DriverBindingHandle,\r
-                  Controller,\r
-                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
-                  );\r
-  if (!EFI_ERROR (Status)) {\r
-    gBS->CloseProtocol (\r
-          Controller,\r
-          &gEfiDevicePathProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Controller\r
-          );\r
-  } else {\r
-    goto Error;\r
-  }\r
-  //\r
-  // Does Hii Exist?  If not, we aren't ready to run\r
-  //\r
-  Status = EfiLocateHiiProtocol ();\r
-\r
-  //\r
-  // Close the I/O Abstraction(s) used to perform the supported test\r
-  //\r
-Error:\r
-  if (GraphicsOutput != NULL) {\r
-    gBS->CloseProtocol (\r
-          Controller,\r
-          &gEfiGraphicsOutputProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Controller\r
-          );\r
-  } else {\r
-    gBS->CloseProtocol (\r
-          Controller,\r
-          &gEfiUgaDrawProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Controller\r
-          );\r
-  }\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleControllerDriverStart (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                     Controller,\r
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Start the controller.\r
-\r
-  Arguments:\r
-\r
-    This                - A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.\r
-    Controller          - The handle of the controller to start.\r
-    RemainingDevicePath - A pointer to the remaining portion of a devcie path.\r
-\r
-  Returns:\r
-\r
-    EFI_SUCCESS          - Return successfully.\r
-    EFI_OUT_OF_RESOURCES - Out of resources.\r
-\r
---*/\r
-{\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
-  UINT32                ColorDepth;\r
-  UINT32                RefreshRate;\r
-  UINTN                 MaxMode;\r
-  UINTN                 Columns;\r
-  UINTN                 Rows;\r
-  UINT8                 *Location;\r
-  UINT32                               ModeNumber;\r
-  UINTN                                SizeOfInfo;\r
-  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
-  \r
-  ModeNumber = 0;\r
-\r
-  //\r
-  // Initialize the Graphics Console device instance\r
-  //\r
-  Private = AllocateCopyPool (\r
-              sizeof (GRAPHICS_CONSOLE_DEV),\r
-              &mGraphicsConsoleDevTemplate\r
-              );\r
-  if (Private == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  Private->SimpleTextOutput.Mode = &(Private->SimpleTextOutputMode);\r
-\r
-  Status = gBS->OpenProtocol (\r
-                  Controller,\r
-                  &gEfiGraphicsOutputProtocolGuid,\r
-                  (VOID **) &Private->GraphicsOutput,\r
-                  This->DriverBindingHandle,\r
-                  Controller,\r
-                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
-                  );\r
-  if (EFI_ERROR(Status)) {\r
-    Private->GraphicsOutput = NULL;\r
-\r
-    Status = gBS->OpenProtocol (\r
-                    Controller,\r
-                    &gEfiUgaDrawProtocolGuid,\r
-                    (VOID **) &Private->UgaDraw,\r
-                    This->DriverBindingHandle,\r
-                    Controller,\r
-                    EFI_OPEN_PROTOCOL_BY_DRIVER\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      goto Error;\r
-    }\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
-  FontPack        = AllocateZeroPool (sizeof (EFI_HII_FONT_PACK) + NarrowFontSize);\r
-  ASSERT (FontPack);\r
-\r
-  FontPack->Header.Length         = (UINT32) (sizeof (EFI_HII_FONT_PACK) + NarrowFontSize);\r
-  FontPack->Header.Type           = EFI_HII_FONT;\r
-  FontPack->NumberOfNarrowGlyphs  = (UINT16) (NarrowFontSize / sizeof (EFI_NARROW_GLYPH));\r
-\r
-  Location                        = (UINT8 *) (&FontPack->NumberOfWideGlyphs + sizeof (UINT8));\r
-  CopyMem (Location, UsStdNarrowGlyphData, NarrowFontSize);\r
-\r
-  //\r
-  // Register our Fonts into the global database\r
-  //\r
-  Package = PreparePackages (1, NULL, FontPack);\r
-  mHii->NewPack (mHii, Package, &(Private->HiiHandle));\r
-  FreePool (Package);\r
-\r
-  //\r
-  // Free the font database\r
-  //\r
-  FreePool (FontPack);\r
-\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
-  //\r
-  HorizontalResolution  = 800;\r
-  VerticalResolution    = 600;\r
-\r
-  if (Private->GraphicsOutput != NULL) {\r
-    //\r
-    // The console is build on top of Graphics Output Protocol, find the mode number for 800x600\r
-    //\r
-    for (ModeNumber = 0; ModeNumber < Private->GraphicsOutput->Mode->MaxMode; ModeNumber++) {\r
-      Status = Private->GraphicsOutput->QueryMode (\r
-                         Private->GraphicsOutput,\r
-                         ModeNumber,\r
-                         &SizeOfInfo,\r
-                         &Info\r
-                         );\r
-      if (!EFI_ERROR (Status)) {\r
-        if ((Info->HorizontalResolution == 800) &&\r
-            (Info->VerticalResolution == 600)) {\r
-          Status = Private->GraphicsOutput->SetMode (Private->GraphicsOutput, ModeNumber);\r
-          if (!EFI_ERROR (Status)) {\r
-            FreePool (Info);\r
-            break;\r
-          }\r
-        }\r
-        FreePool (Info);\r
-      }\r
-    }\r
-\r
-    if (EFI_ERROR (Status) || (ModeNumber == Private->GraphicsOutput->Mode->MaxMode)) {\r
-      //\r
-      // Set default mode failed or device don't support default mode, then get the current mode information\r
-      //\r
-      HorizontalResolution = Private->GraphicsOutput->Mode->Info->HorizontalResolution;\r
-      VerticalResolution = Private->GraphicsOutput->Mode->Info->VerticalResolution;\r
-      ModeNumber = Private->GraphicsOutput->Mode->Mode;\r
-    }\r
-  } else {\r
-    //\r
-    // The console is build on top of UGA Draw Protocol\r
-    //\r
-    ColorDepth            = 32;\r
-    RefreshRate           = 60;\r
-    Status = Private->UgaDraw->SetMode (\r
-                                Private->UgaDraw,\r
-                                HorizontalResolution,\r
-                                VerticalResolution,\r
-                                ColorDepth,\r
-                                RefreshRate\r
-                                );\r
-    if (EFI_ERROR (Status)) {\r
-      //\r
-      // Get the current mode information from the UGA Draw Protocol\r
-      //\r
-      Status = Private->UgaDraw->GetMode (\r
-                                  Private->UgaDraw,\r
-                                  &HorizontalResolution,\r
-                                  &VerticalResolution,\r
-                                  &ColorDepth,\r
-                                  &RefreshRate\r
-                                  );\r
-      if (EFI_ERROR (Status)) {\r
-        goto Error;\r
-      }\r
-    }\r
-  }\r
-\r
-  //\r
-  // Compute the maximum number of text Rows and Columns that this current graphics mode can support\r
-  //\r
-  Columns = HorizontalResolution / GLYPH_WIDTH;\r
-  Rows    = VerticalResolution / GLYPH_HEIGHT;\r
-\r
-  //\r
-  // See if the mode is too small to support the required 80x25 text mode\r
-  //\r
-  if (Columns < 80 || Rows < 25) {\r
-    goto Error;\r
-  }\r
-  //\r
-  // Add Mode #0 that must be 80x25\r
-  //\r
-  MaxMode = 0;\r
-  Private->ModeData[MaxMode].GopWidth   = HorizontalResolution;\r
-  Private->ModeData[MaxMode].GopHeight  = VerticalResolution;\r
-  Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
-  Private->ModeData[MaxMode].DeltaX     = (HorizontalResolution - (80 * GLYPH_WIDTH)) >> 1;\r
-  Private->ModeData[MaxMode].DeltaY     = (VerticalResolution - (25 * GLYPH_HEIGHT)) >> 1;\r
-  MaxMode++;\r
-\r
-  //\r
-  // If it is possible to support Mode #1 - 80x50, than add it as an active mode\r
-  //\r
-  if (Rows >= 50) {\r
-    Private->ModeData[MaxMode].GopWidth   = HorizontalResolution;\r
-    Private->ModeData[MaxMode].GopHeight  = VerticalResolution;\r
-    Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
-    Private->ModeData[MaxMode].DeltaX     = (HorizontalResolution - (80 * GLYPH_WIDTH)) >> 1;\r
-    Private->ModeData[MaxMode].DeltaY     = (VerticalResolution - (50 * GLYPH_HEIGHT)) >> 1;\r
-    MaxMode++;\r
-  }\r
-  //\r
-  // If the graphics mode is 800x600, than add a text mode that uses the entire display\r
-  //\r
-  if (HorizontalResolution == 800 && VerticalResolution == 600) {\r
-\r
-    if (MaxMode < 2) {\r
-      Private->ModeData[MaxMode].Columns    = 0;\r
-      Private->ModeData[MaxMode].Rows       = 0;\r
-      Private->ModeData[MaxMode].GopWidth   = 800;\r
-      Private->ModeData[MaxMode].GopHeight  = 600;\r
-      Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
-      Private->ModeData[MaxMode].DeltaX     = 0;\r
-      Private->ModeData[MaxMode].DeltaY     = 0;\r
-      MaxMode++;\r
-    }\r
-\r
-    Private->ModeData[MaxMode].Columns    = 800 / GLYPH_WIDTH;\r
-    Private->ModeData[MaxMode].Rows       = 600 / GLYPH_HEIGHT;\r
-    Private->ModeData[MaxMode].GopWidth   = 800;\r
-    Private->ModeData[MaxMode].GopHeight  = 600;\r
-    Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
-    Private->ModeData[MaxMode].DeltaX     = (800 % GLYPH_WIDTH) >> 1;\r
-    Private->ModeData[MaxMode].DeltaY     = (600 % GLYPH_HEIGHT) >> 1;\r
-    MaxMode++;\r
-  }\r
-  //\r
-  // Update the maximum number of modes\r
-  //\r
-  Private->SimpleTextOutputMode.MaxMode = (INT32) MaxMode;\r
-\r
-  //\r
-  // Determine the number of text modes that this protocol can support\r
-  //\r
-  Status = GraphicsConsoleConOutSetMode (&Private->SimpleTextOutput, 0);\r
-  if (EFI_ERROR (Status)) {\r
-    goto Error;\r
-  }\r
-\r
-  DEBUG_CODE_BEGIN ();\r
-    GraphicsConsoleConOutOutputString (&Private->SimpleTextOutput, (CHAR16 *)L"Graphics Console Started\n\r");\r
-  DEBUG_CODE_END ();\r
-\r
-  //\r
-  // Install protocol interfaces for the Graphics Console device.\r
-  //\r
-  Status = gBS->InstallMultipleProtocolInterfaces (\r
-                  &Controller,\r
-                  &gEfiSimpleTextOutProtocolGuid,\r
-                  &Private->SimpleTextOutput,\r
-                  NULL\r
-                  );\r
-\r
-Error:\r
-  if (EFI_ERROR (Status)) {\r
-    //\r
-    // Close the GOP or UGA IO Protocol\r
-    //\r
-    if (Private->GraphicsOutput != NULL) {\r
-      gBS->CloseProtocol (\r
-            Controller,\r
-            &gEfiGraphicsOutputProtocolGuid,\r
-            This->DriverBindingHandle,\r
-            Controller\r
-            );\r
-    } else {\r
-      gBS->CloseProtocol (\r
-            Controller,\r
-            &gEfiUgaDrawProtocolGuid,\r
-            This->DriverBindingHandle,\r
-            Controller\r
-            );\r
-    }\r
-\r
-    //\r
-    // Free private data\r
-    //\r
-    if (Private != NULL) {\r
-      if (Private->LineBuffer != NULL) {\r
-        FreePool (Private->LineBuffer);\r
-      }\r
-      FreePool (Private);\r
-    }\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleControllerDriverStop (\r
-  IN  EFI_DRIVER_BINDING_PROTOCOL   *This,\r
-  IN  EFI_HANDLE                    Controller,\r
-  IN  UINTN                         NumberOfChildren,\r
-  IN  EFI_HANDLE                    *ChildHandleBuffer\r
-  )\r
-{\r
-  EFI_STATUS                    Status;\r
-  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *SimpleTextOutput;\r
-  GRAPHICS_CONSOLE_DEV          *Private;\r
-\r
-  Status = gBS->OpenProtocol (\r
-                  Controller,\r
-                  &gEfiSimpleTextOutProtocolGuid,\r
-                  (VOID **) &SimpleTextOutput,\r
-                  This->DriverBindingHandle,\r
-                  Controller,\r
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_NOT_STARTED;\r
-  }\r
-\r
-  Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (SimpleTextOutput);\r
-\r
-  Status = gBS->UninstallProtocolInterface (\r
-                  Controller,\r
-                  &gEfiSimpleTextOutProtocolGuid,\r
-                  &Private->SimpleTextOutput\r
-                  );\r
-\r
-  if (!EFI_ERROR (Status)) {\r
-    //\r
-    // Close the GOP or UGA IO Protocol\r
-    //\r
-    if (Private->GraphicsOutput != NULL) {\r
-      gBS->CloseProtocol (\r
-            Controller,\r
-            &gEfiGraphicsOutputProtocolGuid,\r
-            This->DriverBindingHandle,\r
-            Controller\r
-            );\r
-    } else {\r
-      gBS->CloseProtocol (\r
-            Controller,\r
-            &gEfiUgaDrawProtocolGuid,\r
-            This->DriverBindingHandle,\r
-            Controller\r
-            );\r
-    }\r
-\r
-    //\r
-    // Remove the font pack\r
-    //\r
-    mHii->RemovePack (mHii, Private->HiiHandle);\r
-\r
-    //\r
-    // Free our instance data\r
-    //\r
-    if (Private != NULL) {\r
-      FreePool (Private->LineBuffer);\r
-      FreePool (Private);\r
-    }\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EfiLocateHiiProtocol (\r
-  VOID\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Find if the HII protocol is available. If yes, locate the HII protocol\r
-\r
-  Arguments:\r
-\r
-  Returns:\r
-\r
---*/\r
-{\r
-  EFI_HANDLE  Handle;\r
-  UINTN       Size;\r
-  EFI_STATUS  Status;\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
-                  &gEfiHiiProtocolGuid,\r
-                  NULL,\r
-                  &Size,\r
-                  &Handle\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  Status = gBS->HandleProtocol (\r
-                  Handle,\r
-                  &gEfiHiiProtocolGuid,\r
-                  (VOID **)&mHii\r
-                  );\r
-\r
-  return Status;\r
-}\r
-//\r
-// Body of the STO functions\r
-//\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutReset (\r
-  IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
-  IN  BOOLEAN                       ExtendedVerification\r
-  )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.Reset().\r
-    If ExtendeVerification is TRUE, then perform dependent Graphics Console \r
-    device reset, and set display mode to mode 0.\r
-    If ExtendedVerification is FALSE, only set display mode to mode 0.\r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-    \r
-    ExtendedVerification - Indicates that the driver may perform a more exhaustive\r
-                           verification operation of the device during reset.\r
-        \r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-       The reset operation succeeds.   \r
-    \r
-    EFI_DEVICE_ERROR\r
-      The Graphics Console is not functioning correctly \r
-                \r
---*/\r
-{\r
-  This->SetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK));\r
-  return This->SetMode (This, 0);\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutOutputString (\r
-  IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
-  IN  CHAR16                        *WString\r
-  )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.OutputString().\r
-    The Unicode string will be converted to Glyphs and will be \r
-    sent to the Graphics Console.\r
-    \r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-    \r
-    WString - The Null-terminated Unicode string to be displayed on \r
-              the Graphics Console.\r
-        \r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-       The string is output successfully.   \r
-    \r
-    EFI_DEVICE_ERROR\r
-      The Graphics Console failed to send the string out.\r
-      \r
-    EFI_WARN_UNKNOWN_GLYPH\r
-      Indicates that some of the characters in the Unicode string could not \r
-      be rendered and are skipped.          \r
-                \r
---*/\r
-{\r
-  GRAPHICS_CONSOLE_DEV  *Private;\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL   *GraphicsOutput;\r
-  EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
-  INTN                  Mode;\r
-  UINTN                 MaxColumn;\r
-  UINTN                 MaxRow;\r
-  UINTN                 Width;\r
-  UINTN                 Height;\r
-  UINTN                 Delta;\r
-  EFI_STATUS            Status;\r
-  BOOLEAN               Warning;\r
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL  Foreground;\r
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL  Background;\r
-  UINTN                 DeltaX;\r
-  UINTN                 DeltaY;\r
-  UINTN                 Count;\r
-  UINTN                 Index;\r
-  INT32                 OriginAttribute;\r
-  EFI_TPL               OldTpl;\r
-  CHAR16                         SpaceStr[] = { NARROW_CHAR, ' ', 0 };\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
-  //\r
-  // Current mode\r
-  //\r
-  Mode      = This->Mode->Mode;\r
-  Private   = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
-  GraphicsOutput = Private->GraphicsOutput;\r
-  UgaDraw   = Private->UgaDraw;\r
-\r
-  MaxColumn = Private->ModeData[Mode].Columns;\r
-  MaxRow    = Private->ModeData[Mode].Rows;\r
-  DeltaX    = Private->ModeData[Mode].DeltaX;\r
-  DeltaY    = Private->ModeData[Mode].DeltaY;\r
-  Width     = MaxColumn * GLYPH_WIDTH;\r
-  Height    = (MaxRow - 1) * GLYPH_HEIGHT;\r
-  Delta     = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);\r
-\r
-  //\r
-  // The Attributes won't change when during the time OutputString is called\r
-  //\r
-  GetTextColors (This, &Foreground, &Background);\r
-\r
-  EraseCursor (This);\r
-\r
-  Warning = FALSE;\r
-\r
-  //\r
-  // Backup attribute\r
-  //\r
-  OriginAttribute = This->Mode->Attribute;\r
-\r
-  while (*WString) {\r
-\r
-    if (*WString == CHAR_BACKSPACE) {\r
-      //\r
-      // If the cursor is at the left edge of the display, then move the cursor\r
-      // one row up.\r
-      //\r
-      if (This->Mode->CursorColumn == 0 && This->Mode->CursorRow > 0) {\r
-        This->Mode->CursorRow--;\r
-        This->Mode->CursorColumn = (INT32) (MaxColumn - 1);\r
-        This->OutputString (This, SpaceStr);\r
-        EraseCursor (This);\r
-        This->Mode->CursorRow--;\r
-        This->Mode->CursorColumn = (INT32) (MaxColumn - 1);\r
-      } else if (This->Mode->CursorColumn > 0) {\r
-        //\r
-        // If the cursor is not at the left edge of the display, then move the cursor\r
-        // left one column.\r
-        //\r
-        This->Mode->CursorColumn--;\r
-        This->OutputString (This, SpaceStr);\r
-        EraseCursor (This);\r
-        This->Mode->CursorColumn--;\r
-      }\r
-\r
-      WString++;\r
-\r
-    } else if (*WString == CHAR_LINEFEED) {\r
-      //\r
-      // If the cursor is at the bottom of the display, then scroll the display one\r
-      // row, and do not update the cursor position. Otherwise, move the cursor\r
-      // down one row.\r
-      //\r
-      if (This->Mode->CursorRow == (INT32) (MaxRow - 1)) {\r
-        if (GraphicsOutput != NULL) {\r
-          //\r
-          // Scroll Screen Up One Row\r
-          //\r
-          GraphicsOutput->Blt (\r
-                    GraphicsOutput,\r
-                    NULL,\r
-                    EfiBltVideoToVideo,\r
-                    DeltaX,\r
-                    DeltaY + GLYPH_HEIGHT,\r
-                    DeltaX,\r
-                    DeltaY,\r
-                    Width,\r
-                    Height,\r
-                    Delta\r
-                    );\r
-\r
-          //\r
-          // Print Blank Line at last line\r
-          //\r
-          GraphicsOutput->Blt (\r
-                    GraphicsOutput,\r
-                    &Background,\r
-                    EfiBltVideoFill,\r
-                    0,\r
-                    0,\r
-                    DeltaX,\r
-                    DeltaY + Height,\r
-                    Width,\r
-                    GLYPH_HEIGHT,\r
-                    Delta\r
-                    );\r
-        } else {\r
-          //\r
-          // Scroll Screen Up One Row\r
-          //\r
-          UgaDraw->Blt (\r
-                    UgaDraw,\r
-                    NULL,\r
-                    EfiUgaVideoToVideo,\r
-                    DeltaX,\r
-                    DeltaY + GLYPH_HEIGHT,\r
-                    DeltaX,\r
-                    DeltaY,\r
-                    Width,\r
-                    Height,\r
-                    Delta\r
-                    );\r
-\r
-          //\r
-          // Print Blank Line at last line\r
-          //\r
-          UgaDraw->Blt (\r
-                    UgaDraw,\r
-                    (EFI_UGA_PIXEL *) (UINTN) &Background,\r
-                    EfiUgaVideoFill,\r
-                    0,\r
-                    0,\r
-                    DeltaX,\r
-                    DeltaY + Height,\r
-                    Width,\r
-                    GLYPH_HEIGHT,\r
-                    Delta\r
-                    );\r
-        }\r
-      } else {\r
-        This->Mode->CursorRow++;\r
-      }\r
-\r
-      WString++;\r
-\r
-    } else if (*WString == CHAR_CARRIAGE_RETURN) {\r
-      //\r
-      // Move the cursor to the beginning of the current row.\r
-      //\r
-      This->Mode->CursorColumn = 0;\r
-      WString++;\r
-\r
-    } else if (*WString == WIDE_CHAR) {\r
-\r
-      This->Mode->Attribute |= EFI_WIDE_ATTRIBUTE;\r
-      WString++;\r
-\r
-    } else if (*WString == NARROW_CHAR) {\r
-\r
-      This->Mode->Attribute &= (~ (UINT32) EFI_WIDE_ATTRIBUTE);\r
-      WString++;\r
-\r
-    } else {\r
-      //\r
-      // Print the character at the current cursor position and move the cursor\r
-      // right one column. If this moves the cursor past the right edge of the\r
-      // display, then the line should wrap to the beginning of the next line. This\r
-      // is equivalent to inserting a CR and an LF. Note that if the cursor is at the\r
-      // bottom of the display, and the line wraps, then the display will be scrolled\r
-      // one line.\r
-      // If wide char is going to be displayed, need to display one character at a time\r
-      // Or, need to know the display length of a certain string.\r
-      //\r
-      // Index is used to determine how many character width units (wide = 2, narrow = 1)\r
-      // Count is used to determine how many characters are used regardless of their attributes\r
-      //\r
-      for (Count = 0, Index = 0; (This->Mode->CursorColumn + Index) < MaxColumn; Count++, Index++) {\r
-        if (WString[Count] == CHAR_NULL) {\r
-          break;\r
-        }\r
-\r
-        if (WString[Count] == CHAR_BACKSPACE) {\r
-          break;\r
-        }\r
-\r
-        if (WString[Count] == CHAR_LINEFEED) {\r
-          break;\r
-        }\r
-\r
-        if (WString[Count] == CHAR_CARRIAGE_RETURN) {\r
-          break;\r
-        }\r
-\r
-        if (WString[Count] == WIDE_CHAR) {\r
-          break;\r
-        }\r
-\r
-        if (WString[Count] == NARROW_CHAR) {\r
-          break;\r
-        }\r
-        //\r
-        // Is the wide attribute on?\r
-        //\r
-        if (This->Mode->Attribute & EFI_WIDE_ATTRIBUTE) {\r
-          //\r
-          // If wide, add one more width unit than normal since we are going to increment at the end of the for loop\r
-          //\r
-          Index++;\r
-          //\r
-          // This is the end-case where if we are at column 79 and about to print a wide character\r
-          // We should prevent this from happening because we will wrap inappropriately.  We should\r
-          // not print this character until the next line.\r
-          //\r
-          if ((This->Mode->CursorColumn + Index + 1) > MaxColumn) {\r
-            Index++;\r
-            break;\r
-          }\r
-        }\r
-      }\r
-\r
-      Status = DrawUnicodeWeightAtCursorN (This, WString, Count);\r
-      if (EFI_ERROR (Status)) {\r
-        Warning = TRUE;\r
-      }\r
-      //\r
-      // At the end of line, output carriage return and line feed\r
-      //\r
-      WString += Count;\r
-      This->Mode->CursorColumn += (INT32) Index;\r
-      if (This->Mode->CursorColumn > (INT32) MaxColumn) {\r
-        This->Mode->CursorColumn -= 2;\r
-        This->OutputString (This, SpaceStr);\r
-      }\r
-\r
-      if (This->Mode->CursorColumn >= (INT32) MaxColumn) {\r
-        EraseCursor (This);\r
-        This->OutputString (This, mCrLfString);\r
-        EraseCursor (This);\r
-      }\r
-    }\r
-  }\r
-\r
-  This->Mode->Attribute = OriginAttribute;\r
-\r
-  EraseCursor (This);\r
-\r
-  if (Warning) {\r
-    Status = EFI_WARN_UNKNOWN_GLYPH;\r
-  }\r
-\r
-  gBS->RestoreTPL (OldTpl);\r
-  return Status;\r
-\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutTestString (\r
-  IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
-  IN  CHAR16                        *WString\r
-  )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.TestString().\r
-    If one of the characters in the *Wstring is\r
-    neither valid valid Unicode drawing characters,\r
-    not ASCII code, then this function will return\r
-    EFI_UNSUPPORTED.\r
-        \r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-    \r
-    WString - The Null-terminated Unicode string to be tested.\r
-        \r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-       The Graphics Console is capable of rendering the output string. \r
-    \r
-    EFI_UNSUPPORTED\r
-      Some of the characters in the Unicode string cannot be rendered.      \r
-                \r
---*/\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
-    Status = mHii->GetGlyph (\r
-                    mHii,\r
-                    WString,\r
-                    &Count,\r
-                    (UINT8 **) &Glyph,\r
-                    &GlyphWidth,\r
-                    &GlyphStatus\r
-                    );\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      return EFI_UNSUPPORTED;\r
-    }\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutQueryMode (\r
-  IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
-  IN  UINTN                         ModeNumber,\r
-  OUT UINTN                         *Columns,\r
-  OUT UINTN                         *Rows\r
-  )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.QueryMode().\r
-    It returnes information for an available text mode\r
-    that the Graphics Console supports.\r
-    In this driver,we only support text mode 80x25, which is\r
-    defined as mode 0.\r
-        \r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-    \r
-    ModeNumber - The mode number to return information on.\r
-        \r
-    Columns - The returned columns of the requested mode.\r
-        \r
-    Rows - The returned rows of the requested mode.                \r
-        \r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-      The requested mode information is returned. \r
-    \r
-    EFI_UNSUPPORTED\r
-      The mode number is not valid.   \r
-                \r
---*/\r
-{\r
-  GRAPHICS_CONSOLE_DEV  *Private;\r
-  EFI_STATUS            Status;\r
-  EFI_TPL               OldTpl;\r
-\r
-  if (ModeNumber >= (UINTN) This->Mode->MaxMode) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
-  Status = EFI_SUCCESS;\r
-  \r
-  Private   = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
-\r
-  *Columns  = Private->ModeData[ModeNumber].Columns;\r
-  *Rows     = Private->ModeData[ModeNumber].Rows;\r
-\r
-  if (*Columns <= 0 && *Rows <= 0) {\r
-    Status = EFI_UNSUPPORTED;\r
-    goto Done;\r
-\r
-  }\r
-\r
-Done:\r
-  gBS->RestoreTPL (OldTpl);\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutSetMode (\r
-  IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
-  IN  UINTN                         ModeNumber\r
-  )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.SetMode().\r
-    Set the Graphics Console to a specified mode.\r
-    In this driver, we only support mode 0.        \r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-    \r
-    ModeNumber - The text mode to set.\r
-        \r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-       The requested text mode is set.\r
-       \r
-    EFI_DEVICE_ERROR\r
-      The requested text mode cannot be set because of Graphics Console device error.\r
-    \r
-    EFI_UNSUPPORTED\r
-      The text mode number is not valid.       \r
-                \r
---*/\r
-{\r
-  EFI_STATUS                      Status;\r
-  GRAPHICS_CONSOLE_DEV            *Private;\r
-  GRAPHICS_CONSOLE_MODE_DATA      *ModeData;\r
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL   *NewLineBuffer;\r
-  UINT32                          HorizontalResolution;\r
-  UINT32                          VerticalResolution;\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL    *GraphicsOutput;\r
-  EFI_UGA_DRAW_PROTOCOL           *UgaDraw;\r
-  UINT32                          ColorDepth;\r
-  UINT32                          RefreshRate;\r
-  EFI_TPL                         OldTpl;\r
-\r
-  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
-\r
-  Private   = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
-  GraphicsOutput = Private->GraphicsOutput;\r
-  UgaDraw   = Private->UgaDraw;\r
-  ModeData  = &(Private->ModeData[ModeNumber]);\r
-\r
-  if (ModeData->Columns <= 0 && ModeData->Rows <= 0) {\r
-    Status = EFI_UNSUPPORTED;\r
-    goto Done;\r
-  }\r
-\r
-  //\r
-  // Make sure the requested mode number is supported\r
-  //\r
-  if (ModeNumber >= (UINTN) This->Mode->MaxMode) {\r
-    Status = EFI_UNSUPPORTED;\r
-    goto Done;\r
-  }\r
-\r
-  if (ModeData->Columns <= 0 && ModeData->Rows <= 0) {\r
-    Status = EFI_UNSUPPORTED;\r
-    goto Done;\r
-  }\r
-  //\r
-  // Attempt to allocate a line buffer for the requested mode number\r
-  //\r
-  NewLineBuffer = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * ModeData->Columns * GLYPH_WIDTH * GLYPH_HEIGHT);\r
-\r
-  if (NewLineBuffer == NULL) {\r
-    //\r
-    // The new line buffer could not be allocated, so return an error.\r
-    // No changes to the state of the current console have been made, so the current console is still valid\r
-    //\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto Done;\r
-  }\r
-  //\r
-  // If the mode has been set at least one other time, then LineBuffer will not be NULL\r
-  //\r
-  if (Private->LineBuffer != NULL) {\r
-    //\r
-    // Clear the current text window on the current graphics console\r
-    //\r
-    This->ClearScreen (This);\r
-\r
-    //\r
-    // If the new mode is the same as the old mode, then just return EFI_SUCCESS\r
-    //\r
-    if ((INT32) ModeNumber == This->Mode->Mode) {\r
-      FreePool (NewLineBuffer);\r
-      Status = EFI_SUCCESS;\r
-      goto Done;\r
-    }\r
-    //\r
-    // Otherwise, the size of the text console and/or the UGA mode will be changed,\r
-    // so turn off the cursor, and free the LineBuffer for the current mode\r
-    //\r
-    This->EnableCursor (This, FALSE);\r
-\r
-    FreePool (Private->LineBuffer);\r
-  }\r
-  //\r
-  // Assign the current line buffer to the newly allocated line buffer\r
-  //\r
-  Private->LineBuffer = NewLineBuffer;\r
-\r
-  if (GraphicsOutput != NULL) {\r
-    if (ModeData->GopModeNumber != GraphicsOutput->Mode->Mode) {\r
-      //\r
-      // Either no graphics mode is currently set, or it is set to the wrong resolution, so set the new grapghics mode\r
-      //\r
-      Status = GraphicsOutput->SetMode (GraphicsOutput, ModeData->GopModeNumber);\r
-      if (EFI_ERROR (Status)) {\r
-        //\r
-        // The mode set operation failed\r
-        //\r
-        goto Done;\r
-      }\r
-    } else {\r
-      //\r
-      // The current graphics mode is correct, so simply clear the entire display\r
-      //\r
-      Status = GraphicsOutput->Blt (\r
-                          GraphicsOutput,\r
-                          &mEfiColors[0],\r
-                          EfiBltVideoFill,\r
-                          0,\r
-                          0,\r
-                          0,\r
-                          0,\r
-                          ModeData->GopWidth,\r
-                          ModeData->GopHeight,\r
-                          0\r
-                          );\r
-    }\r
-  } else {\r
-    //\r
-    // Get the current UGA Draw mode information\r
-    //\r
-    Status = UgaDraw->GetMode (\r
-                        UgaDraw,\r
-                        &HorizontalResolution,\r
-                        &VerticalResolution,\r
-                        &ColorDepth,\r
-                        &RefreshRate\r
-                        );\r
-    if (EFI_ERROR (Status) || HorizontalResolution != ModeData->GopWidth || VerticalResolution != ModeData->GopHeight) {\r
-      //\r
-      // Either no graphics mode is currently set, or it is set to the wrong resolution, so set the new grapghics mode\r
-      //\r
-      Status = UgaDraw->SetMode (\r
-                          UgaDraw,\r
-                          ModeData->GopWidth,\r
-                          ModeData->GopHeight,\r
-                          32,\r
-                          60\r
-                          );\r
-      if (EFI_ERROR (Status)) {\r
-        //\r
-        // The mode set operation failed\r
-        //\r
-        goto Done;\r
-      }\r
-    } else {\r
-      //\r
-      // The current graphics mode is correct, so simply clear the entire display\r
-      //\r
-      Status = UgaDraw->Blt (\r
-                          UgaDraw,\r
-                          (EFI_UGA_PIXEL *) (UINTN) &mEfiColors[0],\r
-                          EfiUgaVideoFill,\r
-                          0,\r
-                          0,\r
-                          0,\r
-                          0,\r
-                          ModeData->GopWidth,\r
-                          ModeData->GopHeight,\r
-                          0\r
-                          );\r
-    }\r
-  }\r
-\r
-  //\r
-  // The new mode is valid, so commit the mode change\r
-  //\r
-  This->Mode->Mode = (INT32) ModeNumber;\r
-\r
-  //\r
-  // Move the text cursor to the upper left hand corner of the displat and enable it\r
-  //\r
-  This->SetCursorPosition (This, 0, 0);\r
-  This->EnableCursor (This, TRUE);\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-Done:\r
-  gBS->RestoreTPL (OldTpl);\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutSetAttribute (\r
-  IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
-  IN  UINTN                         Attribute\r
-  )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.SetAttribute().       \r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-    \r
-    Attrubute - The attribute to set. Only bit0..6 are valid, all other bits\r
-                are undefined and must be zero.\r
-        \r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-      The requested attribute is set. \r
-       \r
-    EFI_DEVICE_ERROR\r
-      The requested attribute cannot be set due to Graphics Console port error.\r
-          \r
-    EFI_UNSUPPORTED\r
-      The attribute requested is not defined by EFI spec.   \r
-                \r
---*/\r
-{\r
-  EFI_TPL               OldTpl;\r
-  \r
-  if ((Attribute | 0xFF) != 0xFF) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  if ((INT32) Attribute == This->Mode->Attribute) {\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
-\r
-  EraseCursor (This);\r
-\r
-  This->Mode->Attribute = (INT32) Attribute;\r
-\r
-  EraseCursor (This);\r
-\r
-  gBS->RestoreTPL (OldTpl);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutClearScreen (\r
-  IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This\r
-  )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.ClearScreen().\r
-    It clears the Graphics Console's display to the \r
-    currently selected background color.\r
-        \r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-\r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-      The operation completed successfully.\r
-       \r
-    EFI_DEVICE_ERROR\r
-      The Graphics Console cannot be cleared due to Graphics Console device error.        \r
-    \r
-    EFI_UNSUPPORTED\r
-      The Graphics Console is not in a valid text mode.       \r
-                \r
---*/\r
-{\r
-  EFI_STATUS                    Status;\r
-  GRAPHICS_CONSOLE_DEV          *Private;\r
-  GRAPHICS_CONSOLE_MODE_DATA    *ModeData;\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput;\r
-  EFI_UGA_DRAW_PROTOCOL         *UgaDraw;\r
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
-  EFI_TPL                       OldTpl;\r
-\r
-  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
-\r
-  Private   = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
-  GraphicsOutput = Private->GraphicsOutput;\r
-  UgaDraw   = Private->UgaDraw;\r
-  ModeData  = &(Private->ModeData[This->Mode->Mode]);\r
-\r
-  GetTextColors (This, &Foreground, &Background);\r
-  if (GraphicsOutput != NULL) {\r
-    Status = GraphicsOutput->Blt (\r
-                        GraphicsOutput,\r
-                        &Background,\r
-                        EfiBltVideoFill,\r
-                        0,\r
-                        0,\r
-                        0,\r
-                        0,\r
-                        ModeData->GopWidth,\r
-                        ModeData->GopHeight,\r
-                        0\r
-                        );\r
-  } else {\r
-    Status = UgaDraw->Blt (\r
-                        UgaDraw,\r
-                        (EFI_UGA_PIXEL *) (UINTN) &Background,\r
-                        EfiUgaVideoFill,\r
-                        0,\r
-                        0,\r
-                        0,\r
-                        0,\r
-                        ModeData->GopWidth,\r
-                        ModeData->GopHeight,\r
-                        0\r
-                        );\r
-  }\r
-\r
-  This->Mode->CursorColumn  = 0;\r
-  This->Mode->CursorRow     = 0;\r
-\r
-  EraseCursor (This);\r
-\r
-  gBS->RestoreTPL (OldTpl);\r
-\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutSetCursorPosition (\r
-  IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
-  IN  UINTN                         Column,\r
-  IN  UINTN                         Row\r
-  )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.SetCursorPosition().          \r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-        \r
-    Column - The row to set cursor to.\r
-        \r
-    Row - The column to set cursor to.                \r
-\r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-      The operation completed successfully.\r
-       \r
-    EFI_DEVICE_ERROR\r
-      The request fails due to Graphics Console device error.        \r
-    \r
-    EFI_UNSUPPORTED\r
-      The Graphics Console is not in a valid text mode, or the cursor position\r
-      is invalid for current mode.     \r
-                \r
---*/\r
-{\r
-  GRAPHICS_CONSOLE_DEV        *Private;\r
-  GRAPHICS_CONSOLE_MODE_DATA  *ModeData;\r
-  EFI_STATUS                  Status;\r
-  EFI_TPL                     OldTpl;\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
-\r
-  Private   = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
-  ModeData  = &(Private->ModeData[This->Mode->Mode]);\r
-\r
-  if ((Column >= ModeData->Columns) || (Row >= ModeData->Rows)) {\r
-    Status = EFI_UNSUPPORTED;\r
-    goto Done;\r
-  }\r
-\r
-  if (((INT32) Column == This->Mode->CursorColumn) && ((INT32) Row == This->Mode->CursorRow)) {\r
-    Status = EFI_SUCCESS;\r
-    goto Done;\r
-  }\r
-\r
-  EraseCursor (This);\r
-\r
-  This->Mode->CursorColumn  = (INT32) Column;\r
-  This->Mode->CursorRow     = (INT32) Row;\r
-\r
-  EraseCursor (This);\r
-\r
-Done:\r
-  gBS->RestoreTPL (OldTpl);\r
-\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutEnableCursor (\r
-  IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
-  IN  BOOLEAN                       Visible\r
-  )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.EnableCursor().\r
-    In this driver, the cursor cannot be hidden.        \r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-        \r
-    Visible - If TRUE, the cursor is set to be visible,\r
-              If FALSE, the cursor is set to be invisible.        \r
-\r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-      The request is valid.\r
-       \r
-    EFI_UNSUPPORTED\r
-      The Graphics Console does not support a hidden cursor.   \r
-                \r
---*/\r
-{\r
-  EFI_TPL               OldTpl;\r
-  \r
-  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
-    \r
-  EraseCursor (This);\r
-\r
-  This->Mode->CursorVisible = Visible;\r
-\r
-  EraseCursor (This);\r
-\r
-  gBS->RestoreTPL (OldTpl);\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-GetTextColors (\r
-  IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
-  OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Foreground,\r
-  OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Background\r
-  )\r
-{\r
-  INTN  Attribute;\r
-\r
-  Attribute   = This->Mode->Attribute & 0x7F;\r
-\r
-  *Foreground = mEfiColors[Attribute & 0x0f];\r
-  *Background = mEfiColors[Attribute >> 4];\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-DrawUnicodeWeightAtCursorN (\r
-  IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This,\r
-  IN  CHAR16                        *UnicodeWeight,\r
-  IN  UINTN                         Count\r
-  )\r
-{\r
-  GRAPHICS_CONSOLE_DEV  *Private;\r
-  EFI_STATUS            Status;\r
-  EFI_STATUS            ReturnStatus;\r
-  GLYPH_UNION           *Glyph;\r
-  GLYPH_UNION           GlyphData;\r
-  INTN                  GlyphX;\r
-  INTN                  GlyphY;\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput;\r
-  EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
-  UINTN                 Index;\r
-  UINTN                 ArrayIndex;\r
-  UINTN                 Counts;\r
-  UINT16                GlyphWidth;\r
-  UINT32                GlyphStatus;\r
-\r
-  Private       = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
-\r
-  ReturnStatus  = EFI_SUCCESS;\r
-  GlyphStatus   = 0;\r
-  GlyphWidth    = 0x08;\r
-\r
-  GetTextColors (This, &Foreground, &Background);\r
-\r
-  Index       = 0;\r
-  ArrayIndex  = 0;\r
-  while (Index < Count) {\r
-    if (This->Mode->Attribute & EFI_WIDE_ATTRIBUTE) {\r
-      GlyphStatus = WIDE_CHAR;\r
-    } else {\r
-      GlyphStatus = NARROW_CHAR;\r
-    }\r
-\r
-    Status = mHii->GetGlyph (\r
-                    mHii,\r
-                    UnicodeWeight,\r
-                    (UINT16 *) &Index,\r
-                    (UINT8 **) &Glyph,\r
-                    &GlyphWidth,\r
-                    &GlyphStatus\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      ReturnStatus = Status;\r
-    }\r
-\r
-    Counts = 0;\r
-\r
-    CopyMem (&GlyphData, Glyph, sizeof (GLYPH_UNION));\r
-\r
-    do {\r
-      //\r
-      // We are creating the second half of the wide character's BLT buffer\r
-      //\r
-      if (GlyphWidth == 0x10 && Counts == 1) {\r
-        CopyMem (&GlyphData.NarrowGlyph.GlyphCol1, &Glyph->WideGlyph.GlyphCol2, sizeof (Glyph->WideGlyph.GlyphCol2));\r
-      }\r
-\r
-      Counts++;\r
-\r
-      if (GlyphWidth == 0x10) {\r
-        mHii->GlyphToBlt (\r
-                mHii,\r
-                (UINT8 *) &GlyphData,\r
-                Foreground,\r
-                Background,\r
-                Count * 2,\r
-                GLYPH_WIDTH,\r
-                GLYPH_HEIGHT,\r
-                &Private->LineBuffer[ArrayIndex * GLYPH_WIDTH]\r
-                );\r
-      } else {\r
-        mHii->GlyphToBlt (\r
-                mHii,\r
-                (UINT8 *) &GlyphData,\r
-                Foreground,\r
-                Background,\r
-                Count,\r
-                GLYPH_WIDTH,\r
-                GLYPH_HEIGHT,\r
-                &Private->LineBuffer[ArrayIndex * GLYPH_WIDTH]\r
-                );\r
-      }\r
-\r
-      ArrayIndex++;\r
-\r
-    } while (Counts < 2 && GlyphWidth == 0x10);\r
-\r
-  }\r
-  //\r
-  // If we are printing Wide characters, treat the BLT as if it is twice as many characters\r
-  //\r
-  if (GlyphWidth == 0x10) {\r
-    Count = Count * 2;\r
-  }\r
-  //\r
-  // Blt a character to the screen\r
-  //\r
-  GlyphX  = This->Mode->CursorColumn * GLYPH_WIDTH;\r
-  GlyphY  = This->Mode->CursorRow * GLYPH_HEIGHT;\r
-  GraphicsOutput = Private->GraphicsOutput;\r
-  UgaDraw = Private->UgaDraw;\r
-  if (GraphicsOutput != NULL) {\r
-    GraphicsOutput->Blt (\r
-              GraphicsOutput,\r
-              Private->LineBuffer,\r
-              EfiBltBufferToVideo,\r
-              0,\r
-              0,\r
-              GlyphX + Private->ModeData[This->Mode->Mode].DeltaX,\r
-              GlyphY + Private->ModeData[This->Mode->Mode].DeltaY,\r
-              GLYPH_WIDTH * Count,\r
-              GLYPH_HEIGHT,\r
-              GLYPH_WIDTH * Count * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
-              );\r
-  } else {\r
-    UgaDraw->Blt (\r
-              UgaDraw,\r
-              (EFI_UGA_PIXEL *) (UINTN) Private->LineBuffer,\r
-              EfiUgaBltBufferToVideo,\r
-              0,\r
-              0,\r
-              GlyphX + Private->ModeData[This->Mode->Mode].DeltaX,\r
-              GlyphY + Private->ModeData[This->Mode->Mode].DeltaY,\r
-              GLYPH_WIDTH * Count,\r
-              GLYPH_HEIGHT,\r
-              GLYPH_WIDTH * Count * sizeof (EFI_UGA_PIXEL)\r
-              );\r
-  }\r
-\r
-  return ReturnStatus;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EraseCursor (\r
-  IN  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *This\r
-  )\r
-{\r
-  GRAPHICS_CONSOLE_DEV        *Private;\r
-  EFI_SIMPLE_TEXT_OUTPUT_MODE *CurrentMode;\r
-  INTN                        GlyphX;\r
-  INTN                        GlyphY;\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL        *GraphicsOutput;\r
-  EFI_UGA_DRAW_PROTOCOL       *UgaDraw;\r
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Foreground;\r
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Background;\r
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION BltChar[GLYPH_HEIGHT][GLYPH_WIDTH];\r
-  UINTN                       X;\r
-  UINTN                       Y;\r
-\r
-  CurrentMode = This->Mode;\r
-\r
-  if (!CurrentMode->CursorVisible) {\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
-  GraphicsOutput = Private->GraphicsOutput;\r
-  UgaDraw = Private->UgaDraw;\r
-\r
-  //\r
-  // BUGBUG - we need to think about what to do with wide and narrow character deletions.\r
-  //\r
-  //\r
-  // Blt a character to the screen\r
-  //\r
-  GlyphX  = (CurrentMode->CursorColumn * GLYPH_WIDTH) + Private->ModeData[CurrentMode->Mode].DeltaX;\r
-  GlyphY  = (CurrentMode->CursorRow * GLYPH_HEIGHT) + Private->ModeData[CurrentMode->Mode].DeltaY;\r
-  if (GraphicsOutput != NULL) {\r
-    GraphicsOutput->Blt (\r
-              GraphicsOutput,\r
-              (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) BltChar,\r
-              EfiBltVideoToBltBuffer,\r
-              GlyphX,\r
-              GlyphY,\r
-              0,\r
-              0,\r
-              GLYPH_WIDTH,\r
-              GLYPH_HEIGHT,\r
-              GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
-              );\r
-  } else {\r
-    UgaDraw->Blt (\r
-              UgaDraw,\r
-              (EFI_UGA_PIXEL *) (UINTN) BltChar,\r
-              EfiUgaVideoToBltBuffer,\r
-              GlyphX,\r
-              GlyphY,\r
-              0,\r
-              0,\r
-              GLYPH_WIDTH,\r
-              GLYPH_HEIGHT,\r
-              GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
-              );\r
-  }\r
-\r
-  GetTextColors (This, &Foreground.Pixel, &Background.Pixel);\r
-\r
-  //\r
-  // Convert Monochrome bitmap of the Glyph to BltBuffer structure\r
-  //\r
-  for (Y = 0; Y < GLYPH_HEIGHT; Y++) {\r
-    for (X = 0; X < GLYPH_WIDTH; X++) {\r
-      if ((mCursorGlyph.GlyphCol1[Y] & (1 << X)) != 0) {\r
-        BltChar[Y][GLYPH_WIDTH - X - 1].Raw ^= Foreground.Raw;\r
-      }\r
-    }\r
-  }\r
-\r
-  if (GraphicsOutput != NULL) {\r
-    GraphicsOutput->Blt (\r
-              GraphicsOutput,\r
-              (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) BltChar,\r
-              EfiBltBufferToVideo,\r
-              0,\r
-              0,\r
-              GlyphX,\r
-              GlyphY,\r
-              GLYPH_WIDTH,\r
-              GLYPH_HEIGHT,\r
-              GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
-              );\r
-  } else {\r
-    UgaDraw->Blt (\r
-              UgaDraw,\r
-              (EFI_UGA_PIXEL *) (UINTN) BltChar,\r
-              EfiUgaBltBufferToVideo,\r
-              0,\r
-              0,\r
-              GlyphX,\r
-              GlyphY,\r
-              GLYPH_WIDTH,\r
-              GLYPH_HEIGHT,\r
-              GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
-              );\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r