directfb嵌入式图形界简介

2024-06-23 06:08

本文主要是介绍directfb嵌入式图形界简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


引 言

  DirectFB是一个提供硬件图形加速、输入设备处理抽象并集成了透明功能窗体系统和多显示层处理的开源库。通过对底层硬件不支持的图形操作以回调函数实现,DirectFB实现硬件设备的完全抽象。另外DirectFB在设计之初就充分考虑嵌入式系统的固有特性,体积小巧,资源消耗低。作为嵌入式系统中强大的图形处理库,DirectFB成为Linux下图形处理的一个新的标准(CELF AVG 1.0标准)。

  使用DirectFB可以绕开X Window系统,让应用程序直接操作Frame. Buffer,从而加速和简化图形操作。这对于嵌入式系统是很重要的,因为在资源有限的嵌入式系统中通常没有运行X Window。当然,DirectFB可以采用XDirectFB来开发,这样原来基于X Window开发的程序不需要修改就可以运行起来。

  DirectFB采用的是LGPL协议,因而可做商用开发库。LinuxTV、Palm Foleo等移动公司的项目均采用DirectFB作为底层图形库。

  值得一提的是,考虑跨平台、多语言等特定需求,开发者可以选择以DirectFB为后端的Cairo图形库进行2D图形操作。实践证明,这是一种嵌入式系统中高效、通用的解决方案。

  本文在介绍DirectFB相关特性之后,通过实例说明了其在嵌入式系统中的开发方法,并对基于DirectFB的Cairo图形库的使用关键点作了相关介绍。

  1 轻量级图形处理库DirectFB

  DirectFB提供了丰富的图形操作方法,而且所有操作在芯片支持的前提下均可进行硬件加速。例如:矩形和三角形绘制和填充、BLIT、Porter/Duff规则混色等。Di—reetFB内部集成了一个简易的窗口系统,支持透明窗体。显示层和输入设备等资源可以通过加锁的方式访问。DirectFB对任何通用表面(surface)都提供了抽象,这使得窗口和全屏之间的切换只需要简单的设置合作级别即可。

  1.1 DirectFB整体框图介绍

  DirectFB通过操作系统中Frame. Buffer驱动程序提供的内核接口来访问图形硬件设备,这意味着DirectFB需要Frame. Buffer驱动才可以工作。无论是否使用硬件加速,DirectFB都需要驱动完成设置分辨率、色深等视频模式,映射Frame. Buffer等操作。对于特定的图形操作,DirectFB通过访问图形硬件的内存映射端口,提交命令给显卡加速引擎来实现。其整体框架如图1所示。


  1.2 DirectFB接口框架

  DirectFB提供了一套C接口给用户调用DirectFB的各项功能。在DirectFB中,接口实质上是一个结构体,结构体中包含了功能函数指针,不同接口的函数指针指向不同的核心函数。比如IDireetFBSurface接口代表屏幕中可操作的区块,其中封装了BLIT、画框、画线和FLIP等核心操作。

  其中IDirectFB是整个库的顶层接口,可以通过DirectFBCreate函数来创建,其他接口可以通过这个接口创建。所有存在的接口也可以通过它来枚举访问。图2展示了DireetFB的接口框架。


  表1对主要接口模块的功能作了简单说明。具体的操作可以查看DirectFB*****的相关帮助文档。


  2 DirectFB应用开发

  下面通过一个例子说明使用DirectFB接口的开发方法:


  上面几行代码分别声明了DirectFB的主接口、显示层接口、窗口接口、绘图表面接口和消息缓冲接口。然后通过下列代码对DirectFB和它的接口进行初始化:


  一旦接口创建完毕,即可调用接口的相关方法实现DirectFB的提供图形操作功能。比如,下面的代码实现了在窗体的绘图表面绘制矩形框的操作:




  值得一提的是DirectFB实现了消息系统,用以响应用户输入、键盘鼠标等事件。对于嵌入式系统,DirectFB支持tslib方式接口的触摸屏输入消息响应。

  3 以DirectFB为后端的2D图形处理

  考虑以跨平台输出,引入2D图形处理库Cairo。令Cairo以DirectFB为实际绘图后端(back end)的方案,在嵌入式系统中可以获得很好的性能以及极大的通用性。

  Cairo广泛地应用在GNOME、GTK+、pango等著名的软件中进行2D图形处理。以C语言开发的Cairo绑定了C++、Ruby、Perl、Java和.Net/mono等多种语言接口。其中Python和C++绑定在开源社区代码中得到广泛的应用。

  Cairo有自己的Surface管理机制,可以在SDL、XWindow或者DirectFB的Surface上创建Cairo Surface。然后,在这个Cairo Surface上创立Cairo主接口。下面的代码演示了这一过程:


  得到Cairo的主接口cr之后,就可调用一系列Cairo的2D绘图API了。下面的代码演示了用Cairo的API划线:


  Cairo丰富的特性在解决移植性的同时,可以弥补直接使用DirectFB 2D功能上的不足。比如DirectFB没有画虚线的API,但是调用Cairo的cairo_set_dash和cairo_stroke可以很轻松地实现这一功能。

  4 小 结

  本文在介绍了DirectFB的特性和基本框架之后,阐述了DirectFB的基本开发方法,并提出一种使用基于DirectFB的Cairo 2D图形处理库的方案。它是一种兼顾了效率、通用性和功能性的嵌入式系统2D图形处理方案。笔者采用该方案实现了Windows CE GDI接口在ARM—Linux上的移植,工作良好,特在此与广大嵌入式系统开发人员分享。

这篇关于directfb嵌入式图形界简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

轻量级在线服装3D定制引擎Myway简介

我写的面向web元宇宙轻量级系列引擎中的另外一个,在线3D定制引擎Myway 3D。 用于在线商品定制,比如个性化服装的定制、日常用品(如杯子)、家装(被套)等物品的在线定制。 特性列表: 可更换衣服款式,按需定制更换模型可实时更改材质颜色可实时添加文本,并可实时修改大小、颜色和角度,支持自定义字体可实时添加艺术图标,并可实时修改大小、颜色和角度,支持翻转、各种对齐可更改衣服图案,按需求定制

Android SurfaceFlinger——图形内存分配器(十一)

前面的文章中的图层合成器(HWC),这里我们接着看一下 SurfaceFlinger 中的另一个重要服务——图形内存分配器。 一、简介         android.hardware.graphics.allocator@2.0 是 Android 系统中硬件抽象层(HAL)的一个组件,专门用于图形内存的分配和管理。它是 SurfaceFlinger 在处理图形数据时所依赖的

图形编辑器基于Paper.js教程03:认识Paper.js中的所有类

先来认一下Paper的资源对象,小弟有哪些,有个整体的认识。认个脸。 在Paper.js的 官方文档中类大致有如下这些: 基类: ProjectViewItemPointToolSizeSegmentRectangleCurveCurveLocationMatrixColorStyleTweenToolEventGradientGradientStopEvent 二级或三级类 继承Ite

shader language学习(1)——shader language简介背景

shader language,称为着色语言,shade在英语是阴影、颜色深浅的意思。shader language基于物体本身属性和光照条件,计算美格橡塑的颜色值。 实际上这种解释具有明显的时代局限性,在GPU编程发展的早期,shader language的提出目标是加强对图形处理算法的控制,所以对该语言的定义也针对于此。但随着技术的进步,目前的shader language早已经用于通用计算

LoRaWAN在嵌入式网络通信中的应用:打造高效远程监控系统(附代码示例)

引言 随着物联网(IoT)技术的发展,远程监控系统在各个领域的应用越来越广泛。LoRaWAN(Long Range Wide Area Network)作为一种低功耗广域网通信协议,因其长距离传输、低功耗和高可靠性等特点,成为实现远程监控的理想选择。本文将详细介绍LoRaWAN的基本原理、应用场景,并通过一个具体的项目展示如何使用LoRaWAN实现远程监控系统。希望通过图文并茂的讲解,帮助读

嵌入式学习——数据结构(哈希、排序)——day50

1. 查找二叉树、搜索二叉树、平衡二叉树 2. 哈希表——人的身份证——哈希函数 3. 哈希冲突、哈希矛盾 4. 哈希代码 4.1 创建哈希表 4.2  5. 算法设计 5.1 正确性 5.2 可读性(高内聚、低耦合) 5.3 健壮性 5.4 高效率(时间复杂度)时间复杂度越低,效率越高, 5.5 低储存(空间复杂度)空间复杂度越低,存储空间越少 6.排序算法 6.1 冒

算法13—Bit Map算法简介

1. Bit Map算法简介          来自于《编程珠玑》。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 2、 Bit Map的基本思想         我们先来看一个具体的例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排

Zustand 状态管理库简介

1. Zustand 简介 Zustand(德语中意为“状态”)是一个使用简单 API 的 React 状态管理库。它的核心思想是以状态切片(slices)的方式组织应用状态,从而实现高效的状态管理。Zustand 提供了比 Redux 更加简洁和直接的用法,同时支持异步操作和中间件。 在React开发中,状态管理是一个非常重要的概念。虽然 React 提供了 useState 和 useRe

上位机图像处理和嵌入式模块部署(mcu和swd接口)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】         最近学习mcu的时候,接触了不少调试器,这里面有daplink、st-link v2、j-link v9。虽然模块的形状可能不太一样,但是硬件的连线都差不多,都是mcu上的3.3v、clk、dio和gnd四根连线。出于好奇,今天花了点时间了解了一下debug port、sw

嵌入式linux系统中LCD屏驱动实现思路分析

在 Linux 下 LCD 的使用更加广泛,在搭配 QT 这样的 GUI 库下可以制作出非常精美的 UI 界面。接下来就来学习一下如何在 Linux 下驱动 LCD 屏幕。                           第一:Framebuffer设备简介       先来回顾一下裸机的时候 LCD 驱动是怎么编写的,裸机 LCD 驱动编写流程如下: ①、初始化 I.MX6U