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;