本文主要是介绍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->HorizontalResolutionInfo->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;
这篇关于UEFI原理与编程实践--图像显示GRAPHICS_OUTPUT_PROTOCOL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!