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

2024-06-07 05:18

本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038261

相关文章

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

linux安装、更新、卸载anaconda实践

《linux安装、更新、卸载anaconda实践》Anaconda是基于conda的科学计算环境,集成1400+包及依赖,安装需下载脚本、接受协议、设置路径、配置环境变量,更新与卸载通过conda命令... 目录随意找一个目录下载安装脚本检查许可证协议,ENTER就可以安装完毕之后激活anaconda安装更

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按