4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FrameBufferBltLib - Library to perform blt operations on a frame buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "PiDxe.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/BaseLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/BaseMemoryLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/BltLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/DebugLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define VDEBUG DEBUG
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define VDEBUG(x)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define MAX_LINE_BUFFER_SIZE (SIZE_4KB * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN mBltLibColorDepth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN mBltLibWidthInBytes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN mBltLibBytesPerPixel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN mBltLibWidthInPixels;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN mBltLibHeight;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 mBltLibLineBuffer[MAX_LINE_BUFFER_SIZE];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *mBltLibFrameBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_GRAPHICS_PIXEL_FORMAT mPixelFormat;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_PIXEL_BITMASK mPixelBitMasks;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncINTN mPixelShl[4]; // R-G-B-Rsvd
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncINTN mPixelShr[4]; // R-G-B-Rsvd
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncConfigurePixelBitMaskFormat (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_PIXEL_BITMASK *BitMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Loop;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 *Masks;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 MergedMasks;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MergedMasks = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Masks = (UINT32*) BitMask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Loop = 0; Loop < 3; Loop++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((Loop == 3) || (Masks[Loop] != 0));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((MergedMasks & Masks[Loop]) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPixelShl[Loop] = HighBitSet32 (Masks[Loop]) - 23 + (Loop * 8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mPixelShl[Loop] < 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPixelShr[Loop] = -mPixelShl[Loop];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPixelShl[Loop] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPixelShr[Loop] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MergedMasks = (UINT32) (MergedMasks | Masks[Loop]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "%d: shl:%d shr:%d mask:%x\n", Loop, mPixelShl[Loop], mPixelShr[Loop], Masks[Loop]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MergedMasks = (UINT32) (MergedMasks | Masks[3]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (MergedMasks != 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBltLibBytesPerPixel = (UINTN) ((HighBitSet32 (MergedMasks) + 7) / 8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "Bytes per pixel: %d\n", mBltLibBytesPerPixel));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&mPixelBitMasks, BitMask, sizeof (*BitMask));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Configure the FrameBufferLib instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FrameBuffer Pointer to the start of the frame buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FrameBufferInfo Describes the frame buffer characteristics
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER - Invalid parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED - The BltLib does not support this configuration
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS - Blt operation success
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBltLibConfigure (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *FrameBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STATIC EFI_PIXEL_BITMASK RgbPixelMasks =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STATIC EFI_PIXEL_BITMASK BgrPixelMasks =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync { 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (FrameBufferInfo->PixelFormat) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case PixelRedGreenBlueReserved8BitPerColor:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigurePixelBitMaskFormat (&RgbPixelMasks);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case PixelBlueGreenRedReserved8BitPerColor:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigurePixelBitMaskFormat (&BgrPixelMasks);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case PixelBitMask:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigurePixelBitMaskFormat (&(FrameBufferInfo->PixelInformation));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case PixelBltOnly:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (FrameBufferInfo->PixelFormat != PixelBltOnly);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPixelFormat = FrameBufferInfo->PixelFormat;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBltLibFrameBuffer = (UINT8*) FrameBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBltLibWidthInPixels = (UINTN) FrameBufferInfo->HorizontalResolution;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBltLibHeight = (UINTN) FrameBufferInfo->VerticalResolution;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBltLibWidthInBytes = mBltLibWidthInPixels * mBltLibBytesPerPixel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (mBltLibWidthInBytes < sizeof (mBltLibLineBuffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Performs a UEFI Graphics Output Protocol Blt operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in,out] BltBuffer - The data to transfer to screen
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] BltOperation - The operation to perform
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SourceX - The X coordinate of the source for BltOperation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SourceY - The Y coordinate of the source for BltOperation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DestinationX - The X coordinate of the destination for BltOperation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DestinationY - The Y coordinate of the destination for BltOperation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Width - The width of a rectangle in the blt rectangle in pixels
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Height - The height of a rectangle in the blt rectangle in pixels
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Delta - Not used for EfiBltVideoFill and EfiBltVideoToVideo operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If a Delta of 0 is used, the entire BltBuffer will be operated on.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If a subrectangle of the BltBuffer is used, then Delta represents
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the number of bytes in a row of the BltBuffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR - A hardware error occured
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER - Invalid parameter passed in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS - Blt operation success
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBltLibGopBlt (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN SourceX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN SourceY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DestinationX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DestinationY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Height,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Delta
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (BltOperation) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiBltVideoToBltBuffer:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return BltLibVideoToBltBufferEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SourceX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SourceY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DestinationX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DestinationY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Height,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delta
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiBltVideoToVideo:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return BltLibVideoToVideo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SourceX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SourceY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DestinationX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DestinationY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Height
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiBltVideoFill:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return BltLibVideoFill (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DestinationX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DestinationY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Height
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EfiBltBufferToVideo:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return BltLibBufferToVideoEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SourceX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SourceY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DestinationX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DestinationY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Height,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delta
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Performs a UEFI Graphics Output Protocol Blt Video Fill.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Color Color to fill the region with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DestinationX X location to start fill operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DestinationY Y location to start fill operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Width Width (in pixels) to fill
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Height Height to fill
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR - A hardware error occured
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER - Invalid parameter passed in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS - The sizes were returned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBltLibVideoFill (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Color,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DestinationX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DestinationY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Height
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DstY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *BltMemSrc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *BltMemDst;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN X;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Uint8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Uint32;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 WideFill;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN UseWideFill;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN LineBufferReady;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN WidthInBytes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN SizeInBytes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // BltBuffer to Video: Source is BltBuffer, destination is Video
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DestinationY + Height > mBltLibHeight) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "VideoFill: Past screen (Y)\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DestinationX + Width > mBltLibWidthInPixels) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "VideoFill: Past screen (X)\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Width == 0 || Height == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((EFI_D_INFO, "VideoFill: Width or Height is 0\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WidthInBytes = Width * mBltLibBytesPerPixel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Uint32 = *(UINT32*) Color;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WideFill =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT32) (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((Uint32 << mPixelShl[0]) >> mPixelShr[0]) & mPixelBitMasks.RedMask) |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((Uint32 << mPixelShl[1]) >> mPixelShr[1]) & mPixelBitMasks.GreenMask) |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((Uint32 << mPixelShl[2]) >> mPixelShr[2]) & mPixelBitMasks.BlueMask)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VDEBUG ((EFI_D_INFO, "VideoFill: color=0x%x, wide-fill=0x%x\n", Uint32, WideFill));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the size of the pixel data evenly divides the sizeof
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // WideFill, then a wide fill operation can be used
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UseWideFill = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((sizeof (WideFill) % mBltLibBytesPerPixel) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (X = mBltLibBytesPerPixel; X < sizeof (WideFill); X++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((UINT8*)&WideFill)[X] = ((UINT8*)&WideFill)[X % mBltLibBytesPerPixel];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If all the bytes in the pixel are the same value, then use
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // a wide fill operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync X = 1, Uint8 = ((UINT8*)&WideFill)[0];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync X < mBltLibBytesPerPixel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync X++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Uint8 != ((UINT8*)&WideFill)[X]) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UseWideFill = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (UseWideFill) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem ((VOID*) &WideFill, sizeof (WideFill), Uint8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (UseWideFill && (DestinationX == 0) && (Width == mBltLibWidthInPixels)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VDEBUG ((EFI_D_INFO, "VideoFill (wide, one-shot)\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = DestinationY * mBltLibWidthInPixels;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = mBltLibBytesPerPixel * Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltMemDst = (VOID*) (mBltLibFrameBuffer + Offset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SizeInBytes = WidthInBytes * Height;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SizeInBytes >= 8) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem32 (BltMemDst, SizeInBytes & ~3, (UINT32) WideFill);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SizeInBytes = SizeInBytes & 3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SizeInBytes > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem (BltMemDst, SizeInBytes, (UINT8)(UINTN) WideFill);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineBufferReady = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (DstY = DestinationY; DstY < (Height + DestinationY); DstY++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = (DstY * mBltLibWidthInPixels) + DestinationX;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = mBltLibBytesPerPixel * Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltMemDst = (VOID*) (mBltLibFrameBuffer + Offset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (UseWideFill && (((UINTN) BltMemDst & 7) == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VDEBUG ((EFI_D_INFO, "VideoFill (wide)\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SizeInBytes = WidthInBytes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SizeInBytes >= 8) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem64 (BltMemDst, SizeInBytes & ~7, WideFill);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SizeInBytes = SizeInBytes & 7;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SizeInBytes > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (BltMemDst, (VOID*) &WideFill, SizeInBytes);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VDEBUG ((EFI_D_INFO, "VideoFill (not wide)\n"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!LineBufferReady) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (mBltLibLineBuffer, &WideFill, mBltLibBytesPerPixel);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (X = 1; X < Width; ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (mBltLibLineBuffer + (X * mBltLibBytesPerPixel)),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBltLibLineBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MIN (X, Width - X) * mBltLibBytesPerPixel
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync X = X + MIN (X, Width - X);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltMemSrc = (VOID *) mBltLibLineBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineBufferReady = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (BltMemDst, mBltLibLineBuffer, WidthInBytes);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Performs a UEFI Graphics Output Protocol Blt Video to Buffer operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] BltBuffer Output buffer for pixel color data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SourceX X location within video
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SourceY Y location within video
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Width Width (in pixels)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Height Height
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR - A hardware error occured
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER - Invalid parameter passed in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS - The sizes were returned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBltLibVideoToBltBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN SourceX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN SourceY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Height
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return BltLibVideoToBltBufferEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SourceX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SourceY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Height,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Performs a UEFI Graphics Output Protocol Blt Video to Buffer operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync with extended parameters.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] BltBuffer Output buffer for pixel color data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SourceX X location within video
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SourceY Y location within video
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DestinationX X location within BltBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DestinationY Y location within BltBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Width Width (in pixels)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Height Height
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Delta Number of bytes in a row of BltBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR - A hardware error occured
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER - Invalid parameter passed in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS - The sizes were returned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBltLibVideoToBltBufferEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN SourceX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN SourceY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DestinationX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DestinationY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Height,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Delta
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DstY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN SrcY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *BltMemSrc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *BltMemDst;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN X;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Uint32;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN WidthInBytes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Video to BltBuffer: Source is Video, destination is BltBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SourceY + Height > mBltLibHeight) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SourceX + Width > mBltLibWidthInPixels) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Width == 0 || Height == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If Delta is zero, then the entire BltBuffer is being used, so Delta
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // is the number of bytes in each row of BltBuffer. Since BltBuffer is Width pixels size,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the number of bytes in each row can be computed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Delta == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delta = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WidthInBytes = Width * mBltLibBytesPerPixel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Video to BltBuffer: Source is Video, destination is BltBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (SrcY = SourceY, DstY = DestinationY; DstY < (Height + DestinationY); SrcY++, DstY++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = (SrcY * mBltLibWidthInPixels) + SourceX;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = mBltLibBytesPerPixel * Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltMemSrc = (VOID *) (mBltLibFrameBuffer + Offset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mPixelFormat == PixelBlueGreenRedReserved8BitPerColor) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltMemDst =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *) (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT8 *) BltBuffer +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (DstY * Delta) +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (DestinationX * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltMemDst = (VOID *) mBltLibLineBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (BltMemDst, BltMemSrc, WidthInBytes);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mPixelFormat != PixelBlueGreenRedReserved8BitPerColor) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (X = 0; X < Width; X++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Blt = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) ((UINT8 *) BltBuffer + (DstY * Delta) + (DestinationX + X) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Uint32 = *(UINT32*) (mBltLibLineBuffer + (X * mBltLibBytesPerPixel));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(UINT32*) Blt =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT32) (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((Uint32 & mPixelBitMasks.RedMask) >> mPixelShl[0]) << mPixelShr[0]) |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((Uint32 & mPixelBitMasks.GreenMask) >> mPixelShl[1]) << mPixelShr[1]) |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((Uint32 & mPixelBitMasks.BlueMask) >> mPixelShl[2]) << mPixelShr[2])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Performs a UEFI Graphics Output Protocol Blt Buffer to Video operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] BltBuffer Output buffer for pixel color data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DestinationX X location within video
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DestinationY Y location within video
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Width Width (in pixels)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Height Height
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR - A hardware error occured
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER - Invalid parameter passed in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS - The sizes were returned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBltLibBufferToVideo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DestinationX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DestinationY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Height
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return BltLibBufferToVideoEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DestinationX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DestinationY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Height,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Performs a UEFI Graphics Output Protocol Blt Buffer to Video operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync with extended parameters.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] BltBuffer Output buffer for pixel color data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SourceX X location within BltBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SourceY Y location within BltBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DestinationX X location within video
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DestinationY Y location within video
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Width Width (in pixels)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Height Height
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Delta Number of bytes in a row of BltBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR - A hardware error occured
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER - Invalid parameter passed in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS - The sizes were returned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBltLibBufferToVideoEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN SourceX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN SourceY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DestinationX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DestinationY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Height,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Delta
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DstY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN SrcY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *BltMemSrc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *BltMemDst;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN X;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Uint32;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN WidthInBytes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // BltBuffer to Video: Source is BltBuffer, destination is Video
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DestinationY + Height > mBltLibHeight) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DestinationX + Width > mBltLibWidthInPixels) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Width == 0 || Height == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If Delta is zero, then the entire BltBuffer is being used, so Delta
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // is the number of bytes in each row of BltBuffer. Since BltBuffer is Width pixels size,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the number of bytes in each row can be computed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Delta == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delta = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WidthInBytes = Width * mBltLibBytesPerPixel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (SrcY = SourceY, DstY = DestinationY; SrcY < (Height + SourceY); SrcY++, DstY++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = (DstY * mBltLibWidthInPixels) + DestinationX;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = mBltLibBytesPerPixel * Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltMemDst = (VOID*) (mBltLibFrameBuffer + Offset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mPixelFormat == PixelBlueGreenRedReserved8BitPerColor) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltMemSrc = (VOID *) ((UINT8 *) BltBuffer + (SrcY * Delta));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (X = 0; X < Width; X++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Blt =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT8 *) BltBuffer +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (SrcY * Delta) +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((SourceX + X) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Uint32 = *(UINT32*) Blt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(UINT32*) (mBltLibLineBuffer + (X * mBltLibBytesPerPixel)) =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT32) (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((Uint32 << mPixelShl[0]) >> mPixelShr[0]) & mPixelBitMasks.RedMask) |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((Uint32 << mPixelShl[1]) >> mPixelShr[1]) & mPixelBitMasks.GreenMask) |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((Uint32 << mPixelShl[2]) >> mPixelShr[2]) & mPixelBitMasks.BlueMask)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltMemSrc = (VOID *) mBltLibLineBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (BltMemDst, BltMemSrc, WidthInBytes);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Performs a UEFI Graphics Output Protocol Blt Video to Video operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SourceX X location within video
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SourceY Y location within video
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DestinationX X location within video
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DestinationY Y location within video
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Width Width (in pixels)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Height Height
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR - A hardware error occured
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER - Invalid parameter passed in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS - The sizes were returned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBltLibVideoToVideo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN SourceX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN SourceY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DestinationX,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DestinationY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Height
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *BltMemSrc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *BltMemDst;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN WidthInBytes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN LineStride;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Video to Video: Source is Video, destination is Video
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SourceY + Height > mBltLibHeight) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SourceX + Width > mBltLibWidthInPixels) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DestinationY + Height > mBltLibHeight) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DestinationX + Width > mBltLibWidthInPixels) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Width == 0 || Height == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WidthInBytes = Width * mBltLibBytesPerPixel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = (SourceY * mBltLibWidthInPixels) + SourceX;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = mBltLibBytesPerPixel * Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltMemSrc = (VOID *) (mBltLibFrameBuffer + Offset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = (DestinationY * mBltLibWidthInPixels) + DestinationX;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = mBltLibBytesPerPixel * Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltMemDst = (VOID *) (mBltLibFrameBuffer + Offset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineStride = mBltLibWidthInBytes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((UINTN) BltMemDst > (UINTN) BltMemSrc) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineStride = -LineStride;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (Height > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (BltMemDst, BltMemSrc, WidthInBytes);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltMemSrc = (VOID*) ((UINT8*) BltMemSrc + LineStride);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BltMemDst = (VOID*) ((UINT8*) BltMemDst + LineStride);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Height--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Returns the sizes related to the video device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Width Width (in pixels)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Height Height (in pixels)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER - Invalid parameter passed in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS - The sizes were returned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBltLibGetSizes (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *Width, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *Height OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Width != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Width = mBltLibWidthInPixels;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Height != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Height = mBltLibHeight;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync