201 lines
7.7 KiB
C
201 lines
7.7 KiB
C
/** @file
|
|
|
|
;******************************************************************************
|
|
;* Copyright (c) 2012 - 2020, Insyde Software Corporation. All Rights Reserved.
|
|
;*
|
|
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
|
|
;* transmit, broadcast, present, recite, release, license or otherwise exploit
|
|
;* any part of this publication in any form, by any means, without the prior
|
|
;* written permission of Insyde Software Corporation.
|
|
;*
|
|
;******************************************************************************
|
|
*/
|
|
#include "UiRender.h"
|
|
#include "UiControls.h"
|
|
#include "UiManager.h"
|
|
#include <InternalFormRepresentation.h>
|
|
#include <Library/HiiDbLib.h>
|
|
#include <Library/HiiStringLib.h>
|
|
#include <Library/HiiConfigAccessLib.h>
|
|
#include <Library/UefiHiiServicesLib.h>
|
|
#include <Library/BitBltLib.h>
|
|
#include <Library/LayoutLib.h>
|
|
|
|
EFI_HII_HANDLE mImageHiiHandle = NULL;
|
|
|
|
typedef struct {
|
|
CHAR16 *Name;
|
|
EFI_IMAGE_ID ImageId;
|
|
EFI_IMAGE_INPUT *ImageIn; ///< Cache Image Input data
|
|
} IMAGE_RESOURCE;
|
|
|
|
IMAGE_RESOURCE mImageResource[] = {
|
|
{L"FormHalo", IMAGE_TOKEN (IMAGE_FORM_HALO ), NULL},
|
|
{L"MenuBackgroundNormal", IMAGE_TOKEN (IMAGE_MENU_BACKGROUND_NORMAL ), NULL},
|
|
{L"MenuBackgroundHot", IMAGE_TOKEN (IMAGE_MENU_BACKGROUND_HOT ), NULL},
|
|
{L"HotkeyShowHelp", IMAGE_TOKEN (IMAGE_HOTKEY_SHOW_HELP ), NULL},
|
|
{L"HotkeySelectItemUp", IMAGE_TOKEN (IMAGE_HOTKEY_SELECT_ITEM_UP ), NULL},
|
|
{L"HotkeySelectItemDown", IMAGE_TOKEN (IMAGE_HOTKEY_SELECT_ITEM_DOWN ), NULL},
|
|
{L"HotkeySelectMenuUp", IMAGE_TOKEN (IMAGE_HOTKEY_SELECT_MENU_UP ), NULL},
|
|
{L"HotkeySelectMenuDown", IMAGE_TOKEN (IMAGE_HOTKEY_SELECT_MENU_DOWN ), NULL},
|
|
{L"HotKeyModifyValueUp", IMAGE_TOKEN (IMAGE_HOTKEY_MODIFY_VALUE_UP ), NULL},
|
|
{L"HotKeyModifyValueDown", IMAGE_TOKEN (IMAGE_HOTKEY_MODIFY_VALUE_DOWN), NULL},
|
|
{L"HotKeyLoadDefault", IMAGE_TOKEN (IMAGE_HOTKEY_LOAD_DEFAULT ), NULL},
|
|
{L"HotKeySaveAndExit", IMAGE_TOKEN (IMAGE_HOTKEY_SAVE_AND_EXIT ), NULL},
|
|
{L"HotkeyEnter", IMAGE_TOKEN (IMAGE_HOTKEY_ENTER ), NULL},
|
|
{L"HotKeyDiscardExit", IMAGE_TOKEN (IMAGE_HOTKEY_DISCARD_EXIT ), NULL},
|
|
{L"OwnerDrawInsyde", IMAGE_TOKEN (IMAGE_OWNER_DRAW_INSYDE ), NULL},
|
|
{L"OwnerDrawInsydeH2O", IMAGE_TOKEN (IMAGE_OWNER_DRAW_INSYDE_H2O ), NULL},
|
|
{L"OwnerDrawSeparator", IMAGE_TOKEN (IMAGE_OWNER_DRAW_SEPARATOR ), NULL},
|
|
{L"OwnerDrawTemperature", IMAGE_TOKEN (IMAGE_OWNER_DRAW_TEMPERATURE ), NULL},
|
|
{L"OwnerDrawTime", IMAGE_TOKEN (IMAGE_OWNER_DRAW_TIME ), NULL},
|
|
{L"DialogSeparator", IMAGE_TOKEN (IMAGE_DIALOG_SEPARATOR ), NULL},
|
|
{L"DialogButtonDown", IMAGE_TOKEN (IMAGE_DIALOG_BUTTON_DOWN ), NULL},
|
|
{L"DialogButtonUp", IMAGE_TOKEN (IMAGE_DIALOG_BUTTON_UP ), NULL},
|
|
{L"DialogSelectedIcon", IMAGE_TOKEN (IMAGE_DIALOG_SELECTED_ICON ), NULL},
|
|
{L"DialogSortIcon", IMAGE_TOKEN (IMAGE_DIALOG_SORT_ICON ), NULL},
|
|
{L"ScrollbarThumb", IMAGE_TOKEN (IMAGE_SCROLLBAR_THUMB ), NULL},
|
|
{L"ScrollbarBackground", IMAGE_TOKEN (IMAGE_SCROLLBAR_BACKGROUND ), NULL},
|
|
{L"SetupMenuTextOpBkg", IMAGE_TOKEN (IMAGE_SETUP_MENU_TEXT_OP_BKG ), NULL},
|
|
{L"FormTitleBkg", IMAGE_TOKEN (IMAGE_FORM_TITLE_BKG ), NULL},
|
|
{L"OptionBkg", IMAGE_TOKEN (IMAGE_OPTION_BKG ), NULL},
|
|
{L"OwnerDrawBkg", IMAGE_TOKEN (IMAGE_OWNER_DRAW_BKG ), NULL},
|
|
{L"CheckBoxBkg", IMAGE_TOKEN (IMAGE_CHECK_BOX_BKG ), NULL},
|
|
{L"CheckBoxBorder", IMAGE_TOKEN (IMAGE_CHECK_BOX_BORDER ), NULL},
|
|
{L"CheckBoxButton", IMAGE_TOKEN (IMAGE_CHECK_BOX_BUTTON ), NULL},
|
|
#if FixedPcdGet32(PcdH2OLmdeMultiLayout) == 1
|
|
{L"SpTriangle", IMAGE_TOKEN (IMAGE_SP_TRIANGLE ), NULL},
|
|
{L"Bkg", IMAGE_TOKEN (IMAGE_BKG ), NULL},
|
|
{L"DialogBkg", IMAGE_TOKEN (IMAGE_DIALOG_BKG ), NULL},
|
|
{L"FtBorder", IMAGE_TOKEN (IMAGE_FT_BORDER ), NULL},
|
|
{L"HtBorder", IMAGE_TOKEN (IMAGE_HT_BORDER ), NULL},
|
|
{L"HtSepartor", IMAGE_TOKEN (IMAGE_HT_SEPARATOR ), NULL},
|
|
{L"SmBorder", IMAGE_TOKEN (IMAGE_SM_BORDER ), NULL},
|
|
{L"SpSelectedBkg", IMAGE_TOKEN (IMAGE_SP_SELECTED_BKG ), NULL},
|
|
{L"SpTriangle", IMAGE_TOKEN (IMAGE_SP_TRIANGLE ), NULL},
|
|
#endif
|
|
{NULL, 0, NULL}
|
|
};
|
|
|
|
EFI_IMAGE_INPUT *
|
|
GetImageByString (
|
|
CHAR16 *Name
|
|
)
|
|
{
|
|
UINTN Index;
|
|
EFI_STATUS Status;
|
|
EFI_IMAGE_INPUT *ImagePtr;
|
|
|
|
ImagePtr = NULL;
|
|
if (Name[0] == '@') {
|
|
Name++;
|
|
for (Index = 0; mImageResource[Index].Name != NULL; Index++) {
|
|
if (StrCmp (mImageResource[Index].Name, Name) == 0) {
|
|
break;
|
|
}
|
|
}
|
|
ASSERT (mImageResource[Index].Name != NULL);
|
|
if (mImageResource[Index].Name == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
if (mImageResource[Index].ImageIn != NULL) {
|
|
ImagePtr = mImageResource[Index].ImageIn;
|
|
} else {
|
|
ImagePtr = AllocateZeroPool (sizeof (EFI_IMAGE_INPUT));
|
|
Status = gHiiImage->GetImage (
|
|
gHiiImage,
|
|
mImageHiiHandle,
|
|
mImageResource[Index].ImageId,
|
|
ImagePtr
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
if (EFI_ERROR (Status)){
|
|
FreePool (ImagePtr);
|
|
return NULL;
|
|
}
|
|
mImageResource[Index].ImageIn = ImagePtr;
|
|
}
|
|
} else {
|
|
ImagePtr = (EFI_IMAGE_INPUT *)(UINTN) StrToUInt (Name, 16, &Status);
|
|
ASSERT_EFI_ERROR (Status);
|
|
ASSERT (ImagePtr != NULL);
|
|
}
|
|
|
|
if (ImagePtr != NULL) {
|
|
//
|
|
// We only convert transparent image once.
|
|
//
|
|
if ((ImagePtr->Flags & EFI_IMAGE_TRANSPARENT) == EFI_IMAGE_TRANSPARENT) {
|
|
ConvertToAlphaChannelImage (ImagePtr);
|
|
ImagePtr->Flags &= ~EFI_IMAGE_TRANSPARENT;
|
|
}
|
|
}
|
|
|
|
return ImagePtr;
|
|
|
|
}
|
|
|
|
typedef struct {
|
|
EFI_IMAGE_ID ImageId;
|
|
EFI_IMAGE_INPUT *Image; ///< Cache Image Input data
|
|
} H2O_VFCF_IMAGE_INFO;
|
|
|
|
H2O_VFCF_IMAGE_INFO *mH2OVfcfImageList;
|
|
UINTN mH2OVfcfImageCount;
|
|
|
|
EFI_IMAGE_INPUT *
|
|
GetVfcfImage (
|
|
IN EFI_IMAGE_ID ImageId
|
|
)
|
|
{
|
|
UINTN Index;
|
|
EFI_IMAGE_INPUT *Image;
|
|
VOID *Buffer;
|
|
EFI_STATUS Status;
|
|
|
|
for (Index = 0; Index < mH2OVfcfImageCount; Index++) {
|
|
if (mH2OVfcfImageList[Index].ImageId == ImageId) {
|
|
return mH2OVfcfImageList[Index].Image;
|
|
}
|
|
}
|
|
|
|
Image = AllocateZeroPool (sizeof(EFI_IMAGE_INPUT));
|
|
if (Image == NULL) {
|
|
return NULL;
|
|
}
|
|
Status = GetImageById (ImageId, Image);
|
|
if (EFI_ERROR (Status)) {
|
|
FreePool (Image);
|
|
return NULL;
|
|
}
|
|
|
|
Buffer = ReallocatePool (
|
|
sizeof(H2O_VFCF_IMAGE_INFO) * (mH2OVfcfImageCount),
|
|
sizeof(H2O_VFCF_IMAGE_INFO) * (mH2OVfcfImageCount + 1),
|
|
mH2OVfcfImageList
|
|
);
|
|
if (Buffer == NULL) {
|
|
FreePool (Image->Bitmap);
|
|
FreePool (Image);
|
|
return NULL;
|
|
}
|
|
|
|
mH2OVfcfImageList = Buffer;
|
|
mH2OVfcfImageList[mH2OVfcfImageCount].Image = Image;
|
|
mH2OVfcfImageList[mH2OVfcfImageCount].ImageId = ImageId;
|
|
mH2OVfcfImageCount++;
|
|
return Image;
|
|
}
|
|
|
|
VOID
|
|
AddHiiImagePackage (
|
|
VOID
|
|
)
|
|
{
|
|
if (mImageHiiHandle == NULL) {
|
|
mImageHiiHandle = HiiAddPackages (&gEfiCallerIdGuid, NULL, IMAGE_ARRAY_NAME, NULL);
|
|
ASSERT (mImageHiiHandle != NULL);
|
|
}
|
|
}
|