DJYGUI系列文章五:GK显示器接口

news2025/1/16 17:55:48

1 GK显示器接口概述

        显示器是图形显示的终端,图形的所有操作都会直接或间接的体现在显示器上面。DJYGUI支持多显示器、虚显示器和镜像显示器的功能。应用程序在调用API函数绘图前,需安装显示器,按照GK显示器标接口实现驱动函数。

        GK的底层硬件标准接口函数大体分为三类,第一类是在位图中绘图,第二类是在屏幕上绘图,第三类是显示器的控制函数。安装显示器时,将这三类接口函数注册到图形系统,当用户调用GUI Kernel API时,这些驱动函数将以回调函数的方式被调用。

2 镜像显示

        镜像显示就是在远端计算机上显示一个与本地显示器完全一样的画面,可用于实现远程协助和远程维护。远程操作多是通过通信口进行的,主要有网络、USB、串口等。要使用远程显示功能,必须在本地先安装一个显示器,然后把远程显示器当作该显示器的镜像显示器,GK提供API函数用于添加镜像显示器。值得注意的是,本地显示器可以是实际存在的,也可以是虚拟的。对于实际存在的显示器,需要编写完整的显示driver,对于虚拟的,则只需要提供一个框架,driver接口中要求的接口函数,均可以不实现。与本地显示器一样,镜像显示器同样需要在本地实现一个display驱动,但不必实现所有接口函数,只需要实现显示器接口函数集中的四个函数:

  1. set_pixel_screen:在屏幕上绘制一个像素
  2. fill_rect_screen:填充一块矩形屏幕区域
  3. bm_to_screen:把bitmap输出到屏幕
  4. line_screnn:在屏幕上面画一根线

        所有的绘制操作,最后都会在GK中变成对screen的输出操作,GK在执行对screen操作的同时,调用上述四个函数之一,把绘制命令传送到远端显示器,远端计算机在自己的本地显示器上实现这几个函数的功能。镜像显示器驱动还需要图像传输协议的配合,典型的是VNCServer,该协议在DJYOS上有移植。使用VNCServer的话,远端显示器只需要安装一个VNC客户端就可以了。

3 硬件接口

3.1set_pixel_bm:位图中画像素

bool_t (*set_pixel_bm)(struct tagRectBitmap *Bitmap, s32 x,s32 y,u32 Color,u32 Rop2Code);

参数:

Bitmap:目标位图。

x:绘图位置的横坐标,相对于位图。

y:绘图位置的纵坐标,相对于位图。

Color:画图使用的颜色,颜色格式为真彩色。

Rop2Code:二元光栅操作码。

返回值:

true:成功;false:失败。

说明:

在矩形位图中画一个像素,若显示器使用CN_CUSTOM_PF(自定义)格式,或者有硬件加速功能,应该实现这个函数,否则直接返回false。即使有硬件加速,但该加速功能不支持r2_code编码的话,也返回false。color的格式是CN_SYS_PF_ERGB8888。

3.2 line_bm:位图中画直线

bool_t (*line_bm)(struct tagRectBitmap *Bitmap,struct tagRectangle *Limit,

s32 x1,s32 y1,s32 x2,s32 y2,u32 Color,u32 Rop2Code);

参数:

Bitmap:目标位图。

Limit:限制矩形,只允许在该矩形内绘制。

x1:绘图起点的横坐标,相对于位图。

y1:绘图起点的纵坐标,相对于位图。

x2:绘图终点的横坐标,相对于位图。

y2:绘图终点的纵坐标,相对于位图。

Color:画图使用的颜色,颜色格式为真彩色。

Rop2Code:二元光栅操作码。

返回值:

true:成功;false:失败。

说明:

在矩形位图中画一条任意细直线,不含端点,若显示器使用CN_CUSTOM_PF(自定义)格式,或者有硬件加速功能,应该实现这个函数,否则直接返回false。即使有硬件加速,但该加速功能不支持r2_code编码的话,也返回false。color格式是CN_SYS_PF_ERGB8888。

另外有公交车中画直线函数line_bm_ie,与line_bm的唯一区别在于,line_bm_ie画直线包括端点,而line_bm不包含端点。

3.3fill_rect_bm:位图中填充矩形

bool_t (*fill_rect_bm)(struct tagRectBitmap *DstBitmap,

                               struct tagRectangle *Target,

                               struct tagRectangle *Focus,

                               u32 Color0,u32 Color1,u32 Mode);

参数:

DstBitmap:目标位图。

Target:目标矩形,填充范围不能超过该矩形。

Focus:聚焦矩形,当前填充矩形区域。

Color0:渐变颜色0,颜色格式为真彩色。

Color1:渐变颜色1,颜色格式为真彩色,模式为直接填充时无效。

Mode:填充模式,请参照gkernel.h宏定义组CN_FILLRECT_MODE_N。

返回值:

true:成功;false:失败。

说明:

在矩形位图中填充矩形,若显示器使用CN_CUSTOM_PF(自定义)格式,或者有硬件加速功能,应该实现这个函数,否则直接返回false。color格式是CN_SYS_PF_ERGB8888。目标矩形Target是渐变填充的整个矩形区域,聚焦矩形Focus是当前填充的可视域。Target和Focus的关系如图 41所示。如需要填充Target内的三个focus区域,需要调用该函数三次,每次使用相应的Focus参数。

图 4-1 Target和Focus关系图

3.4 blt_bm_to_bm:位图中显示矩形

bool_t (*blt_bm_to_bm)( struct tagRectBitmap *DstBitmap,

                                   struct tagRectangle *DstRect,

                                   struct tagRectBitmap *SrcBitmap,

                                   struct tagRectangle *SrcRect,

                                   u32 RopCode,u32 TransparentColor);

参数:

DstBitmap:目标位图。

DstRect:目标矩形。

SrcBitmap:源位图。

SrcRect:源矩形。

RopCode:光栅操作码。

TransparentColor:透明色,为真彩色。

返回值:

true:成功;false:失败。

说明:

在两个矩形位图中位图块传送,如果显示器使用的像素格式是CN_CUSTOM_PF,或者硬件2d加速支持位图块传送,需实现这个函数,否则直接返回false。对于有硬件加速,但部分RopCode编码不支持的情况,可以实现支持的RopCode,不支持的部分,返回false。本函数返回false的话,gui kernel会自行用逐像素方法拷贝。目标矩形和源矩形相对坐标不同,但大小相同。

3.5 get_pixel_bm:位图中读取像素

u32 (*get_pixel_bm)(struct tagRectBitmap *Bitmap,s32 x,s32 y);

参数:

Bitmap:目标位图。

x:读像素的横坐标,相对于目标位图。

y:读像素的纵坐标,相对于目标位图。

返回值:

读取的像素值,需转化为真彩色。

说明:

从矩形位图中取一像素,并转换成CN_SYS_PF_ERGB888。只有在bitmap的像素格式为CN_CUSTOM_PF时,才需要读取。如果显卡不打算支持自定义格式,本函数直接返回0。

3.6 get_rect_bm:位图中剪切矩形

bool_t (*get_rect_bm)(struct tagRectBitmap

*Src, struct tagRectangle *Rect, struct tagRectBitmap *Dest);

参数:

Src:源位图。

Rec:读取位图的矩形区域。

Dest:目标位图。

返回值:

true:成功;false:失败。

说明:

把src位图内rect矩形区域的内容复制到dest位图中,调用前,先设置好dest的FixelFormat,本函数不理会src的FixelFormat,直接使用screen的格式。本函数用于从窗口剪切矩形,而blt_bm_to_bm用于显示矩形。如果显示器使用的像素格式是CN_CUSTOM_PF,或者硬件加速支持位图间拷贝图形,需实现这个函数,否则直接返回false。由于dest->FixelFormat存在很多可能,即使有硬件加速,也存在只支持部分FixelFormat的情况,对不支持的格式,返回false。

3.7 set_pixel_screen:屏幕上画像素

bool_t (*set_pixel_screen)(s32 x,s32 y,u32 Color,u32 Rop2Code);

参数:

x:绘制像素的横坐标,相对于屏幕。

y:绘制像素的纵坐标,相对于屏幕。

Color:绘制像素的颜色,为真彩色。

Rop2Code:二元光栅操作码。

返回值:

true:成功;false:失败。

说明:

在screen中画一个像素,有frame buffer的情况下,正常显示gui不会调用这个函数,如果窗口direct_screen==true,则可能调用本函数。因此,无论是否有frame buffer,driver都必须提供并且必须实现本函数。镜像显示器的driver必须实现本函数。color的格式是CN_SYS_PF_ERGB8888,因此绘制前需转化为本地颜色格式。

3.8 line_screen:屏幕上画直线

bool_t (*line_screen)( tagRectangle *limit, s32 x1,s32 y1,s32 x2,s32 y2,

u32 Color,u32 Rop2Code);

参数:

limit:限制矩形,只绘制矩形内部的部分。

x1:绘图起点横坐标,相对于屏幕。

y1:绘图起点纵坐标,相对于屏幕。

x2:绘图终点横坐标,相对于屏幕。

y2:绘图终点横坐标,相对于屏幕。

Color:绘制像素的颜色,为真彩色,因此绘制前需转化为本地颜色格式。

Rop2Code:二元光栅操作码。

返回值:

true:成功;false:失败。

说明:

在screen中画一条任意直线,不含端点,如硬件加速不支持在screen上画线,driver可以简化,直接返回false即可。有frame buffer的情况下,正常显示gui不会调用这个函数,如果窗口direct_screen==true,则可能调用本函数,本函数返回false的话,会进一步调用set_pixel_screen函数。由于不确定本地显示器是否有frame_buffer,镜像显示器driver必须实现本函数,不能简单返回false。color的格式是CN_SYS_PF_ERGB8888,因此绘制前需转化为本地颜色格式。

此外,函数line_screen_ie也是在屏幕上画直线,但是它画的直线包含端点。

3.9 fill_rect_screen:屏幕上填充矩形

bool_t (*fill_rect_screen)(struct tagRectangle *Target,

                              struct tagRectangle *Focus,

                              u32 Color0,u32 Color1,u32 Mode);

参数:

Target:目标矩形区域。

Focus:聚焦矩形区域。

Color0:渐变颜色0,颜色格式为真彩色。

Color1:渐变颜色1,颜色格式为真彩色。

Mode:渐变填充模式。

返回值:

true:成功;false:失败。

说明:

screen中矩形填充,如硬件加速不支持在screen上矩形填充,driver可以简化,直接返回false即可。有frame buffer的情况下,正常显示gui不会调用这个函数,如果窗口direct_screen==true,则可能调用本函数,本函数返回false的话,会进一步调用set_pixel_screen函数。由于不知道本地显示器的情况,镜像显示器driver必须实现本函数,不能简单返回false。color的格式是CN_SYS_PF_ERGB8888。Target与Focus的关系如图 41所示。

3.10 bm_to_screen:屏幕上画位图

bool_t (*bm_to_screen)(struct tagRectangle *DstRect,

                    struct tagRectBitmap *SrcBitmap,s32 xSrc,s32 ySrc);

参数:

DstRect:目标矩形区域。

SrcBitmap:源位图。

xSrc:源位图中显示的区域左上角横坐标,相对于源位图。

ySrc:源位图中显示的区域左上角纵坐标,相对于源位图。

返回值:

true:成功;false:失败。

说明:

从内存缓冲区到screen位块传送,只支持块拷贝,不支持rop操作。如硬件加速不支持在screen上绘制位图,driver可以简化,直接返回false即可。有frame buffer的情况下,__GK_OutputRedraw中会调用这个函数。如果窗口direct_screen==true,也可能调用本函数。本函数返回false的话,gui kernel会进一步调用set_pixel_screen函数。即使硬件加速支持,但如果不支持具体的src_bitmap->PixelFormat,也可返回false。由于不知道本地显示器的情况,镜像显示器driver必须实现本函数,不能简单返回false。

3.11 get_pixel_screen:屏幕上读像素

u32 (*get_pixel_screen)(s32 x,s32 y);

参数:

x:目标像素的横坐标,相对于屏幕。

y:目标像素的纵坐标,相对于屏幕。

返回值:

像素值,转化为真彩色格式。

说明:

从screen中取一像素,并转换成CN_SYS_PF_ERGB8888。

3.12 get_rect_screen:屏幕上读位图

bool_t (*get_rect_screen)(struct tagRectangle *Rect,struct tagRectBitmap *Dest);

参数:

rect:读取的目标矩形区域。

dest:保存矩形区域读到的位图。

返回值:

true:成功;false:失败。

说明:

把screen内矩形区域的内容复制到bitmap,调用前,先设置好dest的FixelFormat。

3.13 disp_ctrl:控制显示器

bool_t (*disp_ctrl)(struct display_rsc *Disp);

参数:

disp:显示器指针。

返回值:

true:成功;false:失败。

说明:

控制显示器,这是由driver提供的一个应用程序的入口,该应用程序用于提供一个可视化的方式。设定该显示器所有可以由用户设定的参数,比如分辨率和和色彩参数。函数的功能不做统一规定,驱动程序的文档应该提供函数的使用说明。利用本函数,可以提供类似windows中设置显示器属性的功能。

4 GK显示器API说明

4.1 GK_ApiGetPixelFormat:查询显卡格式

u16 GK_ApiGetPixelFormat(struct tagDisplayRsc *Display)

头文件:

gkernel.h

参数:

Display:待查询的显卡

返回值:

显卡格式,也称颜色格式,如CN_SYS_PF_RGB565。

说明:

查询显卡使用的颜色格式,画位图时,如果使用跟显卡相同的颜色格式,将获得最优性能。

4.2 GK_InstallDisplay:安装显示器

bool_t GK_InstallDisplay(struct tagDisplayRsc *Display, char *Name)

头文件:

gk_display.h

参数:

Display:待安装的显示器。

Name:显示器名称。

返回值:

true:成功;false:失败。

说明:

把一台新显示器登记到显示器资源队列中。

4.3 GK_InstallDisplayMirror:安装镜像显示器

bool_t GK_InstallDisplayMirror(struct tagDisplayRsc *BaseDisplay,

                          struct tagDisplayRsc *MirrorDisplay,char *Name)

头文件:

gk_display.h

参数:

BaseDisplay:本地显示器。

MirrorDisplay:待安装的镜像显示器。

Name:显示器名称。

返回值:

true:成功;false:失败。

说明:

把一台镜像显示器登记到本地显示器。

​​​​​​​4.3 GK_SetDefaultDisplay:设置默认显示器

bool_t GK_SetDefaultDisplay(char *Name)

头文件:

gk_display.h

参数:

Name:显示器名称。

返回值:

true:成功;false:失败。

说明:

设置默认显示器。

​​​​​​​4.4 GK_GetRootWin:取显示器的默认设置

struct tagGkWinRsc *GK_GetRootWin(struct tagDisplayRsc *Display)

头文件:

gk_display.h

参数:

Display:显示器指针。

返回值:

显示器桌面指针。

说明:

取一个显示器的默认显示设置,实际上就是桌面窗口的资源节点。

​​​​​​​4.5 GK_SwitchFrameBuffer:切换帧缓冲

bool_t GK_SwitchFrameBuffer(struct tagDisplayRsc *Display,

                              struct tagRectBitmap *FrameBuf)

头文件:

gk_display.h

参数:

Display:显示器指针。

FrameBuf:帧缓冲打针。

返回值:

true:成功;false:失败。

说明:

当一个显示器有多个Frame Buffer时,用本函数切换当前Frame Buffer。

​​​​​​​4.6 GK_CreateFrameBuffer:创建帧缓冲

struct tagRectBitmap *GK_CreateFrameBuffer(struct tagDisplayRsc *Display)

头文件:

gk_display.h

参数:

Display:显示器指针。

返回值:

缓冲区指针。

说明:

为某显示器创建一个Frame Buffer。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/18926.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DCS系统组态设计实验

太原理工大学控制仪表实验之DCS系统组态设计实验 DCS系统组态设计一.实验内容1.根据自己的理解,复述实验整体流程,并画出实验整体流程图。2.根据视频,写出DCS 信号通道接线关系表。即主控站DCS模块名称,模块型号,I/O模…

跟艾文学编程《Python基础》(5)Python的文件操作

作者: 艾文,计算机硕士学位,企业内训讲师和金牌面试官,公司资深算法专家,现就职BAT一线大厂。邮箱: 1121025745qq.com博客:https://wenjie.blog.csdn.net/内容:跟艾文学编程《Python…

linux网络编程epoll内核实现代码分析

1、linux内核epoll相关数据结构 1.1、epoll相关数据结构类图 1.2、关键数据结构说明 socket_wq结构体包含一个__wait_queue_head成员,__wait_queue_head用于连接wait_queue_t链表,对于epoll而言就是连接eppoll_entry; eppoll_entry包含一个e…

第七届信息类研究生学术论坛参赛有感

因为疫情不仅感叹时光飞逝,上了大半年的网课再次回到校园已经有师弟师妹了。今年的研究生学术论坛更卷了,入围了88项作品。这次科研作品征集研究生在学期间信息类相关研究成果,鼓励实物参展,包括软件系统、硬件系统等,…

Kubernetes(k8s)CNI(Calico)网络模型原理

文章目录一、概述二、Calico 架构和核心组件三、什么是BGP?三、Calico 两种网络模式1)IPIP 模式2)BGP 模式四、安装Calico插件1)通过helm安装Calico2)通过yaml文件安装3)k8s flannel网络切换calico1、卸载f…

适配不同场景的RestTemplate

一个基本实现 如果项目里可能只是偶尔通过一个url,发起一个http请求,一个基本实现如下: Configuration public class RestTemplateConfiguration {Beanpublic RestTemplate restTemplate() {RestTemplate restTemplate new RestTemplate()…

项目常遇到的问题

这里写自定义目录标题1:uniapp生成二维码2:uniapp onShow接收参数3:javascript如何获取对象的key和value4:uni-app:页面直接传递复杂参数5:js对于数组元素相同的分类方法1:uniapp生成二维码 选择…

关联式容器(Associative Container)

1:什么是关联式容器&#xff1f; 关联式容器依照特定的排序准则 自动为元素排序 元素可以是任何类型的value 也可以是 key/value pair key可以是任何类型 映射至一个相关value 而value也可以是任意类型 通常是所有容器默认以<进行比较 也可以通过自己的比较函数 定义出不同的…

Dubbo基础

目录 什么是 RPC 那为什么要有 RPC&#xff0c;HTTP 不好么&#xff1f; RPC 的原理是什么? 如何设计一个 RPC 框架 从底向上的思路 服务消费者 服务提供者 注册中心 监控运维 小结一下 简单实现一个 RPC 框架 Dubbo 简介 Dubbo的历史 Dubbo的功能 为什么要用 …

Java语法之继承

上次给大家分享了Java的封装&#xff0c;今天小编给大家分享面向对象三大特性的第二大特性&#xff0c;也就是继承&#xff0c;fighting~~ 目录 &#x1f384;一.继承的概念 &#x1f384;1.1为什么需要继承 &#x1f384;1.2继承的概念 &#x1f384;1.3继承的语法 &#…

Android App开发中补间动画的讲解以及实现钟摆动画效果实战(附源码 简单易懂 可直接使用)

需要图片集和源码请点赞关注收藏后评论区留言~~~ 一、补间动画的种类 Android提供了补间动画&#xff0c;它允许开发者实现某个视图的动态变换&#xff0c;具体包括四种动画效果&#xff0c;分别是灰度动画&#xff0c;平移动画&#xff0c;缩放动画和旋转动画。因为开发者提供…

缓存穿透、缓存击穿、缓存雪崩区别和解决方案

生命无罪&#xff0c;健康万岁&#xff0c;我是laity。 我曾七次鄙视自己的灵魂&#xff1a; 第一次&#xff0c;当它本可进取时&#xff0c;却故作谦卑&#xff1b; 第二次&#xff0c;当它在空虚时&#xff0c;用爱欲来填充&#xff1b; 第三次&#xff0c;在困难和容易之…

【c++】类和对象

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 3.1类的两种定义方式&#xff1a; 4.类的访问限定符及封装 4.1访问限定符 5.类的作用域 6.类的实例化 7.类对象模型 7.1 如何计算类对象的大小 8.this指针 8.1 this指针的引出 8.2 this指针的特性 9.类的6个默认成员函…

深度学习简介及反向传播

Datawhale开源学习&#xff0c;机器学习课程&#xff0c;项目地址&#xff1a;https://github.com/datawhalechina/leeml-notes 之前学习机器学习的时候&#xff0c;总结了三步&#xff1a; define a set of functiongoodness of functionpick the best function 这三步所做的…

机器学习之决策树【西瓜书】

当一个有经验的老农看一个瓜是不是好瓜时&#xff0c;他可能会先看下瓜的颜色&#xff0c;一看是青绿的&#xff0c;心想有可能是好瓜&#xff1b;接着他又看了下根蒂&#xff0c;发现是蜷缩着的&#xff0c;老农微微点头&#xff0c;寻思着五成以上是好瓜&#xff1b;最后他又…

基于51单片机的客车辆超载报警Proteus仿真

资料编号&#xff1a;111 下面是相关功能视频演示&#xff1a; 111-基于51单片机的客车辆超载报警Proteus仿真&#xff08;源码仿真原理图全套资料&#xff09;功能如下&#xff1a; 利用单片机设计一个超载检测控制电路。 通过 2 组红外对管(类似电路模拟)检测上车人数和下车…

Flink-水位线的设置以及传递

6.2 水位线 6.2.1 概述 分类 有序流 无序流 判断的时间延迟 延迟时间判定 6.2.2 水位线的设置 分析 DataStream下的assignTimstampsAndWatermarks方法&#xff0c;返回SingleOutputStreamOperator本质还是个算子&#xff0c;传入的参数是WatermarkStrategy的生成策略 但…

C51 - 中断系统

Contents1> 定义2> 作用3> 组成3.1> 中断系统结构3.2> 8个中断源3.3> 中断向量3.4> 中断优先级4> 原理5> 应用1> 定义 中断&#xff08;interrupt&#xff09;是指&#xff1a; CPU执行某一程序过程中&#xff0c;由于系统内&#xff0c;或外部某…

【操作文件的系统调用】

目录文件操作系统调用的基本库函数打开文件读取文件写入文件关闭文件应用文件操作代码举例文件操作与进程复制的结合先打开文件再复制进程先进程复制&#xff0c;再进行打开文件缓冲区的知识回顾在上一篇讲述僵尸进程的文章中对文件的系统调用做了一点点的代码讲述&#xff0c;…

day08 微服务保护

1、JMeter压力测试 1.1、安装启动 JMeter 依赖于JDK&#xff0c;所以必须确保当前计算机上已经安装了 JDK&#xff0c;并且配置了环境变量。 Apache Jmeter官网下载&#xff0c;地址&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 解压缩即可使用&#xff0c;目…