alder_lake_bios/Insyde/InsydeModulePkg/Library/BitBltLib/BitBltLib.c

102 lines
2.8 KiB
C

/** @file
Provides bit BLT (Block Transfer) related functions.
;******************************************************************************
;* Copyright (c) 2013 - 2019, 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 <Library/BitBltLib.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
/**
Convert image to H2O_IMAGE_ALPHA_CHANNEL image format.
if input image is H2O_IMAGE_ALPHA_CHANNEL image format, return EFI_SUCCESS directly.
@param[in] *Image Pointer to EFI_IMAGE_INPUT instance.
@retval EFI_SUCCESS Convert to H2O_IMAGE_ALPHA_CHANNEL image format successfully.
@retval EFI_INVALID_PARAMETER Image is NULL or Image->Bitmap is NULL.
**/
EFI_STATUS
ConvertToAlphaChannelImage (
IN OUT EFI_IMAGE_INPUT *Image
)
{
INTN Index;
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Bitmap;
if (Image == NULL || Image->Bitmap == NULL) {
return EFI_INVALID_PARAMETER;
}
if ((Image->Flags & H2O_IMAGE_ALPHA_CHANNEL) == H2O_IMAGE_ALPHA_CHANNEL) {
return EFI_SUCCESS;
}
Bitmap = Image->Bitmap;
Index = (UINTN)Image->Width * Image->Height;
if ((Image->Flags & EFI_IMAGE_TRANSPARENT) == EFI_IMAGE_TRANSPARENT) {
while (--Index >= 0) {
if (*(UINT32 *)Bitmap != 0) {
Bitmap->Reserved = 0xFF;
}
++Bitmap;
}
} else {
while (--Index >= 0) {
(Bitmap++)->Reserved = 0xFF;
}
}
Image->Flags = H2O_IMAGE_ALPHA_CHANNEL;
return EFI_SUCCESS;
}
#define muldiv255(a,b) ((unsigned char)((((a)+1)*(b))>>8)) /* very fast, 92% accurate*/
/**
Internal function to blend pixle according to alpha channel.
@param[in] Dst Input destination pixel in format EFI_GRAPHICS_OUTPUT_BLT_PIXEL.
@param[in] Src Input source pixel in format EFI_GRAPHICS_OUTPUT_BLT_PIXEL.
**/
VOID
BlendPixel (
IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Dst,
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Src
)
{
UINT8 Alpha;
ASSERT (Dst != NULL);
ASSERT (Src != NULL);
if ((Dst == NULL) || (Src == NULL)) {
return;
}
Alpha = Src->Reserved;
if (Alpha == 255) {
*(UINT32*) Dst = *(UINT32 *) Src;
} else if (Alpha != 0) {
Dst->Red += muldiv255 (Alpha, Src->Red - Dst->Red);
Dst->Green += muldiv255 (Alpha, Src->Green - Dst->Green);
Dst->Blue += muldiv255 (Alpha, Src->Blue - Dst->Blue);
}
if (Dst->Reserved != 255) {
if (Alpha == 255) {
Dst->Reserved = 255;
} else {
Dst->Reserved += muldiv255 (Alpha, 255 - Dst->Reserved);
}
}
}