17#include <Library/BaseMemoryLib.h>
18#include <Library/BaseOverflowLib.h>
19#include <Library/DebugLib.h>
20#include <Library/MemoryAllocationLib.h>
24#include <Library/UefiBootServicesTableLib.h>
28 mPngHeader[] = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A };
38 if ((ImageBuffer == NULL) || (ImageSize == 0)) {
39 return EFI_INVALID_PARAMETER;
45 return EFI_UNSUPPORTED;
57 OUT UINT32 *ImageWidth,
58 OUT UINT32 *ImageHeight
63 if ( (ImageBuffer == NULL)
65 || (ImageWidth == NULL)
66 || (ImageHeight == NULL))
68 return EFI_INVALID_PARAMETER;
71 Status =
OcGetPngDims (ImageBuffer, ImageSize, ImageWidth, ImageHeight);
73 if (EFI_ERROR (Status)) {
74 DEBUG ((DEBUG_INFO,
"OCIC: Failed to obtain image dimensions for image\n"));
86 IN OUT EFI_UGA_PIXEL **RawImageData,
87 IN OUT UINTN *RawImageDataSize
95 EFI_UGA_PIXEL *PixelWalker;
100 STATIC_ASSERT (
sizeof (EFI_UGA_PIXEL) ==
sizeof (UINT32),
"Unsupported pixel size");
101 STATIC_ASSERT (OFFSET_OF (EFI_UGA_PIXEL, Blue) == 0,
"Unsupported pixel format");
102 STATIC_ASSERT (OFFSET_OF (EFI_UGA_PIXEL, Green) == 1,
"Unsupported pixel format");
103 STATIC_ASSERT (OFFSET_OF (EFI_UGA_PIXEL, Red) == 2,
"Unsupported pixel format");
106 if ( (ImageBuffer == NULL)
108 || (RawImageData == NULL)
109 || (RawImageDataSize == NULL))
111 return EFI_INVALID_PARAMETER;
117 (VOID **)&RealImageData,
123 if (EFI_ERROR (Status)) {
124 return EFI_UNSUPPORTED;
127 PixelCount = (UINTN)Width * Height;
128 ByteCount = PixelCount *
sizeof (*RawImageData);
135 if (*RawImageData != NULL) {
136 if (*RawImageDataSize < ByteCount) {
137 FreePool (RealImageData);
138 *RawImageDataSize = ByteCount;
139 return EFI_BUFFER_TOO_SMALL;
142 CopyMem (*RawImageData, RealImageData, ByteCount);
143 FreePool (RealImageData);
144 *RawImageDataSize = ByteCount;
146 *RawImageData = RealImageData;
149 PixelWalker = *RawImageData;
151 for (Index = 0; Index < PixelCount; ++Index) {
152 TmpChannel = PixelWalker->Blue;
153 PixelWalker->Blue = PixelWalker->Red;
154 PixelWalker->Red = TmpChannel;
155 PixelWalker->Reserved = 0xFF - PixelWalker->Reserved;
179 return EFI_INVALID_PARAMETER;
183 return EFI_UNSUPPORTED;
196 IN OUT EFI_UGA_PIXEL **RawImageData,
197 IN OUT UINTN *RawImageDataSize
203 || (RawImageData == NULL)
204 || (RawImageDataSize == NULL))
206 return EFI_INVALID_PARAMETER;
210 return EFI_UNSUPPORTED;
236 EFI_HANDLE NewHandle;
240 if (EFI_ERROR (Status)) {
241 DEBUG ((DEBUG_ERROR,
"OCIC: Uninstall failed - %r\n", Status));
245 Status =
gBS->LocateProtocol (
248 (VOID **)&AppleImageConversionInterface
250 if (!EFI_ERROR (Status)) {
251 return AppleImageConversionInterface;
256 Status =
gBS->InstallMultipleProtocolInterfaces (
263 if (EFI_ERROR (Status)) {
EFI_GUID gAppleImageConversionProtocolGuid
#define APPLE_IMAGE_CONVERSION_PROTOCOL_ANY_EXTENSION
#define APPLE_IMAGE_CONVERSION_PROTOCOL_REVISION
STATIC EFI_STATUS EFIAPI RecognizeImageData(IN VOID *ImageBuffer, IN UINTN ImageSize)
APPLE_IMAGE_CONVERSION_PROTOCOL * OcAppleImageConversionInstallProtocol(IN BOOLEAN Reinstall)
STATIC APPLE_IMAGE_CONVERSION_PROTOCOL mAppleImageConversion
STATIC EFI_STATUS EFIAPI DecodeImageData(IN VOID *ImageBuffer, IN UINTN ImageSize, IN OUT EFI_UGA_PIXEL **RawImageData, IN OUT UINTN *RawImageDataSize)
STATIC EFI_STATUS EFIAPI GetImageDimsEx(IN VOID *Buffer, IN UINTN BufferSize, IN UINTN Scale, OUT UINT32 *Width, OUT UINT32 *Height)
STATIC CONST UINT8 mPngHeader[]
STATIC EFI_STATUS EFIAPI DecodeImageDataEx(IN VOID *Buffer, IN UINTN BufferSize, IN UINTN Scale, IN OUT EFI_UGA_PIXEL **RawImageData, IN OUT UINTN *RawImageDataSize)
STATIC EFI_STATUS EFIAPI GetImageDims(IN VOID *ImageBuffer, IN UINTN ImageSize, OUT UINT32 *ImageWidth, OUT UINT32 *ImageHeight)
STATIC_ASSERT(BYTES_PER_PIXEL==sizeof(UINT32), "Non 4-byte pixels are unsupported!")
EFI_STATUS OcUninstallAllProtocolInstances(EFI_GUID *Protocol)
EFI_STATUS OcGetPngDims(IN VOID *Buffer, IN UINTN Size, OUT UINT32 *Width, OUT UINT32 *Height)
EFI_STATUS OcDecodePng(IN VOID *Buffer, IN UINTN Size, OUT VOID **RawData, OUT UINT32 *Width, OUT UINT32 *Height, OUT BOOLEAN *HasAlphaType OPTIONAL)
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
INTN EFIAPI CompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)