xref: /illumos-gate/usr/src/boot/efi/include/Protocol/HiiImageDecoder.h (revision 6faf52448e142b151fa3deade474be359e7c8698)
1 /** @file
2   This protocol provides generic image decoder interfaces to various image formats.
3 
4 (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
5   Copyright (c) 2016-2018, Intel Corporation. All rights reserved.<BR>
6 
7 SPDX-License-Identifier: BSD-2-Clause-Patent
8 
9   @par Revision Reference:
10   This Protocol was introduced in UEFI Specification 2.6.
11 
12 **/
13 
14 #ifndef __HII_IMAGE_DECODER_H__
15 #define __HII_IMAGE_DECODER_H__
16 
17 #include <Protocol/HiiImage.h>
18 
19 #define EFI_HII_IMAGE_DECODER_PROTOCOL_GUID \
20   {0x9e66f251, 0x727c, 0x418c, { 0xbf, 0xd6, 0xc2, 0xb4, 0x25, 0x28, 0x18, 0xea }}
21 
22 #define EFI_HII_IMAGE_DECODER_NAME_JPEG_GUID \
23   {0xefefd093, 0xd9b, 0x46eb,  { 0xa8, 0x56, 0x48, 0x35, 0x7, 0x0, 0xc9, 0x8 }}
24 
25 #define EFI_HII_IMAGE_DECODER_NAME_PNG_GUID \
26   {0xaf060190, 0x5e3a, 0x4025, { 0xaf, 0xbd, 0xe1, 0xf9, 0x5, 0xbf, 0xaa, 0x4c }}
27 
28 typedef struct _EFI_HII_IMAGE_DECODER_PROTOCOL EFI_HII_IMAGE_DECODER_PROTOCOL;
29 
30 typedef enum {
31   EFI_HII_IMAGE_DECODER_COLOR_TYPE_RGB     = 0x0,
32   EFI_HII_IMAGE_DECODER_COLOR_TYPE_RGBA    = 0x1,
33   EFI_HII_IMAGE_DECODER_COLOR_TYPE_CMYK    = 0x2,
34   EFI_HII_IMAGE_DECODER_COLOR_TYPE_UNKNOWN = 0xFF
35 } EFI_HII_IMAGE_DECODER_COLOR_TYPE;
36 
37 //
38 // EFI_HII_IMAGE_DECODER_IMAGE_INFO_HEADER
39 //
40 // DecoderName        Name of the decoder
41 // ImageInfoSize      The size of entire image information structure in bytes
42 // ImageWidth         The image width
43 // ImageHeight        The image height
44 // ColorType          The color type, see EFI_HII_IMAGE_DECODER_COLOR_TYPE.
45 // ColorDepthInBits   The color depth in bits
46 //
47 typedef struct _EFI_HII_IMAGE_DECODER_IMAGE_INFO_HEADER {
48   EFI_GUID                            DecoderName;
49   UINT16                              ImageInfoSize;
50   UINT16                              ImageWidth;
51   UINT16                              ImageHeight;
52   EFI_HII_IMAGE_DECODER_COLOR_TYPE    ColorType;
53   UINT8                               ColorDepthInBits;
54 } EFI_HII_IMAGE_DECODER_IMAGE_INFO_HEADER;
55 
56 #define EFI_IMAGE_JPEG_SCANTYPE_PROGREESSIVE  0x01
57 #define EFI_IMAGE_JPEG_SCANTYPE_INTERLACED    0x02
58 
59 //
60 // EFI_HII_IMAGE_DECODER_JPEG_INFO
61 // Header         The common header
62 // ScanType       The scan type of JPEG image
63 // Reserved       Reserved
64 //
65 typedef struct _EFI_HII_IMAGE_DECODER_JPEG_INFO {
66   EFI_HII_IMAGE_DECODER_IMAGE_INFO_HEADER    Header;
67   UINT16                                     ScanType;
68   UINT64                                     Reserved;
69 } EFI_HII_IMAGE_DECODER_JPEG_INFO;
70 
71 //
72 // EFI_HII_IMAGE_DECODER_PNG_INFO
73 // Header         The common header
74 // Channels       Number of channels in the PNG image
75 // Reserved       Reserved
76 //
77 typedef struct _EFI_HII_IMAGE_DECODER_PNG_INFO {
78   EFI_HII_IMAGE_DECODER_IMAGE_INFO_HEADER    Header;
79   UINT16                                     Channels;
80   UINT64                                     Reserved;
81 } EFI_HII_IMAGE_DECODER_PNG_INFO;
82 
83 //
84 // EFI_HII_IMAGE_DECODER_OTHER_INFO
85 //
86 typedef struct _EFI_HII_IMAGE_DECODER_OTHER_INFO {
87   EFI_HII_IMAGE_DECODER_IMAGE_INFO_HEADER    Header;
88   CHAR16                                     ImageExtenion[1];
89   //
90   // Variable length of image file extension name.
91   //
92 } EFI_HII_IMAGE_DECODER_OTHER_INFO;
93 
94 /**
95   There could be more than one EFI_HII_IMAGE_DECODER_PROTOCOL instances installed
96   in the system for different image formats. This function returns the decoder
97   name which callers can use to find the proper image decoder for the image. It
98   is possible to support multiple image formats in one EFI_HII_IMAGE_DECODER_PROTOCOL.
99   The capability of the supported image formats is returned in DecoderName and
100   NumberOfDecoderName.
101 
102   @param This                    EFI_HII_IMAGE_DECODER_PROTOCOL instance.
103   @param DecoderName             Pointer to a dimension to retrieve the decoder
104                                  names in EFI_GUID format. The number of the
105                                  decoder names is returned in NumberOfDecoderName.
106   @param NumberofDecoderName     Pointer to retrieve the number of decoders which
107                                  supported by this decoder driver.
108 
109   @retval EFI_SUCCESS            Get decoder name success.
110   @retval EFI_UNSUPPORTED        Get decoder name fail.
111 
112 **/
113 typedef
114 EFI_STATUS
115 (EFIAPI *EFI_HII_IMAGE_DECODER_GET_NAME)(
116   IN      EFI_HII_IMAGE_DECODER_PROTOCOL   *This,
117   IN OUT  EFI_GUID                         **DecoderName,
118   IN OUT  UINT16                           *NumberOfDecoderName
119   );
120 
121 /**
122   This function returns the image information of the given image raw data. This
123   function first checks whether the image raw data is supported by this decoder
124   or not. This function may go through the first few bytes in the image raw data
125   for the specific data structure or the image signature. If the image is not supported
126   by this image decoder, this function returns EFI_UNSUPPORTED to the caller.
127   Otherwise, this function returns the proper image information to the caller.
128   It is the caller?s responsibility to free the ImageInfo.
129 
130   @param This                    EFI_HII_IMAGE_DECODER_PROTOCOL instance.
131   @param Image                   Pointer to the image raw data.
132   @param SizeOfImage             Size of the entire image raw data.
133   @param ImageInfo               Pointer to receive EFI_HII_IMAGE_DECODER_IMAGE_INFO_HEADER.
134 
135   @retval EFI_SUCCESS            Get image info success.
136   @retval EFI_UNSUPPORTED        Unsupported format of image.
137   @retval EFI_INVALID_PARAMETER  Incorrect parameter.
138   @retval EFI_BAD_BUFFER_SIZE    Not enough memory.
139 
140 **/
141 typedef
142 EFI_STATUS
143 (EFIAPI *EFI_HII_IMAGE_DECODER_GET_IMAGE_INFO)(
144   IN      EFI_HII_IMAGE_DECODER_PROTOCOL           *This,
145   IN      VOID                                     *Image,
146   IN      UINTN                                    SizeOfImage,
147   IN OUT  EFI_HII_IMAGE_DECODER_IMAGE_INFO_HEADER  **ImageInfo
148   );
149 
150 /**
151   This function decodes the image which the image type of this image is supported
152   by this EFI_HII_IMAGE_DECODER_PROTOCOL. If **Bitmap is not NULL, the caller intends
153   to put the image in the given image buffer. That allows the caller to put an
154   image overlap on the original image. The transparency is handled by the image
155   decoder because the transparency capability depends on the image format. Callers
156   can set Transparent to FALSE to force disabling the transparency process on the
157   image. Forcing Transparent to FALSE may also improve the performance of the image
158   decoding because the image decoder can skip the transparency processing.  If **Bitmap
159   is NULL, the image decoder allocates the memory buffer for the EFI_IMAGE_OUTPUT
160   and decodes the image to the image buffer. It is the caller?s responsibility to
161   free the memory for EFI_IMAGE_OUTPUT. Image decoder doesn?t have to handle the
162   transparency in this case because there is no background image given by the caller.
163   The background color in this case is all black (#00000000).
164 
165   @param This                    EFI_HII_IMAGE_DECODER_PROTOCOL instance.
166   @param Image                   Pointer to the image raw data.
167   @param ImageRawDataSize        Size of the entire image raw data.
168   @param Blt                     EFI_IMAGE_OUTPUT to receive the image or overlap
169                                  the image on the original buffer.
170   @param Transparent             BOOLEAN value indicates whether the image decoder
171                                  has to handle the transparent image or not.
172 
173 
174   @retval EFI_SUCCESS            Image decode success.
175   @retval EFI_UNSUPPORTED        Unsupported format of image.
176   @retval EFI_INVALID_PARAMETER  Incorrect parameter.
177   @retval EFI_BAD_BUFFER_SIZE    Not enough memory.
178 
179 **/
180 typedef
181 EFI_STATUS
182 (EFIAPI *EFI_HII_IMAGE_DECODER_DECODE)(
183   IN      EFI_HII_IMAGE_DECODER_PROTOCOL   *This,
184   IN      VOID                              *Image,
185   IN      UINTN                             ImageRawDataSize,
186   IN OUT  EFI_IMAGE_OUTPUT                  **Bitmap,
187   IN      BOOLEAN                           Transparent
188   );
189 
190 struct _EFI_HII_IMAGE_DECODER_PROTOCOL {
191   EFI_HII_IMAGE_DECODER_GET_NAME          GetImageDecoderName;
192   EFI_HII_IMAGE_DECODER_GET_IMAGE_INFO    GetImageInfo;
193   EFI_HII_IMAGE_DECODER_DECODE            DecodeImage;
194 };
195 
196 extern EFI_GUID  gEfiHiiImageDecoderProtocolGuid;
197 extern EFI_GUID  gEfiHiiImageDecoderNameJpegGuid;
198 extern EFI_GUID  gEfiHiiImageDecoderNamePngGuid;
199 
200 #endif
201