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

相关文章

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

SpringSecurity显示用户账号已被锁定的原因及解决方案

《SpringSecurity显示用户账号已被锁定的原因及解决方案》SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNon... 目录SpringSecurity显示用户账号已被锁定的解决方案1.问题出现前的工作2.问题出现原因各

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

MySQL 用户创建与授权最佳实践

《MySQL用户创建与授权最佳实践》在MySQL中,用户管理和权限控制是数据库安全的重要组成部分,下面详细介绍如何在MySQL中创建用户并授予适当的权限,感兴趣的朋友跟随小编一起看看吧... 目录mysql 用户创建与授权详解一、MySQL用户管理基础1. 用户账户组成2. 查看现有用户二、创建用户1. 基