/** @file
  The file provides services to access to images in the images database.

  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This Protocol was introduced in UEFI Specification 2.1.

**/

#ifndef __HII_IMAGE_H__
#define __HII_IMAGE_H__

#include <Protocol/GraphicsOutput.h>

#define EFI_HII_IMAGE_PROTOCOL_GUID \
  { 0x31a6406a, 0x6bdf, 0x4e46, { 0xb2, 0xa2, 0xeb, 0xaa, 0x89, 0xc4, 0x9, 0x20 } }

typedef struct _EFI_HII_IMAGE_PROTOCOL EFI_HII_IMAGE_PROTOCOL;

///
/// Flags in EFI_IMAGE_INPUT
///
#define EFI_IMAGE_TRANSPARENT  0x00000001

/**

  Definition of EFI_IMAGE_INPUT.

  @param Flags  Describe image characteristics. If
                EFI_IMAGE_TRANSPARENT is set, then the image was
                designed for transparent display.

  @param Width  Image width, in pixels.

  @param Height Image height, in pixels.

  @param Bitmap A pointer to the actual bitmap, organized left-to-right,
                top-to-bottom. The size of the bitmap is
                Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL).


**/
typedef struct _EFI_IMAGE_INPUT {
  UINT32                           Flags;
  UINT16                           Width;
  UINT16                           Height;
  EFI_GRAPHICS_OUTPUT_BLT_PIXEL    *Bitmap;
} EFI_IMAGE_INPUT;

/**

  This function adds the image Image to the group of images
  owned by PackageList, and returns a new image identifier
  (ImageId).

  @param This        A pointer to the EFI_HII_IMAGE_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_OUT_OF_RESOURCES    Could not add the image.

  @retval EFI_INVALID_PARAMETER   Image is NULL or ImageId is
                                  NULL.


**/
typedef
EFI_STATUS
(EFIAPI *EFI_HII_NEW_IMAGE)(
  IN CONST  EFI_HII_IMAGE_PROTOCOL  *This,
  IN        EFI_HII_HANDLE          PackageList,
  OUT       EFI_IMAGE_ID            *ImageId,
  IN CONST  EFI_IMAGE_INPUT         *Image
  );

/**

  This function retrieves the image specified by ImageId which
  is associated with the specified PackageList and copies it
  into the buffer specified by Image. If the image specified by
  ImageId is not present in the specified PackageList, then
  EFI_NOT_FOUND is returned. If the buffer specified by
  ImageSize is too small to hold the image, then
  EFI_BUFFER_TOO_SMALL will be returned. ImageSize will be
  updated to the size of buffer actually required to hold the
  image.

  @param This         A pointer to the EFI_HII_IMAGE_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 new image.

  @retval EFI_SUCCESS            The image was returned successfully.

  @retval EFI_NOT_FOUND          The image specified by ImageId is not
                                 available. Or The specified PackageList is not in the database.

  @retval EFI_INVALID_PARAMETER  The Image or Langugae was NULL.
  @retval EFI_OUT_OF_RESOURCES   The bitmap could not be retrieved because there was not
                                 enough memory.


**/
typedef
EFI_STATUS
(EFIAPI *EFI_HII_GET_IMAGE)(
  IN CONST  EFI_HII_IMAGE_PROTOCOL  *This,
  IN        EFI_HII_HANDLE          PackageList,
  IN        EFI_IMAGE_ID            ImageId,
  OUT       EFI_IMAGE_INPUT         *Image
  );

/**

  This function updates the image specified by ImageId in the
  specified PackageListHandle to the image specified by Image.


  @param This         A pointer to the EFI_HII_IMAGE_PROTOCOL instance.

  @param PackageList  The package list containing the images.

  @param ImageId      The image id, which is unique within PackageList.

  @param Image        Points to the image.

  @retval EFI_SUCCESS           The 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 or Language was NULL.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_HII_SET_IMAGE)(
  IN CONST  EFI_HII_IMAGE_PROTOCOL  *This,
  IN        EFI_HII_HANDLE          PackageList,
  IN        EFI_IMAGE_ID            ImageId,
  IN CONST  EFI_IMAGE_INPUT         *Image
  );

///
/// EFI_HII_DRAW_FLAGS describes how the image is to be drawn.
/// These flags are defined as EFI_HII_DRAW_FLAG_***
///
typedef UINT32 EFI_HII_DRAW_FLAGS;

#define EFI_HII_DRAW_FLAG_CLIP          0x00000001
#define EFI_HII_DRAW_FLAG_TRANSPARENT   0x00000030
#define EFI_HII_DRAW_FLAG_DEFAULT       0x00000000
#define EFI_HII_DRAW_FLAG_FORCE_TRANS   0x00000010
#define EFI_HII_DRAW_FLAG_FORCE_OPAQUE  0x00000020
#define EFI_HII_DIRECT_TO_SCREEN        0x00000080

/**

  Definition of EFI_IMAGE_OUTPUT.

  @param Width  Width of the output image.

  @param Height Height of the output image.

  @param Bitmap Points to the output bitmap.

  @param Screen Points to the EFI_GRAPHICS_OUTPUT_PROTOCOL which
                describes the screen on which to draw the
                specified image.

**/
typedef struct _EFI_IMAGE_OUTPUT {
  UINT16    Width;
  UINT16    Height;
  union {
    EFI_GRAPHICS_OUTPUT_BLT_PIXEL    *Bitmap;
    EFI_GRAPHICS_OUTPUT_PROTOCOL     *Screen;
  } Image;
} EFI_IMAGE_OUTPUT;

/**

  This function renders an image to a bitmap or the screen using
  the specified color and options. It draws the image on an
  existing bitmap, allocates a new bitmap or uses the screen. The
  images can be clipped. If EFI_HII_DRAW_FLAG_CLIP is set, then
  all pixels drawn outside the bounding box specified by Width and
  Height are ignored. If EFI_HII_DRAW_FLAG_TRANSPARENT is set,
  then all 'off' pixels in the images drawn will use the
  pixel value from Blt. This flag cannot be used if Blt is NULL
  upon entry. If EFI_HII_DIRECT_TO_SCREEN is set, then the image
  will be written directly to the output device specified by
  Screen. Otherwise the image will be rendered to the bitmap
  specified by Bitmap.


  @param This       A pointer to the EFI_HII_IMAGE_PROTOCOL instance.

  @param Flags      Describes how the image is to be drawn.
                    EFI_HII_DRAW_FLAGS is defined in Related
                    Definitions, below.

  @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, BltY Specifies the offset from the left and top
                    edge of the image of the first pixel in
                    the image.

  @retval EFI_SUCCESS           The image was successfully updated.

  @retval EFI_OUT_OF_RESOURCES  Unable to allocate an output
                                buffer for RowInfoArray or Blt.

  @retval EFI_INVALID_PARAMETER The Image or Blt or Height or
                                Width was NULL.


**/
typedef
EFI_STATUS
(EFIAPI *EFI_HII_DRAW_IMAGE)(
  IN CONST  EFI_HII_IMAGE_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
  );

/**

  This function renders an image as a bitmap or to the screen and
  can clip the image. The bitmap is either supplied by the caller
  or else is allocated by the function. The images can be drawn
  transparently or opaquely. If EFI_HII_DRAW_FLAG_CLIP is set,
  then all pixels drawn outside the bounding box specified by
  Width and Height are ignored. If EFI_HII_DRAW_FLAG_TRANSPARENT
  is set, then all "off" pixels in the character's glyph will
  use the pixel value from Blt. This flag cannot be used if Blt
  is NULL upon entry. If EFI_HII_DIRECT_TO_SCREEN is set, then
  the image will be written directly to the output device
  specified by Screen. Otherwise the image will be rendered to
  the bitmap specified by Bitmap.
  This function renders an image to a bitmap or the screen using
  the specified color and options. It draws the image on an
  existing bitmap, allocates a new bitmap or uses the screen. The
  images can be clipped. If EFI_HII_DRAW_FLAG_CLIP is set, then
  all pixels drawn outside the bounding box specified by Width and
  Height are ignored. The EFI_HII_DRAW_FLAG_TRANSPARENT flag
  determines whether the image will be drawn transparent or
  opaque. If EFI_HII_DRAW_FLAG_FORCE_TRANS is set, then the image
  will be drawn so that all 'off' pixels in the image will
  be drawn using the pixel value from Blt and all other pixels
  will be copied. If EFI_HII_DRAW_FLAG_FORCE_OPAQUE is set, then
  the image's pixels will be copied directly to the
  destination. If EFI_HII_DRAW_FLAG_DEFAULT is set, then the image
  will be drawn transparently or opaque, depending on the
  image's transparency setting (see EFI_IMAGE_TRANSPARENT).
  Images cannot be drawn transparently if Blt is NULL. If
  EFI_HII_DIRECT_TO_SCREEN is set, then the image will be written
  directly to the output device specified by Screen. Otherwise the
  image will be rendered to the bitmap specified by Bitmap.

  @param This         A pointer to the EFI_HII_IMAGE_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, 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 updated.

  @retval EFI_OUT_OF_RESOURCES  Unable to allocate an output
                                buffer for RowInfoArray or Blt.

  @retval EFI_NOT_FOUND         The image specified by ImageId is not in the database.
                                Or The specified PackageList is not in the database.

  @retval EFI_INVALID_PARAMETER The Blt was NULL.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_HII_DRAW_IMAGE_ID)(
  IN CONST  EFI_HII_IMAGE_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
  );

///
/// Services to access to images in the images database.
///
struct _EFI_HII_IMAGE_PROTOCOL {
  EFI_HII_NEW_IMAGE        NewImage;
  EFI_HII_GET_IMAGE        GetImage;
  EFI_HII_SET_IMAGE        SetImage;
  EFI_HII_DRAW_IMAGE       DrawImage;
  EFI_HII_DRAW_IMAGE_ID    DrawImageId;
};

extern EFI_GUID  gEfiHiiImageProtocolGuid;

#endif
