/*++

Copyright (c) 2007, Intel Corporation                                                         
All rights reserved. This program and the accompanying materials                          
are licensed and made available under the terms and conditions of the BSD License         
which accompanies this distribution.  The full text of the license may be found at        
http://opensource.org/licenses/bsd-license.php                                            
                                                                                          
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             

Module Name:

    HiiImage.h
    
Abstract:

    EFI_HII_IMAGE_PROTOCOL from UEFI 2.1 specification.
    
    This protocol provides access to images in the images database.

Revision History

--*/

#ifndef __EFI_HII_IMAGE_PROTOCOL_H__
#define __EFI_HII_IMAGE_PROTOCOL_H__

#include "EfiHii.h"
#include EFI_PROTOCOL_DEFINITION (GraphicsOutput) 

//
// Global ID for the Hii Image Protocol.
//
#define EFI_HII_IMAGE_PROTOCOL_GUID \
  { \
    0x31a6406a, 0x6bdf, 0x4e46, {0xb2, 0xa2, 0xeb, 0xaa, 0x89, 0xc4, 0x9, 0x20} \
  }

EFI_FORWARD_DECLARATION (EFI_HII_IMAGE_PROTOCOL);

typedef UINT32 EFI_HII_DRAW_FLAGS;

typedef struct _EFI_IMAGE_INPUT {
  UINT32                             Flags;  
  UINT16                             Width;
  UINT16                             Height;
  EFI_GRAPHICS_OUTPUT_BLT_PIXEL      Bitmap[1];
} EFI_IMAGE_INPUT;

#define EFI_IMAGE_TRANSPARENT          0x00000001

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;

#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

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
  )
/*++

  Routine Description:
    This function adds the image Image to the group of images owned by PackageList, and returns
    a new image identifier (ImageId).                                                          
    
  Arguments:          
    This              - A pointer to the EFI_HII_IMAGE_PROTOCOL instance.
    PackageList       - Handle of the package list where this image will be added.    
    ImageId           - On return, contains the new image id, which is unique within PackageList.
    Image             - Points to the image.
    
  Returns:
    EFI_SUCCESS            - The new image was added successfully.
    EFI_NOT_FOUND          - The specified PackageList could not be found in database.
    EFI_OUT_OF_RESOURCES   - Could not add the image due to lack of resources.
    EFI_INVALID_PARAMETER  - Image is NULL or ImageId is NULL.  
    
--*/    
;

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,
  OUT UINTN                          *ImageSize
  )
/*++

  Routine Description:
    This function retrieves the image specified by ImageId which is associated with
    the specified PackageList and copies it into the buffer specified by Image.
    
  Arguments:          
    This              - A pointer to the EFI_HII_IMAGE_PROTOCOL instance.
    PackageList       - Handle of the package list where this image will be searched.    
    ImageId           - The image's id,, which is unique within PackageList.
    Image             - Points to the image.
    ImageSize         - On entry, points to the size of the buffer pointed to by Image, in bytes. On return,
                        points to the length of the image, in bytes.                                        
                        
  Returns:
    EFI_SUCCESS            - The new image was returned successfully.
    EFI_NOT_FOUND          - The image specified by ImageId is not available.
    EFI_BUFFER_TOO_SMALL   - The buffer specified by ImageSize is too small to hold the image.                                                      
    EFI_INVALID_PARAMETER  - The Image or ImageSize 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
  )
/*++

  Routine Description:
    This function updates the image specified by ImageId in the specified PackageListHandle to
    the image specified by Image.                                                             
    
  Arguments:          
    This              - A pointer to the EFI_HII_IMAGE_PROTOCOL instance.
    PackageList       - The package list containing the images.
    ImageId           - The image's id,, which is unique within PackageList.
    Image             - Points to the image.
                        
  Returns:
    EFI_SUCCESS            - The new image was updated successfully.
    EFI_NOT_FOUND          - The image specified by ImageId is not in the database.    
    EFI_INVALID_PARAMETER  - The Image 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
  )
/*++

  Routine Description:
    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.       
    
  Arguments:          
    This              - A pointer to the EFI_HII_IMAGE_PROTOCOL instance.
    Flags             - Describes how the image is to be drawn.    
    Image             - Points to the image to be displayed.
    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.
    BltX, BltY        - Specifies the offset from the left and top edge of the 
                        output image of the first pixel in the image.
                        
  Returns:
    EFI_SUCCESS            - The image was successfully drawn.
    EFI_OUT_OF_RESOURCES   - Unable to allocate an output buffer for Blt.
    EFI_INVALID_PARAMETER  - The Image or Blt was NULL.
    EFI_INVALID_PARAMETER  - Any combination of Flags is invalid.
    
--*/
;

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
  )

/*++

  Routine Description:
    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.       
    
  Arguments:          
    This              - A pointer to the EFI_HII_IMAGE_PROTOCOL instance.
    Flags             - Describes how the image is to be drawn.
    PackageList       - The package list in the HII database to search for the 
                        specified image.
    ImageId           - The image's id, which is unique within PackageList.
    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.
    BltX, BltY        - Specifies the offset from the left and top edge of the 
                        output image of the first pixel in the image.
                        
  Returns:
    EFI_SUCCESS            - The image was successfully drawn.
    EFI_OUT_OF_RESOURCES   - Unable to allocate an output buffer for Blt.
    EFI_INVALID_PARAMETER  - The Image was NULL.

--*/
;

//
// Interface structure for the EFI_HII_IMAGE_PROTOCOL
//
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
