]> code.delx.au - refind/blobdiff - libeg/screen.c
Misc. bug fixes & minor code improvements
[refind] / libeg / screen.c
index d2d12db4fc4f20eedb075223e4d7310e48674bc8..e4f585afae7ad23c30166b906b39e70244ad398b 100644 (file)
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
+/*
+ * Modifications copyright (c) 2012 Roderick W. Smith
+ *
+ * Modifications distributed under the terms of the GNU General Public
+ * License (GPL) version 3 (GPLv3), a copy of which must be distributed
+ * with this source code or binaries made from it.
+ *
+ */
 
 #include "libegint.h"
 #include "../refind/screen.h"
@@ -120,28 +128,41 @@ BOOLEAN egSetScreenSize(IN OUT UINTN *ScreenWidth, IN OUT UINTN *ScreenHeight) {
 
    if (GraphicsOutput != NULL) { // GOP mode (UEFI)
       if (*ScreenHeight == 0) { // User specified a mode number (stored in *ScreenWidth); use it directly
-         ModeNum = (UINT32) *ScreenWidth;
-         Status = refit_call4_wrapper(GraphicsOutput->QueryMode, GraphicsOutput, ModeNum, &Size, &Info);
-         if (Status == EFI_SUCCESS) {
-            Status = refit_call2_wrapper(GraphicsOutput->SetMode, GraphicsOutput, ModeNum);
-            if (Status == EFI_SUCCESS) {
-               ModeSet = TRUE;
-               *ScreenWidth = Info->HorizontalResolution;
-               *ScreenHeight = Info->VerticalResolution;
-            }
-         }
-      } else { // User specified width & height; must find mode
-         // Do a loop through the modes to see if the specified one is available;
-         // and if so, switch to it....
-         while ((Status == EFI_SUCCESS) && (!ModeSet)) {
+         if (*ScreenWidth == GraphicsOutput->Mode->Mode) { // user requested current mode; do nothing
+            ModeSet = TRUE;
+            *ScreenWidth = Info->HorizontalResolution;
+            *ScreenHeight = Info->VerticalResolution;
+         } else {
+            ModeNum = (UINT32) *ScreenWidth;
             Status = refit_call4_wrapper(GraphicsOutput->QueryMode, GraphicsOutput, ModeNum, &Size, &Info);
-            if ((Status == EFI_SUCCESS) && (Size >= sizeof(*Info)) &&
-                (Info->HorizontalResolution == *ScreenWidth) && (Info->VerticalResolution == *ScreenHeight)) {
+            if (Status == EFI_SUCCESS) {
                Status = refit_call2_wrapper(GraphicsOutput->SetMode, GraphicsOutput, ModeNum);
-               ModeSet = (Status == EFI_SUCCESS);
-            } // if
-            ModeNum++;
-         } // while()
+               if (Status == EFI_SUCCESS) {
+                  ModeSet = TRUE;
+                  *ScreenWidth = Info->HorizontalResolution;
+                  *ScreenHeight = Info->VerticalResolution;
+               } // if set mode OK
+            } // if queried mode OK
+         } // if/else
+
+      // User specified width & height; must find mode -- but only if change is required....
+      } else {
+         Status = refit_call4_wrapper(GraphicsOutput->QueryMode, GraphicsOutput, GraphicsOutput->Mode->Mode, &Size, &Info);
+         if ((Status == EFI_SUCCESS) && (Info->HorizontalResolution == *ScreenWidth) &&
+             (Info->VerticalResolution == *ScreenHeight)) {
+            ModeSet = TRUE; // user requested current mode; do nothing
+         } else {
+            // Do a loop through the modes to see if the specified one is available;
+            // and if so, switch to it....
+            do {
+               Status = refit_call4_wrapper(GraphicsOutput->QueryMode, GraphicsOutput, ModeNum, &Size, &Info);
+               if ((Status == EFI_SUCCESS) && (Size >= sizeof(*Info)) &&
+                   (Info->HorizontalResolution == *ScreenWidth) && (Info->VerticalResolution == *ScreenHeight)) {
+                  Status = refit_call2_wrapper(GraphicsOutput->SetMode, GraphicsOutput, ModeNum);
+                  ModeSet = (Status == EFI_SUCCESS);
+               } // if
+            } while ((++ModeNum < GraphicsOutput->Mode->MaxMode) && !ModeSet);
+         } // if/else
       } // if/else
 
       if (ModeSet) {
@@ -156,18 +177,11 @@ BOOLEAN egSetScreenSize(IN OUT UINTN *ScreenWidth, IN OUT UINTN *ScreenHeight) {
             if ((Status == EFI_SUCCESS) && (Info != NULL)) {
                Print(L"Mode %d: %d x %d\n", ModeNum, Info->HorizontalResolution, Info->VerticalResolution);
             } // else
-         } while ((ModeNum++ < 10) || (Status == EFI_SUCCESS));
-//          Status = EFI_SUCCESS;
-//          while (Status == EFI_SUCCESS) {
-//             Status = refit_call4_wrapper(GraphicsOutput->QueryMode, GraphicsOutput, ModeNum, &Size, &Info);
-//             if ((Status == EFI_SUCCESS) && (Size >= sizeof(*Info))) {
-//                Print(L"Mode %d: %d x %d\n", ModeNum, Info->HorizontalResolution, Info->VerticalResolution);
-//             } // else
-//             ModeNum++;
-//          } // while()
+         } while (++ModeNum < GraphicsOutput->Mode->MaxMode);
          PauseForKey();
          SwitchToGraphics();
       } // if()
+
    } else if (UgaDraw != NULL) { // UGA mode (EFI 1.x)
       // Try to use current color depth & refresh rate for new mode. Maybe not the best choice
       // in all cases, but I don't know how to probe for alternatives....
@@ -203,6 +217,7 @@ UINT32 egSetTextMode(UINT32 RequestedMode) {
    EFI_STATUS    Status;
 
    if (RequestedMode != ST->ConOut->Mode->Mode) {
+      SwitchToGraphics();
       Status = refit_call2_wrapper(ST->ConOut->SetMode, ST->ConOut, RequestedMode);
       if (Status == EFI_SUCCESS) {
          UsedMode = RequestedMode;
@@ -212,8 +227,8 @@ UINT32 egSetTextMode(UINT32 RequestedMode) {
          do {
             Status = refit_call4_wrapper(ST->ConOut->QueryMode, ST->ConOut, i, &Width, &Height);
             if (Status == EFI_SUCCESS)
-               Print(L"Mode: %d: %d x %d\n", i, Width, Height);
-         } while ((i++ < 2) || (Status == EFI_SUCCESS));
+               Print(L"Mode %d: %d x %d\n", i, Width, Height);
+         } while (++i < ST->ConOut->Mode->MaxMode);
 
          PauseForKey();
          SwitchToGraphics();
@@ -296,9 +311,15 @@ VOID egClearScreen(IN EG_PIXEL *Color)
     if (!egHasGraphics)
         return;
 
-    FillColor.Red   = Color->r;
-    FillColor.Green = Color->g;
-    FillColor.Blue  = Color->b;
+    if (Color != NULL) {
+       FillColor.Red   = Color->r;
+       FillColor.Green = Color->g;
+       FillColor.Blue  = Color->b;
+    } else {
+       FillColor.Red   = 0x0;
+       FillColor.Green = 0x0;
+       FillColor.Blue  = 0x0;
+    }
     FillColor.Reserved = 0;
 
     if (GraphicsOutput != NULL) {
@@ -306,10 +327,9 @@ VOID egClearScreen(IN EG_PIXEL *Color)
         // layout, and the header from TianoCore actually defines them
         // to be the same type.
         refit_call10_wrapper(GraphicsOutput->Blt, GraphicsOutput, (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)&FillColor, EfiBltVideoFill,
-                            0, 0, 0, 0, egScreenWidth, egScreenHeight, 0);
+                             0, 0, 0, 0, egScreenWidth, egScreenHeight, 0);
     } else if (UgaDraw != NULL) {
-        refit_call10_wrapper(UgaDraw->Blt, UgaDraw, &FillColor, EfiUgaVideoFill,
-                     0, 0, 0, 0, egScreenWidth, egScreenHeight, 0);
+        refit_call10_wrapper(UgaDraw->Blt, UgaDraw, &FillColor, EfiUgaVideoFill, 0, 0, 0, 0, egScreenWidth, egScreenHeight, 0);
     }
 }