UEFI原理与编程实践--图像显示GRAPHICS_OUTPUT_PROTOCOL

GOP,也就是GRAPHICS_OUTPUT_PROTOCOL的简称,GOP包含三个成员函数和一个成员变量:

Status = gBS->LocateProtocol (
                  &gEfiGraphicsOutputProtocolGuid,
                  NULL,
                  (VOID **)&GraphicsOutput
                  );
struct _EFI_GRAPHICS_OUTPUT_PROTOCOL {
  EFI_GRAPHICS_OUTPUT_PROTOCOL_QUERY_MODE  QueryMode;
  EFI_GRAPHICS_OUTPUT_PROTOCOL_SET_MODE    SetMode;
  EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT         Blt;
  EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE        *Mode;
};

成员函数 QueryMode,用于查询显示模式

Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) ModeNumber, SizeOfInfo, Info);

Info->HorizontalResolution

Info->VerticalResolution

成员函数 SetMode,用于设置显示模式,如设置为文本界面模式

Status = GraphicsOutput->SetMode (GraphicsOutput,(UINT32) ModeNumber);

成员函数Blt,块传输的简称,用于将图像输出到屏幕或从屏幕读取图像

typedef
EFI_STATUS
(EFIAPI *EFI_GRAPHICS_OUTPUT_PROTOCOL_BLT)(
  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL            *This,
  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL           *BltBuffer,   OPTIONAL//图像缓冲区
  IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION       BltOperation,//进行的操作,如输出到屏幕
  IN  UINTN                                   SourceX,//源的X坐标
  IN  UINTN                                   SourceY,//源的Y坐标
  IN  UINTN                                   DestinationX,//目的缓冲区的X坐标
  IN  UINTN                                   DestinationY,//目的缓冲区的Y坐标
  IN  UINTN                                   Width,//操作区域的宽度
  IN  UINTN                                   Height,//操作区域的高度
  IN  UINTN                                   Delta         OPTIONAL//图像缓冲区每行的字节数
  );

通过Blt函数,可以执行如下4种操作:

1、将整个屏幕填充为某个单一颜色

EFI_GRAPHICS_OUTPUT_BLT_PIXEL BltBuffer[]={0,0,255,0};

Status = GraphicsOutput->Blt (
                      GraphicsOutput,
                      BltBuffer,//BltBuffer中的图像显示到屏幕上
                      EfiBltVideoFill, 
                      0,
                      0,
                      0,//(UINTN) (SizeOfX - Width) / 2,
                      0,// (UINTN) (SizeOfY - Height) / 2,
                      1024,//Width,
                      768,//Height,
                      0//Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
                      );

2、将图片显示到屏幕

Status = GraphicsOutput->Blt (
                      GraphicsOutput,
                      BltBuffer,//BltBuffer中的图像显示到屏幕上
                      EfiBltBufferToVideo, 
                      0,
                      0,
                      0,//(UINTN) (SizeOfX - Width) / 2,
                      0,// (UINTN) (SizeOfY - Height) / 2,
                      1024,//Width,
                      768,//Height,
                      0//Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
                      );

3、将屏幕区域复制到图像

Status = GraphicsOutput->Blt (
                      GraphicsOutput,
                      BltBuffer,//BltBuffer中的图像显示到屏幕上
                      EfiBltVideoToVideo, 
                      0,
                      0,
                      0,//(UINTN) (SizeOfX - Width) / 2,
                      0,// (UINTN) (SizeOfY - Height) / 2,
                      1024,//Width,
                      768,//Height,
                      0//Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
                      );

4、复制屏幕区域到屏幕另一片区域

EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer;

UINTN BufferSize = 1024*768*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL);

Status = gBS->AllocatePool(EfiLoaderData,(UINTN)Size,&BltBuffer)

Status = GraphicsOutput->Blt (
                      GraphicsOutput,
                      BltBuffer,//BltBuffer中的图像显示到屏幕上
                      EfiBltBufferToVideo, 
                      0,
                      0,
                      0,//(UINTN) (SizeOfX - Width) / 2,
                      0,// (UINTN) (SizeOfY - Height) / 2,
                      1024,//Width,
                      768,//Height,
                      0//Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
                      );

注意:Delta是图像缓冲区BltBuffer每行的字节数,若为0,则Delta的大小为Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)

EFI_GRAPHICS_OUTPUT_BLT_PIXEL定义了像素的格式,一些老旧显卡都的帧缓冲中,一个像素3个字节,现在大多数显卡帧缓冲都是一个像素4个字节,因为BMP图片中每个像素占3个字节,所以读取BMP图片的时候要转换成EFI_GRAPHICS_OUTPUT_BLT_PIXEL格式

成员变量 Mode,指向了当前的显示模式

SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution;
SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值