OcBlitLib: Implement VideoToVideo for 180 degree rotation

This commit is contained in:
vit9696 2021-05-08 21:42:10 +03:00
parent a047f7e467
commit dcb414384c
5 changed files with 356 additions and 57 deletions

View File

@ -202,7 +202,6 @@ BlitLibBufferToVideo180 (
Destination -= PixelsPerScanLine;
Height--;
}
return EFI_UNSUPPORTED;
}
return EFI_SUCCESS;

View File

@ -136,4 +136,128 @@ BlitLibBufferToVideo270 (
IN UINTN DeltaPixels
);
/**
Performs a UEFI Graphics Output Protocol Blt Video to Buffer operation
with extended parameters at 0 degree rotation.
@param[in] Configure Pointer to a configuration which was successfully
created by FrameBufferBltConfigure ().
@param[out] BltBuffer Output buffer for pixel color data.
@param[in] SourceX X location within video.
@param[in] SourceY Y location within video.
@param[in] DestinationX X location within BltBuffer.
@param[in] DestinationY Y location within BltBuffer.
@param[in] Width Width (in pixels).
@param[in] Height Height.
@param[in] DeltaPixels Number of pixels in a row of BltBuffer.
@retval RETURN_INVALID_PARAMETER Invalid parameter were passed in.
@retval RETURN_SUCCESS The Blt operation was performed successfully.
**/
RETURN_STATUS
BlitLibVideoToBuffer0 (
IN OC_BLIT_CONFIGURE *Configure,
OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer,
IN UINTN SourceX,
IN UINTN SourceY,
IN UINTN DestinationX,
IN UINTN DestinationY,
IN UINTN Width,
IN UINTN Height,
IN UINTN DeltaPixels
);
/**
Performs a UEFI Graphics Output Protocol Blt Video to Buffer operation
with extended parameters at 90 degree rotation.
@param[in] Configure Pointer to a configuration which was successfully
created by FrameBufferBltConfigure ().
@param[out] BltBuffer Output buffer for pixel color data.
@param[in] SourceX X location within video.
@param[in] SourceY Y location within video.
@param[in] DestinationX X location within BltBuffer.
@param[in] DestinationY Y location within BltBuffer.
@param[in] Width Width (in pixels).
@param[in] Height Height.
@param[in] DeltaPixels Number of pixels in a row of BltBuffer.
@retval RETURN_INVALID_PARAMETER Invalid parameter were passed in.
@retval RETURN_SUCCESS The Blt operation was performed successfully.
**/
RETURN_STATUS
BlitLibVideoToBuffer90 (
IN OC_BLIT_CONFIGURE *Configure,
OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer,
IN UINTN SourceX,
IN UINTN SourceY,
IN UINTN DestinationX,
IN UINTN DestinationY,
IN UINTN Width,
IN UINTN Height,
IN UINTN DeltaPixels
);
/**
Performs a UEFI Graphics Output Protocol Blt Video to Buffer operation
with extended parameters at 180 degree rotation.
@param[in] Configure Pointer to a configuration which was successfully
created by FrameBufferBltConfigure ().
@param[out] BltBuffer Output buffer for pixel color data.
@param[in] SourceX X location within video.
@param[in] SourceY Y location within video.
@param[in] DestinationX X location within BltBuffer.
@param[in] DestinationY Y location within BltBuffer.
@param[in] Width Width (in pixels).
@param[in] Height Height.
@param[in] DeltaPixels Number of pixels in a row of BltBuffer.
@retval RETURN_INVALID_PARAMETER Invalid parameter were passed in.
@retval RETURN_SUCCESS The Blt operation was performed successfully.
**/
RETURN_STATUS
BlitLibVideoToBuffer180 (
IN OC_BLIT_CONFIGURE *Configure,
OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer,
IN UINTN SourceX,
IN UINTN SourceY,
IN UINTN DestinationX,
IN UINTN DestinationY,
IN UINTN Width,
IN UINTN Height,
IN UINTN DeltaPixels
);
/**
Performs a UEFI Graphics Output Protocol Blt Video to Buffer operation
with extended parameters at 270 degree rotation.
@param[in] Configure Pointer to a configuration which was successfully
created by FrameBufferBltConfigure ().
@param[out] BltBuffer Output buffer for pixel color data.
@param[in] SourceX X location within video.
@param[in] SourceY Y location within video.
@param[in] DestinationX X location within BltBuffer.
@param[in] DestinationY Y location within BltBuffer.
@param[in] Width Width (in pixels).
@param[in] Height Height.
@param[in] DeltaPixels Number of pixels in a row of BltBuffer.
@retval RETURN_INVALID_PARAMETER Invalid parameter were passed in.
@retval RETURN_SUCCESS The Blt operation was performed successfully.
**/
RETURN_STATUS
BlitLibVideoToBuffer270 (
IN OC_BLIT_CONFIGURE *Configure,
OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer,
IN UINTN SourceX,
IN UINTN SourceY,
IN UINTN DestinationX,
IN UINTN DestinationY,
IN UINTN Width,
IN UINTN Height,
IN UINTN DeltaPixels
);
#endif // BLIT_INTERNAL_H

View File

@ -0,0 +1,176 @@
/** @file
OcBlitLib - Library to perform blt operations on a frame buffer.
Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2021, vit9696. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include "BlitInternal.h"
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
RETURN_STATUS
BlitLibVideoToBuffer0 (
IN OC_BLIT_CONFIGURE *Configure,
OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer,
IN UINTN SourceX,
IN UINTN SourceY,
IN UINTN DestinationX,
IN UINTN DestinationY,
IN UINTN Width,
IN UINTN Height,
IN UINTN DeltaPixels
)
{
UINT32 *Source;
UINT32 *Destination;
UINT32 *SourceWalker;
UINT32 *DestinationWalker;
UINTN IndexX;
UINTN WidthInBytes;
UINTN PixelsPerScanLine;
UINT32 Uint32;
WidthInBytes = Width * BYTES_PER_PIXEL;
PixelsPerScanLine = Configure->PixelsPerScanLine;
Destination = (UINT32 *) BltBuffer
+ DestinationY * DeltaPixels + DestinationX;
Source = (UINT32 *) Configure->FrameBuffer
+ SourceY * PixelsPerScanLine + SourceX;
if (Configure->PixelFormat == PixelBlueGreenRedReserved8BitPerColor) {
while (Height > 0) {
CopyMem (Destination, Source, WidthInBytes);
Source += PixelsPerScanLine;
Destination += DeltaPixels;
Height--;
}
} else {
while (Height > 0) {
DestinationWalker = (UINT32 *) Configure->LineBuffer;
SourceWalker = (UINT32 *) Source;
for (IndexX = 0; IndexX < Width; IndexX++) {
Uint32 = *SourceWalker++;
*DestinationWalker++ =
(UINT32) (
(((Uint32 << Configure->PixelShl[0]) >> Configure->PixelShr[0]) &
Configure->PixelMasks.RedMask) |
(((Uint32 << Configure->PixelShl[1]) >> Configure->PixelShr[1]) &
Configure->PixelMasks.GreenMask) |
(((Uint32 << Configure->PixelShl[2]) >> Configure->PixelShr[2]) &
Configure->PixelMasks.BlueMask)
);
}
CopyMem (Destination, Configure->LineBuffer, WidthInBytes);
Source += PixelsPerScanLine;
Destination += DeltaPixels;
Height--;
}
}
return EFI_SUCCESS;
}
RETURN_STATUS
BlitLibVideoToBuffer90 (
IN OC_BLIT_CONFIGURE *Configure,
OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer,
IN UINTN SourceX,
IN UINTN SourceY,
IN UINTN DestinationX,
IN UINTN DestinationY,
IN UINTN Width,
IN UINTN Height,
IN UINTN DeltaPixels
)
{
return EFI_UNSUPPORTED;
}
RETURN_STATUS
BlitLibVideoToBuffer180 (
IN OC_BLIT_CONFIGURE *Configure,
OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer,
IN UINTN SourceX,
IN UINTN SourceY,
IN UINTN DestinationX,
IN UINTN DestinationY,
IN UINTN Width,
IN UINTN Height,
IN UINTN DeltaPixels
)
{
UINT32 *Source;
UINT32 *Destination;
UINT32 *SourceWalker;
UINT32 *DestinationWalker;
UINTN IndexX;
UINTN PixelsPerScanLine;
UINT32 Uint32;
PixelsPerScanLine = Configure->PixelsPerScanLine;
SourceX = Configure->Width - SourceX - Width;
SourceY = Configure->Height - SourceY - Height;
Destination = (UINT32 *) BltBuffer
+ DestinationY * DeltaPixels + DestinationX;
Source = (UINT32 *) Configure->FrameBuffer
+ (SourceY + (Height - 1)) * PixelsPerScanLine + SourceX;
if (Configure->PixelFormat == PixelBlueGreenRedReserved8BitPerColor) {
while (Height > 0) {
DestinationWalker = Destination;
SourceWalker = Source + (Width - 1);
for (IndexX = 0; IndexX < Width; IndexX++) {
*DestinationWalker++ = *SourceWalker--;
}
Source -= PixelsPerScanLine;
Destination += DeltaPixels;
Height--;
}
} else {
while (Height > 0) {
DestinationWalker = Destination;
SourceWalker = Source + (Width - 1);
for (IndexX = 0; IndexX < Width; IndexX++) {
Uint32 = *SourceWalker--;
*DestinationWalker++ =
(UINT32) (
(((Uint32 << Configure->PixelShl[0]) >> Configure->PixelShr[0]) &
Configure->PixelMasks.RedMask) |
(((Uint32 << Configure->PixelShl[1]) >> Configure->PixelShr[1]) &
Configure->PixelMasks.GreenMask) |
(((Uint32 << Configure->PixelShl[2]) >> Configure->PixelShr[2]) &
Configure->PixelMasks.BlueMask)
);
}
Source -= PixelsPerScanLine;
Destination += DeltaPixels;
Height--;
}
}
return EFI_SUCCESS;
}
RETURN_STATUS
BlitLibVideoToBuffer270 (
IN OC_BLIT_CONFIGURE *Configure,
OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer,
IN UINTN SourceX,
IN UINTN SourceY,
IN UINTN DestinationX,
IN UINTN DestinationY,
IN UINTN Width,
IN UINTN Height,
IN UINTN DeltaPixels
)
{
return EFI_UNSUPPORTED;
}

View File

@ -292,23 +292,6 @@ BlitLibVideoToBuffer (
IN UINTN Delta
)
{
UINTN DstY;
UINTN SrcY;
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;
UINT8 *Source;
UINT8 *Destination;
UINTN IndexX;
UINT32 Uint32;
UINTN Offset;
UINTN WidthInBytes;
//
// TODO: Implement.
//
if (Configure->Rotation != 0) {
return EFI_UNSUPPORTED;
}
//
// Video to BltBuffer: Source is Video, destination is BltBuffer
//
@ -330,47 +313,63 @@ BlitLibVideoToBuffer (
// pixels size, the number of bytes in each row can be computed.
//
if (Delta == 0) {
Delta = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);
Delta = Width;
} else {
Delta /= BYTES_PER_PIXEL;
}
WidthInBytes = Width * BYTES_PER_PIXEL;
//
// Video to BltBuffer: Source is Video, destination is BltBuffer
//
for (SrcY = SourceY, DstY = DestinationY;
DstY < (Height + DestinationY);
SrcY++, DstY++) {
Offset = (SrcY * Configure->PixelsPerScanLine) + SourceX;
Offset = BYTES_PER_PIXEL * Offset;
Source = Configure->FrameBuffer + Offset;
if (Configure->PixelFormat == PixelBlueGreenRedReserved8BitPerColor) {
Destination = (UINT8 *) BltBuffer + (DstY * Delta) + (DestinationX * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));
} else {
Destination = Configure->LineBuffer;
}
CopyMem (Destination, Source, WidthInBytes);
if (Configure->PixelFormat != PixelBlueGreenRedReserved8BitPerColor) {
for (IndexX = 0; IndexX < Width; IndexX++) {
Blt = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)
((UINT8 *) BltBuffer + (DstY * Delta) +
(DestinationX + IndexX) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));
Uint32 = *(UINT32*) (Configure->LineBuffer + (IndexX * BYTES_PER_PIXEL));
*(UINT32*) Blt =
(UINT32) (
(((Uint32 & Configure->PixelMasks.RedMask) >>
Configure->PixelShl[0]) << Configure->PixelShr[0]) |
(((Uint32 & Configure->PixelMasks.GreenMask) >>
Configure->PixelShl[1]) << Configure->PixelShr[1]) |
(((Uint32 & Configure->PixelMasks.BlueMask) >>
Configure->PixelShl[2]) << Configure->PixelShr[2])
);
}
}
switch (Configure->Rotation) {
case 0:
return BlitLibVideoToBuffer0 (
Configure,
BltBuffer,
SourceX,
SourceY,
DestinationX,
DestinationY,
Width,
Height,
Delta
);
case 90:
return BlitLibVideoToBuffer90 (
Configure,
BltBuffer,
SourceX,
SourceY,
DestinationX,
DestinationY,
Width,
Height,
Delta
);
case 180:
return BlitLibVideoToBuffer180 (
Configure,
BltBuffer,
SourceX,
SourceY,
DestinationX,
DestinationY,
Width,
Height,
Delta
);
case 270:
return BlitLibVideoToBuffer270 (
Configure,
BltBuffer,
SourceX,
SourceY,
DestinationX,
DestinationY,
Width,
Height,
Delta
);
default:
ASSERT (FALSE);
break;
}
return RETURN_SUCCESS;

View File

@ -18,6 +18,7 @@
[Sources.common]
BlitBufferToVideo.c
BlitInternal.h
BlitVideoToBuffer.c
OcBlitLib.c
[LibraryClasses]