X-Git-Url: https://code.delx.au/refind/blobdiff_plain/1ac23c87bf4bc008690a801516c48c8bc6c3426d..ec097428f9fb581bb0842bb840b5713e176dd0f4:/libeg/screen.c diff --git a/libeg/screen.c b/libeg/screen.c index 2228959..bac1f00 100644 --- a/libeg/screen.c +++ b/libeg/screen.c @@ -33,6 +33,14 @@ * (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,36 +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.... - do { + 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 - } while (((ModeNum++ < 10) || (Status == EFI_SUCCESS)) && !ModeSet); -// while ((Status == EFI_SUCCESS) && (!ModeSet)) { -// 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 -// 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) { @@ -164,15 +177,7 @@ 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() @@ -221,8 +226,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();