X-Git-Url: https://code.delx.au/refind/blobdiff_plain/99a75c0d391580161f651db61bb43afb46f4e5cd..a3dd82017d0be4d3fdca46a722b41b5ff3777139:/refind/screen.c diff --git a/refind/screen.c b/refind/screen.c index b24e6f5..7ee1a18 100644 --- a/refind/screen.c +++ b/refind/screen.c @@ -47,6 +47,7 @@ #include "config.h" #include "libegint.h" #include "lib.h" +#include "menu.h" #include "../include/refit_call_wrapper.h" #include "../include/egemb_refind_banner.h" @@ -122,6 +123,7 @@ VOID InitScreen(VOID) DrawScreenHeader(L"Initializing..."); } +// Set the screen resolution and mode (text vs. graphics). VOID SetupScreen(VOID) { UINTN NewWidth, NewHeight; @@ -153,7 +155,7 @@ VOID SetupScreen(VOID) } if (GlobalConfig.RequestedScreenWidth > 0) { - egSetScreenSize(&GlobalConfig.RequestedScreenWidth, &GlobalConfig.RequestedScreenHeight); + egSetScreenSize(&(GlobalConfig.RequestedScreenWidth), &(GlobalConfig.RequestedScreenHeight)); egGetScreenSize(&UGAWidth, &UGAHeight); } // if user requested a particular screen resolution @@ -172,7 +174,7 @@ VOID SetupScreen(VOID) VOID SwitchToText(IN BOOLEAN CursorEnabled) { - egSetGraphicsModeEnabled(FALSE); + egSetGraphicsModeEnabled(FALSE); refit_call2_wrapper(ST->ConOut->EnableCursor, ST->ConOut, CursorEnabled); // get size of text console if (refit_call4_wrapper(ST->ConOut->QueryMode, ST->ConOut, ST->ConOut->Mode->Mode, &ConWidth, &ConHeight) != EFI_SUCCESS) { @@ -433,24 +435,40 @@ VOID SwitchToGraphicsAndClear(VOID) VOID BltClearScreen(IN BOOLEAN ShowBanner) { - static EG_IMAGE *Banner = NULL; + static EG_IMAGE *Banner = NULL, *CroppedBanner; + INTN BannerPosX, BannerPosY; if (ShowBanner && !(GlobalConfig.HideUIFlags & HIDEUI_FLAG_BANNER)) { // load banner on first call if (Banner == NULL) { - if (GlobalConfig.BannerFileName == NULL) + if (GlobalConfig.BannerFileName == NULL) { Banner = egPrepareEmbeddedImage(&egemb_refind_banner, FALSE); - else + } else { Banner = egLoadImage(SelfDir, GlobalConfig.BannerFileName, FALSE); + if (Banner && ((Banner->Width > UGAWidth) || (Banner->Height > UGAHeight))) { + CroppedBanner = egCropImage(Banner, 0, 0, (Banner->Width > UGAWidth) ? UGAWidth : Banner->Width, + (Banner->Height > UGAHeight) ? UGAHeight : Banner->Height); + MyFreePool(Banner); + Banner = CroppedBanner; + } // if image too big + if (Banner == NULL) { + Banner = egPrepareEmbeddedImage(&egemb_refind_banner, FALSE); + } // if unusable image + } if (Banner != NULL) - MenuBackgroundPixel = Banner->PixelData[0]; + MenuBackgroundPixel = Banner->PixelData[0]; } // clear and draw banner egClearScreen(&MenuBackgroundPixel); - if (Banner != NULL) - BltImage(Banner, (UGAWidth - Banner->Width) >> 1, - ((UGAHeight - LAYOUT_TOTAL_HEIGHT) >> 1) + LAYOUT_BANNER_HEIGHT - Banner->Height); + if (Banner != NULL) { + BannerPosX = (Banner->Width < UGAWidth) ? ((UGAWidth - Banner->Width) / 2) : 0; + BannerPosY = (ComputeRow0PosX() / 2) - Banner->Height; + if (BannerPosY < 0) + BannerPosY = 0; + GlobalConfig.BannerBottomEdge = BannerPosY + Banner->Height; + BltImage(Banner, (UINTN) BannerPosX, (UINTN) BannerPosY); + } } else { // clear to standard background color @@ -458,6 +476,8 @@ VOID BltClearScreen(IN BOOLEAN ShowBanner) } GraphicsScreenDirty = FALSE; + egFreeImage(GlobalConfig.ScreenBackground); + GlobalConfig.ScreenBackground = egCopyScreen(); } VOID BltImage(IN EG_IMAGE *Image, IN UINTN XPos, IN UINTN YPos) @@ -540,7 +560,10 @@ VOID BltImageCompositeBadge(IN EG_IMAGE *BaseImage, IN EG_IMAGE *TopImage, IN EG } // blit to screen and clean up - egDrawImage(CompImage, XPos, YPos); + if (CompImage->HasAlpha) + egDrawImageWithTransparency(CompImage, NULL, XPos, YPos, CompImage->Width, CompImage->Height); + else + egDrawImage(CompImage, XPos, YPos); egFreeImage(CompImage); GraphicsScreenDirty = TRUE; }