mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-25 17:23:53 +02:00 
			
		
		
		
	REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the MdeModulePkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
		
			
				
	
	
		
			430 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			430 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
| Implementation for EFI_HII_IMAGE_EX_PROTOCOL.
 | |
| 
 | |
| 
 | |
| Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
 | |
| SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include "HiiDatabase.h"
 | |
| 
 | |
| /**
 | |
|   The prototype of this extension function is the same with EFI_HII_IMAGE_PROTOCOL.NewImage().
 | |
|   This protocol invokes EFI_HII_IMAGE_PROTOCOL.NewImage() implicitly.
 | |
| 
 | |
|   @param  This                   A pointer to the EFI_HII_IMAGE_EX_PROTOCOL instance.
 | |
|   @param  PackageList            Handle of the package list where this image will
 | |
|                                  be added.
 | |
|   @param  ImageId                On return, contains the new image id, which is
 | |
|                                  unique within PackageList.
 | |
|   @param  Image                  Points to the image.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The new image was added successfully.
 | |
|   @retval EFI_NOT_FOUND          The PackageList could not be found.
 | |
|   @retval EFI_OUT_OF_RESOURCES   Could not add the image due to lack of resources.
 | |
|   @retval EFI_INVALID_PARAMETER  Image is NULL or ImageId is NULL.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| HiiNewImageEx (
 | |
|   IN  CONST EFI_HII_IMAGE_EX_PROTOCOL  *This,
 | |
|   IN  EFI_HII_HANDLE                   PackageList,
 | |
|   OUT EFI_IMAGE_ID                     *ImageId,
 | |
|   IN  CONST EFI_IMAGE_INPUT            *Image
 | |
|   )
 | |
| {
 | |
|   HII_DATABASE_PRIVATE_DATA  *Private;
 | |
| 
 | |
|   Private = HII_IMAGE_EX_DATABASE_PRIVATE_DATA_FROM_THIS (This);
 | |
|   return HiiNewImage (&Private->HiiImage, PackageList, ImageId, Image);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Return the information about the image, associated with the package list.
 | |
|   The prototype of this extension function is the same with EFI_HII_IMAGE_PROTOCOL.GetImage().
 | |
| 
 | |
|   This function is similar to EFI_HII_IMAGE_PROTOCOL.GetImage().The difference is that
 | |
|   this function will locate all EFI_HII_IMAGE_DECODER_PROTOCOL instances installed in the
 | |
|   system if the decoder of the certain image type is not supported by the
 | |
|   EFI_HII_IMAGE_EX_PROTOCOL. The function will attempt to decode the image to the
 | |
|   EFI_IMAGE_INPUT using the first EFI_HII_IMAGE_DECODER_PROTOCOL instance that
 | |
|   supports the requested image type.
 | |
| 
 | |
|   @param  This                   A pointer to the EFI_HII_IMAGE_EX_PROTOCOL instance.
 | |
|   @param  PackageList            The package list in the HII database to search for the
 | |
|                                  specified image.
 | |
|   @param  ImageId                The image's id, which is unique within PackageList.
 | |
|   @param  Image                  Points to the image.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The new image was returned successfully.
 | |
|   @retval EFI_NOT_FOUND          The image specified by ImageId is not available. The specified
 | |
|                                  PackageList is not in the Database.
 | |
|   @retval EFI_INVALID_PARAMETER  Image was NULL or ImageId was 0.
 | |
|   @retval EFI_OUT_OF_RESOURCES   The bitmap could not be retrieved because there
 | |
|                                  was not enough memory.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| HiiGetImageEx (
 | |
|   IN  CONST EFI_HII_IMAGE_EX_PROTOCOL  *This,
 | |
|   IN  EFI_HII_HANDLE                   PackageList,
 | |
|   IN  EFI_IMAGE_ID                     ImageId,
 | |
|   OUT EFI_IMAGE_INPUT                  *Image
 | |
|   )
 | |
| {
 | |
|   HII_DATABASE_PRIVATE_DATA  *Private;
 | |
| 
 | |
|   Private = HII_IMAGE_EX_DATABASE_PRIVATE_DATA_FROM_THIS (This);
 | |
|   return IGetImage (&Private->DatabaseList, PackageList, ImageId, Image, FALSE);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Change the information about the image.
 | |
| 
 | |
|   Same with EFI_HII_IMAGE_PROTOCOL.SetImage(),this protocol invokes
 | |
|   EFI_HII_IMAGE_PROTOCOL.SetImage()implicitly.
 | |
| 
 | |
|   @param  This                   A pointer to the EFI_HII_IMAGE_EX_PROTOCOL instance.
 | |
|   @param  PackageList            The package list containing the images.
 | |
|   @param  ImageId                The image's id, which is unique within PackageList.
 | |
|   @param  Image                  Points to the image.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The new image was successfully updated.
 | |
|   @retval EFI_NOT_FOUND          The image specified by ImageId is not in the
 | |
|                                  database. The specified PackageList is not in
 | |
|                                  the database.
 | |
|   @retval EFI_INVALID_PARAMETER  The Image was NULL, the ImageId was 0 or
 | |
|                                  the Image->Bitmap was NULL.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| HiiSetImageEx (
 | |
|   IN CONST EFI_HII_IMAGE_EX_PROTOCOL  *This,
 | |
|   IN EFI_HII_HANDLE                   PackageList,
 | |
|   IN EFI_IMAGE_ID                     ImageId,
 | |
|   IN CONST EFI_IMAGE_INPUT            *Image
 | |
|   )
 | |
| {
 | |
|   HII_DATABASE_PRIVATE_DATA  *Private;
 | |
| 
 | |
|   Private = HII_IMAGE_EX_DATABASE_PRIVATE_DATA_FROM_THIS (This);
 | |
|   return HiiSetImage (&Private->HiiImage, PackageList, ImageId, Image);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Renders an image to a bitmap or to the display.
 | |
| 
 | |
|   The prototype of this extension function is the same with
 | |
|   EFI_HII_IMAGE_PROTOCOL.DrawImage(). This protocol invokes
 | |
|   EFI_HII_IMAGE_PROTOCOL.DrawImage() implicitly.
 | |
| 
 | |
|   @param  This                   A pointer to the EFI_HII_IMAGE_EX_PROTOCOL instance.
 | |
|   @param  Flags                  Describes how the image is to be drawn.
 | |
|   @param  Image                  Points to the image to be displayed.
 | |
|   @param  Blt                    If this points to a non-NULL on entry, this points
 | |
|                                  to the image, which is Width pixels wide and
 | |
|                                  Height pixels high.  The image will be drawn onto
 | |
|                                  this image and  EFI_HII_DRAW_FLAG_CLIP is implied.
 | |
|                                  If this points to a NULL on entry, then a buffer
 | |
|                                  will be allocated to hold the generated image and
 | |
|                                  the pointer updated on exit. It is the caller's
 | |
|                                  responsibility to free this buffer.
 | |
|   @param  BltX                   Specifies the offset from the left and top edge of
 | |
|                                  the output image of the first pixel in the image.
 | |
|   @param  BltY                   Specifies the offset from the left and top edge of
 | |
|                                  the output image of the first pixel in the image.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The image was successfully drawn.
 | |
|   @retval EFI_OUT_OF_RESOURCES   Unable to allocate an output buffer for Blt.
 | |
|   @retval EFI_INVALID_PARAMETER  The Image or Blt was NULL.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| HiiDrawImageEx (
 | |
|   IN CONST EFI_HII_IMAGE_EX_PROTOCOL  *This,
 | |
|   IN EFI_HII_DRAW_FLAGS               Flags,
 | |
|   IN CONST EFI_IMAGE_INPUT            *Image,
 | |
|   IN OUT EFI_IMAGE_OUTPUT             **Blt,
 | |
|   IN UINTN                            BltX,
 | |
|   IN UINTN                            BltY
 | |
|   )
 | |
| {
 | |
|   HII_DATABASE_PRIVATE_DATA  *Private;
 | |
| 
 | |
|   Private = HII_IMAGE_EX_DATABASE_PRIVATE_DATA_FROM_THIS (This);
 | |
|   return HiiDrawImage (&Private->HiiImage, Flags, Image, Blt, BltX, BltY);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Renders an image to a bitmap or the screen containing the contents of the specified
 | |
|   image.
 | |
| 
 | |
|   This function is similar to EFI_HII_IMAGE_PROTOCOL.DrawImageId(). The difference is that
 | |
|   this function will locate all EFI_HII_IMAGE_DECODER_PROTOCOL instances installed in the
 | |
|   system if the decoder of the certain image type is not supported by the
 | |
|   EFI_HII_IMAGE_EX_PROTOCOL. The function will attempt to decode the image to the
 | |
|   EFI_IMAGE_INPUT using the first EFI_HII_IMAGE_DECODER_PROTOCOL instance that
 | |
|   supports the requested image type.
 | |
| 
 | |
|   @param  This                   A pointer to the EFI_HII_IMAGE_EX_PROTOCOL instance.
 | |
|   @param  Flags                  Describes how the image is to be drawn.
 | |
|   @param  PackageList            The package list in the HII database to search for
 | |
|                                  the  specified image.
 | |
|   @param  ImageId                The image's id, which is unique within PackageList.
 | |
|   @param  Blt                    If this points to a non-NULL on entry, this points
 | |
|                                  to the image, which is Width pixels wide and
 | |
|                                  Height pixels high. The image will be drawn onto
 | |
|                                  this image and EFI_HII_DRAW_FLAG_CLIP is implied.
 | |
|                                  If this points to a NULL on entry, then a buffer
 | |
|                                  will be allocated to hold  the generated image
 | |
|                                  and the pointer updated on exit. It is the caller's
 | |
|                                  responsibility to free this buffer.
 | |
|   @param  BltX                   Specifies the offset from the left and top edge of
 | |
|                                  the output image of the first pixel in the image.
 | |
|   @param  BltY                   Specifies the offset from the left and top edge of
 | |
|                                  the output image of the first pixel in the image.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The image was successfully drawn.
 | |
|   @retval EFI_OUT_OF_RESOURCES   Unable to allocate an output buffer for Blt.
 | |
|   @retval EFI_INVALID_PARAMETER  The Blt was NULL or ImageId was 0.
 | |
|   @retval EFI_NOT_FOUND          The image specified by ImageId is not in the database.
 | |
|                                  The specified PackageList is not in the database.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| HiiDrawImageIdEx (
 | |
|   IN CONST EFI_HII_IMAGE_EX_PROTOCOL  *This,
 | |
|   IN EFI_HII_DRAW_FLAGS               Flags,
 | |
|   IN EFI_HII_HANDLE                   PackageList,
 | |
|   IN EFI_IMAGE_ID                     ImageId,
 | |
|   IN OUT EFI_IMAGE_OUTPUT             **Blt,
 | |
|   IN UINTN                            BltX,
 | |
|   IN UINTN                            BltY
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS       Status;
 | |
|   EFI_IMAGE_INPUT  Image;
 | |
| 
 | |
|   //
 | |
|   // Check input parameter.
 | |
|   //
 | |
|   if ((This == NULL) || (Blt == NULL)) {
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Get the specified Image.
 | |
|   //
 | |
|   Status = HiiGetImageEx (This, PackageList, ImageId, &Image);
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Draw this image.
 | |
|   //
 | |
|   Status = HiiDrawImageEx (This, Flags, &Image, Blt, BltX, BltY);
 | |
|   if (Image.Bitmap != NULL) {
 | |
|     FreePool (Image.Bitmap);
 | |
|   }
 | |
| 
 | |
|   return Status;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Return the first HII image decoder instance which supports the DecoderName.
 | |
| 
 | |
|   @param BlockType  The image block type.
 | |
| 
 | |
|   @retval Pointer to the HII image decoder instance.
 | |
| **/
 | |
| EFI_HII_IMAGE_DECODER_PROTOCOL *
 | |
| LocateHiiImageDecoder (
 | |
|   UINT8  BlockType
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                      Status;
 | |
|   EFI_HII_IMAGE_DECODER_PROTOCOL  *Decoder;
 | |
|   EFI_HANDLE                      *Handles;
 | |
|   UINTN                           HandleNum;
 | |
|   UINTN                           Index;
 | |
|   EFI_GUID                        *DecoderNames;
 | |
|   UINT16                          NumberOfDecoderName;
 | |
|   UINT16                          DecoderNameIndex;
 | |
|   EFI_GUID                        *DecoderName;
 | |
| 
 | |
|   switch (BlockType) {
 | |
|     case EFI_HII_IIBT_IMAGE_JPEG:
 | |
|       DecoderName = &gEfiHiiImageDecoderNameJpegGuid;
 | |
|       break;
 | |
| 
 | |
|     case EFI_HII_IIBT_IMAGE_PNG:
 | |
|       DecoderName = &gEfiHiiImageDecoderNamePngGuid;
 | |
|       break;
 | |
| 
 | |
|     default:
 | |
|       ASSERT (FALSE);
 | |
|       return NULL;
 | |
|   }
 | |
| 
 | |
|   Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiHiiImageDecoderProtocolGuid, NULL, &HandleNum, &Handles);
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   for (Index = 0; Index < HandleNum; Index++) {
 | |
|     Status = gBS->HandleProtocol (Handles[Index], &gEfiHiiImageDecoderProtocolGuid, (VOID **)&Decoder);
 | |
|     if (EFI_ERROR (Status)) {
 | |
|       continue;
 | |
|     }
 | |
| 
 | |
|     Status = Decoder->GetImageDecoderName (Decoder, &DecoderNames, &NumberOfDecoderName);
 | |
|     if (EFI_ERROR (Status)) {
 | |
|       continue;
 | |
|     }
 | |
| 
 | |
|     for (DecoderNameIndex = 0; DecoderNameIndex < NumberOfDecoderName; DecoderNameIndex++) {
 | |
|       if (CompareGuid (DecoderName, &DecoderNames[DecoderNameIndex])) {
 | |
|         return Decoder;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return NULL;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   This function returns the image information to EFI_IMAGE_OUTPUT. Only the width
 | |
|   and height are returned to the EFI_IMAGE_OUTPUT instead of decoding the image
 | |
|   to the buffer. This function is used to get the geometry of the image. This function
 | |
|   will try to locate all of the EFI_HII_IMAGE_DECODER_PROTOCOL installed on the
 | |
|   system if the decoder of image type is not supported by the EFI_HII_IMAGE_EX_PROTOCOL.
 | |
| 
 | |
|   @param  This                   A pointer to the EFI_HII_IMAGE_EX_PROTOCOL instance.
 | |
|   @param  PackageList            Handle of the package list where this image will
 | |
|                                  be searched.
 | |
|   @param  ImageId                The image's id, which is unique within PackageList.
 | |
|   @param  Image                  Points to the image.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The new image was returned successfully.
 | |
|   @retval EFI_NOT_FOUND          The image specified by ImageId is not in the
 | |
|                                  database. The specified PackageList is not in the database.
 | |
|   @retval EFI_BUFFER_TOO_SMALL   The buffer specified by ImageSize is too small to
 | |
|                                  hold the image.
 | |
|   @retval EFI_INVALID_PARAMETER  The Image was NULL or the ImageId was 0.
 | |
|   @retval EFI_OUT_OF_RESOURCES   The bitmap could not be retrieved because there
 | |
|                                  was not enough memory.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| HiiGetImageInfo (
 | |
|   IN CONST  EFI_HII_IMAGE_EX_PROTOCOL  *This,
 | |
|   IN        EFI_HII_HANDLE             PackageList,
 | |
|   IN        EFI_IMAGE_ID               ImageId,
 | |
|   OUT       EFI_IMAGE_OUTPUT           *Image
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                               Status;
 | |
|   HII_DATABASE_PRIVATE_DATA                *Private;
 | |
|   HII_DATABASE_PACKAGE_LIST_INSTANCE       *PackageListNode;
 | |
|   HII_IMAGE_PACKAGE_INSTANCE               *ImagePackage;
 | |
|   EFI_HII_IMAGE_BLOCK                      *CurrentImageBlock;
 | |
|   EFI_HII_IMAGE_DECODER_PROTOCOL           *Decoder;
 | |
|   EFI_HII_IMAGE_DECODER_IMAGE_INFO_HEADER  *ImageInfo;
 | |
| 
 | |
|   if ((Image == NULL) || (ImageId == 0)) {
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   Private         = HII_IMAGE_EX_DATABASE_PRIVATE_DATA_FROM_THIS (This);
 | |
|   PackageListNode = LocatePackageList (&Private->DatabaseList, PackageList);
 | |
|   if (PackageListNode == NULL) {
 | |
|     return EFI_NOT_FOUND;
 | |
|   }
 | |
| 
 | |
|   ImagePackage = PackageListNode->ImagePkg;
 | |
|   if (ImagePackage == NULL) {
 | |
|     return EFI_NOT_FOUND;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Find the image block specified by ImageId
 | |
|   //
 | |
|   CurrentImageBlock = GetImageIdOrAddress (ImagePackage->ImageBlock, &ImageId);
 | |
|   if (CurrentImageBlock == NULL) {
 | |
|     return EFI_NOT_FOUND;
 | |
|   }
 | |
| 
 | |
|   switch (CurrentImageBlock->BlockType) {
 | |
|     case EFI_HII_IIBT_IMAGE_JPEG:
 | |
|     case EFI_HII_IIBT_IMAGE_PNG:
 | |
|       Decoder = LocateHiiImageDecoder (CurrentImageBlock->BlockType);
 | |
|       if (Decoder == NULL) {
 | |
|         return EFI_UNSUPPORTED;
 | |
|       }
 | |
| 
 | |
|       //
 | |
|       // Use the common block code since the definition of two structures is the same.
 | |
|       //
 | |
|       ASSERT (OFFSET_OF (EFI_HII_IIBT_JPEG_BLOCK, Data) == OFFSET_OF (EFI_HII_IIBT_PNG_BLOCK, Data));
 | |
|       ASSERT (
 | |
|         sizeof (((EFI_HII_IIBT_JPEG_BLOCK *)CurrentImageBlock)->Data) ==
 | |
|         sizeof (((EFI_HII_IIBT_PNG_BLOCK *)CurrentImageBlock)->Data)
 | |
|         );
 | |
|       ASSERT (OFFSET_OF (EFI_HII_IIBT_JPEG_BLOCK, Size) == OFFSET_OF (EFI_HII_IIBT_PNG_BLOCK, Size));
 | |
|       ASSERT (
 | |
|         sizeof (((EFI_HII_IIBT_JPEG_BLOCK *)CurrentImageBlock)->Size) ==
 | |
|         sizeof (((EFI_HII_IIBT_PNG_BLOCK *)CurrentImageBlock)->Size)
 | |
|         );
 | |
|       Status = Decoder->GetImageInfo (
 | |
|                           Decoder,
 | |
|                           ((EFI_HII_IIBT_JPEG_BLOCK *)CurrentImageBlock)->Data,
 | |
|                           ((EFI_HII_IIBT_JPEG_BLOCK *)CurrentImageBlock)->Size,
 | |
|                           &ImageInfo
 | |
|                           );
 | |
| 
 | |
|       //
 | |
|       // Spec requires to use the first capable image decoder instance.
 | |
|       // The first image decoder instance may fail to decode the image.
 | |
|       //
 | |
|       if (!EFI_ERROR (Status)) {
 | |
|         Image->Height       = ImageInfo->ImageHeight;
 | |
|         Image->Width        = ImageInfo->ImageWidth;
 | |
|         Image->Image.Bitmap = NULL;
 | |
|         FreePool (ImageInfo);
 | |
|       }
 | |
| 
 | |
|       return Status;
 | |
| 
 | |
|     case EFI_HII_IIBT_IMAGE_1BIT_TRANS:
 | |
|     case EFI_HII_IIBT_IMAGE_4BIT_TRANS:
 | |
|     case EFI_HII_IIBT_IMAGE_8BIT_TRANS:
 | |
|     case EFI_HII_IIBT_IMAGE_1BIT:
 | |
|     case EFI_HII_IIBT_IMAGE_4BIT:
 | |
|     case EFI_HII_IIBT_IMAGE_8BIT:
 | |
|       //
 | |
|       // Use the common block code since the definition of these structures is the same.
 | |
|       //
 | |
|       Image->Width        = ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_1BIT_BLOCK *)CurrentImageBlock)->Bitmap.Width);
 | |
|       Image->Height       = ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_1BIT_BLOCK *)CurrentImageBlock)->Bitmap.Height);
 | |
|       Image->Image.Bitmap = NULL;
 | |
|       return EFI_SUCCESS;
 | |
| 
 | |
|     case EFI_HII_IIBT_IMAGE_24BIT_TRANS:
 | |
|     case EFI_HII_IIBT_IMAGE_24BIT:
 | |
|       Image->Width        = ReadUnaligned16 ((VOID *)&((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *)CurrentImageBlock)->Bitmap.Width);
 | |
|       Image->Height       = ReadUnaligned16 ((VOID *)&((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *)CurrentImageBlock)->Bitmap.Height);
 | |
|       Image->Image.Bitmap = NULL;
 | |
|       return EFI_SUCCESS;
 | |
| 
 | |
|     default:
 | |
|       return EFI_NOT_FOUND;
 | |
|   }
 | |
| }
 |