EFI_STATUS EFIAPI GetImageDims (//IN APPLE_IMAGE_CODEC_PROTOCOL* This, VOID *ImageBuffer, UINTN ImageSize, UINT32 *ImageWidth, UINT32 *ImageHeight ) { EG_IMAGE *Image; DBG("AppleImageCodec GetImageDims: Status = "); Image = egDecodeAny((UINT8*)ImageBuffer, ImageSize, FALSE); if (Image == NULL) { DBG("EFI_UNSUPPORTED\n"); return EFI_UNSUPPORTED; } *ImageWidth = (UINT32)Image->Width; *ImageHeight = (UINT32)Image->Height; DBG("EFI_SUCCESS, Width=%d, Height=%d\n", *ImageWidth, *ImageHeight); DBG("ImageBuffer=%p, ImageSize=%d\n", ImageBuffer, ImageSize); DBG("ImageWidth=%p, ImageHeight=%p\n", ImageWidth, ImageHeight); DBG("Decoded: W=%d, H=%d\n", Image->Width, Image->Height); egFreeImage(Image); return EFI_SUCCESS; }
EFI_STATUS EFIAPI RecognizeImageData (//IN APPLE_IMAGE_CODEC_PROTOCOL* This, VOID *ImageBuffer, UINTN ImageSize, OUT VOID **OutBuffer ) { EG_IMAGE *Image; if (!ImageBuffer) { return EFI_INVALID_PARAMETER; } if (*(UINT16*)ImageBuffer == 0x02) { return EFI_SUCCESS; //this is efires image } DBG("AppleImageCodec RecognizeImageData: Status = "); Image = egDecodeAny((UINT8*)ImageBuffer, ImageSize, FALSE); if (Image == NULL) { DBG("EFI_UNSUPPORTED\n"); return EFI_UNSUPPORTED; } DBG("EFI_SUCCESS\n"); DBG("ImageBuffer=%p, ImageSize=%d\n", ImageBuffer, ImageSize); DBG("Decoded: W=%d, H=%d\n", Image->Width, Image->Height); egFreeImage(Image); return EFI_SUCCESS; }
// Load a font bitmap from the specified file VOID egLoadFont(IN CHAR16 *Filename) { if (BaseFontImage) egFreeImage(BaseFontImage); BaseFontImage = egLoadImage(SelfDir, Filename, TRUE); if (BaseFontImage == NULL) Print(L"Note: Font image file %s is invalid! Using default font!\n"); egPrepareFont(); } // BOOLEAN egLoadFont()
VOID egFreeImageView(IN EG_IMAGE_VIEW *ImageView) { if (ImageView != NULL) { if (ImageView->Image != NULL) egFreeImage(ImageView->Image); if (ImageView->Name != NULL) FreePool(ImageView->Name); FreePool(ImageView); } }
VOID BltImageAlpha(IN EG_IMAGE *Image, IN UINTN XPos, IN UINTN YPos, IN EG_PIXEL *BackgroundPixel) { EG_IMAGE *CompImage; // compose on background CompImage = egCreateFilledImage(Image->Width, Image->Height, FALSE, BackgroundPixel); egComposeImage(CompImage, Image, 0, 0); // blit to screen and clean up egDrawImage(CompImage, XPos, YPos); egFreeImage(CompImage); GraphicsScreenDirty = TRUE; }
VOID egScreenShot(VOID) { EFI_STATUS Status; EG_IMAGE *Image; UINT8 *FileData; UINTN FileDataLength; UINTN Index; if (!egHasGraphics) return; // allocate a buffer for the whole screen Image = egCreateImage(egScreenWidth, egScreenHeight, FALSE); if (Image == NULL) { Print(L"Error egCreateImage returned NULL\n"); goto bailout_wait; } // get full screen image if (GraphicsOutput != NULL) { GraphicsOutput->Blt(GraphicsOutput, (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)Image->PixelData, EfiBltVideoToBltBuffer, 0, 0, 0, 0, Image->Width, Image->Height, 0); } else if (UgaDraw != NULL) { UgaDraw->Blt(UgaDraw, (EFI_UGA_PIXEL *)Image->PixelData, EfiUgaVideoToBltBuffer, 0, 0, 0, 0, Image->Width, Image->Height, 0); } // encode as BMP egEncodeBMP(Image, &FileData, &FileDataLength); egFreeImage(Image); if (FileData == NULL) { Print(L"Error egEncodeBMP returned NULL\n"); goto bailout_wait; } // save to file on the ESP Status = egSaveFile(NULL, L"screenshot.bmp", FileData, FileDataLength); FreePool(FileData); if (EFI_ERROR(Status)) { Print(L"Error egSaveFile: %x\n", Status); goto bailout_wait; } return; // DEBUG: switch to text mode bailout_wait: egSetGraphicsModeEnabled(FALSE); BS->WaitForEvent(1, &ST->ConIn->WaitForKey, &Index); }
EFI_STATUS EFIAPI DecodeImageData (//IN APPLE_IMAGE_CODEC_PROTOCOL* This, VOID *ImageBuffer, UINTN ImageSize, EFI_UGA_PIXEL **RawImageData, UINT32 *RawImageDataSize ) { EFI_STATUS Status; EG_IMAGE *Image; INTN Index; //automatic choose format if (!RawImageData || !RawImageDataSize) { return EFI_INVALID_PARAMETER; } DBG("AppleImageCodec DecodeImageData: Status = "); Image = egDecodeAny((UINT8*)ImageBuffer, ImageSize, FALSE); if (Image == NULL) { DBG("EFI_UNSUPPORTED\n"); return EFI_UNSUPPORTED; } *RawImageDataSize = (UINT32)(Image->Width * Image->Height * sizeof(EFI_UGA_PIXEL)); Status = gBS->AllocatePool(EfiBootServicesData, *RawImageDataSize, (VOID **)RawImageData); if (!EFI_ERROR(Status)) { gBS->CopyMem(*RawImageData, (VOID*)Image->PixelData, *RawImageDataSize); } DBG("EFI_SUCCESS, RawImageDataSize=%d\n", *RawImageDataSize); DBG("ImageBuffer=%p, ImageSize=%d\n", ImageBuffer, ImageSize); DBG("Decoded: W=%d, H=%d\n", Image->Width, Image->Height); for (Index=0; Index<10; Index++) { DBG("P%d: r,g,b,a= %x, %x, %x, %x\n", Index, (*RawImageData)[Index].Red, (*RawImageData)[Index].Green, (*RawImageData)[Index].Blue, (*RawImageData)[Index].Reserved); } egFreeImage(Image); return EFI_SUCCESS; }
EG_IMAGE_VIEW * egCreateImageView(IN UINTN Width, IN UINTN Height, IN BOOLEAN HasAlpha, IN UINTN PosX, IN UINTN PosY, IN CHAR16 *Name) { EG_IMAGE_VIEW * NewImageView; NewImageView = (EG_IMAGE_VIEW *) AllocateZeroPool(sizeof(EG_IMAGE_VIEW)); if (NewImageView == NULL) return NULL; NewImageView->Image = egCreateImage(Width, Height, HasAlpha); if (NewImageView->Image == NULL) { FreePool(NewImageView); return NULL; } NewImageView->Name = PoolPrint(Name); if (NewImageView->Name == NULL) { egFreeImage(NewImageView->Image); FreePool(NewImageView); return NULL; } NewImageView->PosX = PosX; NewImageView->PosY = PosY; return NewImageView; }
VOID BltClearScreen(BOOLEAN ShowBanner) { static EG_IMAGE *Banner = NULL; EG_IMAGE *NewBanner = NULL; INTN BannerPosX, BannerPosY; EG_PIXEL Black = { 0x0, 0x0, 0x0, 0 }; if (ShowBanner && !(GlobalConfig.HideUIFlags & HIDEUI_FLAG_BANNER)) { // load banner on first call if (Banner == NULL) { if (GlobalConfig.BannerFileName) Banner = egLoadImage(SelfDir, GlobalConfig.BannerFileName, FALSE); if (Banner == NULL) Banner = egPrepareEmbeddedImage(&egemb_refind_banner, FALSE); } if (Banner) { if (GlobalConfig.BannerScale == BANNER_FILLSCREEN) { if ((Banner->Height != UGAHeight) || (Banner->Width != UGAWidth)) { NewBanner = egScaleImage(Banner, UGAWidth, UGAHeight); } // if } else if ((Banner->Width > UGAWidth) || (Banner->Height > UGAHeight)) { NewBanner = egCropImage(Banner, 0, 0, (Banner->Width > UGAWidth) ? UGAWidth : Banner->Width, (Banner->Height > UGAHeight) ? UGAHeight : Banner->Height); } // if/elseif if (NewBanner) { MyFreePool(Banner); Banner = NewBanner; } MenuBackgroundPixel = Banner->PixelData[0]; } // if Banner exists // clear and draw banner if (GlobalConfig.ScreensaverTime != -1) egClearScreen(&MenuBackgroundPixel); else egClearScreen(&Black); if (Banner != NULL) { BannerPosX = (Banner->Width < UGAWidth) ? ((UGAWidth - Banner->Width) / 2) : 0; BannerPosY = (INTN) (ComputeRow0PosY() / 2) - (INTN) Banner->Height; if (BannerPosY < 0) BannerPosY = 0; GlobalConfig.BannerBottomEdge = BannerPosY + Banner->Height; if (GlobalConfig.ScreensaverTime != -1) BltImage(Banner, (UINTN) BannerPosX, (UINTN) BannerPosY); } } else { // not showing banner // clear to menu background color egClearScreen(&MenuBackgroundPixel); if (GlobalConfig.SavedScreen != NULL) { BltImage(GlobalConfig.SavedScreen, 0, 0); } } GraphicsScreenDirty = FALSE; egFreeImage(GlobalConfig.ScreenBackground); GlobalConfig.ScreenBackground = egCopyScreen(); } // VOID BltClearScreen()