From e32e65f7f87e75482c037e88c28ed7391461c25f Mon Sep 17 00:00:00 2001 From: Joursoir Date: Sun, 27 Mar 2022 10:12:24 +0300 Subject: main: support different pixel formats --- UefiMonitorTest/UefiMonitorTest.c | 60 ++++++++++++++++++++++++++++++++------- UefiMonitorTest/UefiMonitorTest.h | 14 +++++++++ 2 files changed, 63 insertions(+), 11 deletions(-) (limited to 'UefiMonitorTest') diff --git a/UefiMonitorTest/UefiMonitorTest.c b/UefiMonitorTest/UefiMonitorTest.c index 8dda9b7..084a8b9 100644 --- a/UefiMonitorTest/UefiMonitorTest.c +++ b/UefiMonitorTest/UefiMonitorTest.c @@ -12,6 +12,14 @@ #include "UefiMonitorTest.h" +CONST EFI_PIXEL_BITMASK mRgbPixelMasks = { + 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 +}; + +CONST EFI_PIXEL_BITMASK mBgrPixelMasks = { + 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 +}; + STATIC VOID PrepareGraphicsInfo ( @@ -19,31 +27,61 @@ PrepareGraphicsInfo ( IN EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop ) { + CONST EFI_PIXEL_BITMASK *BitMask; + UINT32 PixelWidth; + INT8 PixelShl[4]; + INT8 PixelShr[4]; + ASSERT (Graphics != NULL); ASSERT (Gop != NULL); - Graphics->Gop = Gop; - Graphics->FrontBuffer = (UINT8 *)Gop->Mode->FrameBufferBase; - Graphics->BufferSize = Gop->Mode->FrameBufferSize; - Graphics->BackBuffer = AllocateCopyPool (Graphics->BufferSize, Graphics->FrontBuffer); - ASSERT (Graphics->BackBuffer != NULL); - Graphics->Width = Gop->Mode->Info->HorizontalResolution; - Graphics->Height = Gop->Mode->Info->VerticalResolution; - Graphics->PixelWidth = 4; // A pixel is 32-bits - Graphics->Pitch = Graphics->PixelWidth * Gop->Mode->Info->PixelsPerScanLine; + switch (Gop->Mode->Info->PixelFormat) { + case PixelRedGreenBlueReserved8BitPerColor: + BitMask = &mRgbPixelMasks; + break; + + case PixelBlueGreenRedReserved8BitPerColor: + BitMask = &mBgrPixelMasks; + break; + + case PixelBitMask: + BitMask = &Gop->Mode->Info->PixelInformation; + break; + + case PixelBltOnly: + ASSERT (FALSE); + //return RETURN_UNSUPPORTED; + + default: + ASSERT (FALSE); + // return RETURN_INVALID_PARAMETER; + } DEBUG (( DEBUG_INFO, "GOP information:\n" "Mode: %d\n" - "Support a physical frame buffer: %s\n" "Framebuffer address, size: %x, %d\n" "Screen width x height: %d x %d\n", Gop->Mode->Mode, - (Gop->Mode->Info->PixelFormat == PixelBltOnly) ? L"NO" : L"YES", Gop->Mode->FrameBufferBase, Gop->Mode->FrameBufferSize, Gop->Mode->Info->HorizontalResolution, Gop->Mode->Info->VerticalResolution )); + + ParseGraphicsPixelFormat (BitMask, &PixelWidth, PixelShl, PixelShr); + + Graphics->Gop = Gop; + Graphics->FrontBuffer = (UINT8 *)Gop->Mode->FrameBufferBase; + Graphics->BufferSize = Gop->Mode->FrameBufferSize; + Graphics->BackBuffer = AllocateCopyPool (Graphics->BufferSize, Graphics->FrontBuffer); + ASSERT (Graphics->BackBuffer != NULL); + Graphics->Width = Gop->Mode->Info->HorizontalResolution; + Graphics->Height = Gop->Mode->Info->VerticalResolution; + CopyMem (&Graphics->PixelMasks, BitMask, sizeof (*BitMask)); + CopyMem (Graphics->PixelShl, PixelShl, sizeof (PixelShl)); + CopyMem (Graphics->PixelShr, PixelShr, sizeof (PixelShr)); + Graphics->PixelWidth = PixelWidth; + Graphics->Pitch = Graphics->PixelWidth * Gop->Mode->Info->PixelsPerScanLine; } STATIC diff --git a/UefiMonitorTest/UefiMonitorTest.h b/UefiMonitorTest/UefiMonitorTest.h index 97ada85..eb49249 100644 --- a/UefiMonitorTest/UefiMonitorTest.h +++ b/UefiMonitorTest/UefiMonitorTest.h @@ -28,6 +28,20 @@ typedef struct { /// UINT32 Height; /// + /// Bit-mask defines what bits are used for different colors. + /// + EFI_PIXEL_BITMASK PixelMasks; + /// + /// Amount of bits to shift left. + /// R-G-B-Rsvd + /// + INT8 PixelShl[4]; + /// + /// Amount of bits to shift right. + /// R-G-B-Rsvd + /// + INT8 PixelShr[4]; + /// /// The size of pixel color in bytes. /// UINT32 PixelWidth; -- cgit v1.2.3-18-g5258