栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

UEFI原理与编程实践--GOP

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

UEFI原理与编程实践--GOP

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;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/702556.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号