alder_lake_bios/Insyde/InsydeModulePkg/Universal/Console/SnapScreenDxe/SnapConOut.c

233 lines
4.7 KiB
C

/** @file
SnapScree driver for capature screen image to BMP file.
;******************************************************************************
;* Copyright (c) 2012 - 2018, Insyde Software Corp. All Rights Reserved.
;*
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
;* transmit, broadcast, present, recite, release, license or otherwise exploit
;* any part of this publication in any form, by any means, without the prior
;* written permission of Insyde Software Corporation.
;*
;******************************************************************************
*/
#include "SnapScreen.h"
#include "SnapConOut.h"
#include "SnapTextOutHook.h"
#include <Protocol/GraphicsOutput.h>
#define CHAR_SIZE sizeof(CHAR16)
#define ATTR_SIZE sizeof(UINT8)
static EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *mSnapConOut = NULL;
VOID
GraphicsGetBackground (
UINTN X,
UINTN Y,
UINTN Width,
UINTN Height,
VOID *Buffer
)
{
EFI_STATUS Status;
UINTN GX;
UINTN GY;
UINTN GWidth;
UINTN GHeight;
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
GetActiveVgaGop (&Gop);
GX = X * GLYPH_WIDTH;
GY = Y * GLYPH_HEIGHT;
GWidth = Width * GLYPH_WIDTH;
GHeight = (((Height * 192)/190) + 1) * GLYPH_HEIGHT;
Status = Gop->Blt (
Gop,
Buffer, // Buffer
EfiBltVideoToBltBuffer, // Blt Mode
GX, // Source X
GY, // Source Y
0, // Dest X
0, // Dest Y
GWidth,
GHeight,
0 // Delta
);
}
VOID
GraphicsPutBackground (
UINTN X,
UINTN Y,
UINTN Width,
UINTN Height,
VOID *Buffer
)
{
EFI_STATUS Status;
UINTN GX;
UINTN GY;
UINTN GWidth;
UINTN GHeight;
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
GetActiveVgaGop (&Gop);
GX = X * GLYPH_WIDTH;
GY = Y * GLYPH_HEIGHT;
GWidth = Width * GLYPH_WIDTH;
GHeight = (((Height * 192)/190) + 1) * GLYPH_HEIGHT;
Status = Gop->Blt (
Gop,
Buffer, // Buffer
EfiBltBufferToVideo, // Blt Mode
0, // Source X
0, // Source Y
GX, // Dest X
GY, // Dest Y
GWidth,
GHeight,
0 // Delta
);
}
//
// Hardware abstract Console
//
VOID
DrawHorizontalLine (
IN UINTN x,
IN UINTN y,
IN UINTN Len
)
{
UINTN i;
CHAR16 ChStr[2];
mSnapConOut->SetCursorPosition (mSnapConOut, x, y);
ChStr[0] = BOXDRAW_HORIZONTAL;
ChStr[1] = 0;
for (i = 0; i < Len; i++, x++)
mSnapConOut->OutputString (mSnapConOut, ChStr);
}
VOID
DrawVerticalLine (
IN UINTN x,
IN UINTN y,
IN UINTN Len
)
{
UINTN i;
CHAR16 ChStr[2];
ChStr[0] = BOXDRAW_VERTICAL;
ChStr[1] = 0;
for (i = 0; i < Len; i++, y++) {
mSnapConOut->SetCursorPosition (mSnapConOut, x, y);
mSnapConOut->OutputString (mSnapConOut, ChStr);
}
}
VOID
ScoPrintCharAt (
UINTN ScrX,
UINTN ScrY,
CHAR16 Ch
)
{
CHAR16 ChStr[2];
mSnapConOut->SetCursorPosition (mSnapConOut, ScrX, ScrY);
ChStr[0] = Ch;
ChStr[1] = 0;
mSnapConOut->OutputString (mSnapConOut, ChStr);
}
EFI_STATUS
ScoSetAttribute (
IN UINTN Attribute
)
{
return mSnapConOut->SetAttribute (mSnapConOut, Attribute);
}
EFI_STATUS
ScoSetCursorPosition (
IN UINTN Column,
IN INTN Row
)
{
return mSnapConOut->SetCursorPosition (mSnapConOut, Column, Row);
}
EFI_STATUS
ScoOutputString (
IN CHAR16 *String
)
{
return mSnapConOut->OutputString (mSnapConOut, String);
}
EFI_STATUS
ScoQueryMode (
OUT UINTN *Columns,
OUT UINTN *Rows
)
{
return mSnapConOut->QueryMode (mSnapConOut, mSnapConOut->Mode->Mode, Columns, Rows);
}
EFI_STATUS
ScoEnableCursor (
IN BOOLEAN Enable
)
{
return mSnapConOut->EnableCursor (mSnapConOut, Enable);
}
EFI_STATUS
ScoGetModeInfo (
IN INT32 *CursorColumn,
IN INT32 *CursorRow,
IN BOOLEAN *CursorVisible,
IN INT32 *Attribute
)
{
*CursorColumn = mSnapConOut->Mode->CursorColumn;
*CursorRow = mSnapConOut->Mode->CursorRow;
*CursorVisible = mSnapConOut->Mode->CursorVisible;
*Attribute = mSnapConOut->Mode->Attribute;
return EFI_SUCCESS;
}
EFI_STATUS
InitializeSnapConOut (
VOID
)
{
// Set the global ConOut protocol
mSnapConOut = gST->ConOut;
return EFI_SUCCESS;
}