alder_lake_bios/Insyde/InsydeSetupPkg/Library/LayoutSupportLib/Image.c

251 lines
7.0 KiB
C

/** @file
;******************************************************************************
;* Copyright (c) 2013 - 2018, Insyde Software Corp. 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 "LayoutSupportLib.h"
EFI_STATUS
BltCopy(
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt,
IN UINTN BltStartX,
IN UINTN BltStartY,
IN UINTN BltWidth,
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *DestBlt,
IN UINTN DestStartX,
IN UINTN DestStartY,
IN UINTN DestWidth,
IN UINTN DestHeight,
IN UINTN CopyWidth,
IN UINTN CopyHeight
)
{
UINT32 *BltPtr;
UINT32 *DestBltPtr;
UINTN X;
UINTN Y;
if (Blt == NULL || DestBlt == NULL) {
return EFI_INVALID_PARAMETER;
}
if (BltWidth == 0 || DestWidth == 0) {
return EFI_INVALID_PARAMETER;
}
if (CopyHeight == 0 || CopyWidth == 0) {
return EFI_INVALID_PARAMETER;
}
//
// Check CopyWidth and CopyHeight
//
CopyWidth = MIN (CopyWidth, DestWidth - DestStartX);
CopyHeight = MIN (CopyHeight, DestHeight - DestStartY);
for (Y = 0; Y < CopyHeight; Y ++) {
DestBltPtr = (UINT32 *)(&DestBlt[(Y + DestStartY) * DestWidth + DestStartX]);
BltPtr = (UINT32 *)(&Blt[(Y + BltStartY) * BltWidth + BltStartX]);
for (X = 0; X < CopyWidth; X ++) {
*DestBltPtr = *BltPtr;
DestBltPtr ++;
BltPtr ++;
}
};
return EFI_SUCCESS;
}
EFI_STATUS
BltCombine(
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL **DestBlt,
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BgBlt,
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *FgBlt,
IN UINTN BltWidth,
IN UINTN BltHeight
)
{
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *ResultBlt;
UINT32 *DestBltPtr;
UINT32 *BgBltPtr;
UINT32 *FgBltPtr;
UINTN X;
UINTN Y;
if (DestBlt == NULL || BgBlt == NULL || FgBlt == NULL) {
return EFI_INVALID_PARAMETER;
}
if (BltWidth == 0 || BltHeight == 0) {
return EFI_INVALID_PARAMETER;
}
ResultBlt = AllocateZeroPool (sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * BltWidth * BltHeight);
if (ResultBlt == NULL) {
return EFI_OUT_OF_RESOURCES;
}
for (Y = 0; Y < BltHeight; Y ++) {
DestBltPtr = (UINT32 *)(&ResultBlt[Y * BltWidth]);
BgBltPtr = (UINT32 *)(&BgBlt[Y * BltWidth]);
FgBltPtr = (UINT32 *)(&FgBlt[Y * BltWidth]);
for (X = 0; X < BltWidth; X ++) {
*DestBltPtr = *BgBltPtr;
if (*FgBltPtr != 0) {
*DestBltPtr = *FgBltPtr;
}
DestBltPtr ++;
BgBltPtr ++;
FgBltPtr ++;
}
};
if (*DestBlt != NULL) {
SafeFreePool ((VOID **) DestBlt);
}
*DestBlt = ResultBlt;
return EFI_SUCCESS;
}
EFI_STATUS
BltTransparent(
IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL **DestBlt,
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *SrcBlt,
IN UINTN BltWidth,
IN UINTN BltHeight
)
{
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *ResultBlt;
UINT32 *DestBltPtr;
UINT32 *SrcBltPtr;
UINTN X;
UINTN Y;
if (DestBlt == NULL || SrcBlt == NULL) {
return EFI_INVALID_PARAMETER;
}
if (BltWidth == 0 || BltHeight == 0) {
return EFI_INVALID_PARAMETER;
}
ResultBlt = AllocateZeroPool (sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * BltWidth * BltHeight);
if (ResultBlt == NULL) {
return EFI_OUT_OF_RESOURCES;
}
for (Y = 0; Y < BltHeight; Y ++) {
DestBltPtr = (UINT32 *)(ResultBlt + Y * BltWidth);
SrcBltPtr = (UINT32 *)(SrcBlt + Y * BltWidth);
for (X = 0; X < BltWidth; X ++) {
if (*SrcBltPtr == 0) {
*DestBltPtr = 1;
} else if ((*SrcBltPtr &= 0xffffff) == 0xffffff) {
*DestBltPtr = 0;
} else {
*DestBltPtr = *SrcBltPtr;
}
DestBltPtr ++;
SrcBltPtr ++;
}
};
if (*DestBlt != NULL) {
SafeFreePool ((VOID **) DestBlt);
}
*DestBlt = ResultBlt;
return EFI_SUCCESS;
}
EFI_STATUS
CreateImageByColor (
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Rgb,
IN RECT *Field,
IN OUT EFI_IMAGE_INPUT *ImageInput
)
{
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Bitmap;
UINT32 Width;
UINT32 Height;
UINT32 BitmapSize;
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltPtr;
UINT32 X;
UINT32 Y;
Width = (UINT16)(Field->right - Field->left);
Height = (UINT16)(Field->bottom - Field->top);
BitmapSize = sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * Width * Height;
Bitmap = AllocateZeroPool (BitmapSize);
if (Bitmap == NULL) {
return EFI_OUT_OF_RESOURCES;
}
for (Y = 0; Y < Height; Y++) {
BltPtr = &Bitmap[Y * Width];
for (X = 0; X < Width; X++) {
CopyMem (BltPtr, Rgb, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));
BltPtr ++;
}
}
ImageInput->Width = (UINT16)Width;
ImageInput->Height = (UINT16)Height;
ImageInput->Bitmap = Bitmap;
return EFI_SUCCESS;
}
EFI_STATUS
GetImageById (
IN UINT32 ImageId,
OUT EFI_IMAGE_INPUT *ImageInput
)
{
EFI_STATUS Status;
EFI_HII_HANDLE HiiHandle;
LAYOUT_DATABASE_PROTOCOL *LayoutDatabase;
EFI_HII_IMAGE_PROTOCOL *HiiImage;
if (ImageId == 0 || ImageInput == NULL) {
return EFI_INVALID_PARAMETER;
}
Status = gBS->LocateProtocol (&gEfiHiiImageProtocolGuid, NULL, (VOID **) &HiiImage);
if (EFI_ERROR (Status)) {
return Status;
}
Status = gBS->LocateProtocol (&gLayoutDatabaseProtocolGuid, NULL, (VOID **) &LayoutDatabase);
if (EFI_ERROR (Status)) {
return Status;
}
HiiHandle = LayoutDatabase->ImagePkgHiiHandle;
ZeroMem (ImageInput, sizeof (EFI_IMAGE_INPUT));
Status = HiiImage->GetImage (
HiiImage,
HiiHandle,
(EFI_IMAGE_ID) ImageId,
ImageInput
);
if (EFI_ERROR (Status)) {
return Status;
}
return EFI_SUCCESS;
}