DirectFB简介以及移植[一]【转】

摘要:
DirectFB是为嵌入式系统设计的。DirectFB是一个图形API,存在于FrameBuffer层之上和GTK+等高级图形管理层之下。支持音频和视频文件和字体,如JPEG、PNG、GIF、mpeg1/2、AVI、MOV、Flash、Video4Linux、DirectFBbitmapfont和TrueType。为了更容易理解DirectFB,我们需要在DirectFB中引入几个概念:层:表示独立的图形缓存。DirectFB中的绘图和Bilitting操作基于曲面。Videoarea是用于显示视频的SurFace。

转自:https://blog.csdn.net/wavemcu/article/details/39251805

***************************************************************************************************************************
作者:EasyWave 时间:2014.09.13

类别:开源GUI系统-DirectFB简介 声明:转载,请保留链接

注意:如有错误,欢迎指正。这些是我学习的日志文章......

***************************************************************************************************************************

一:DirectFB简介

DirectFB是一个轻量级的提供硬件图形加速,输入设备处理和抽象的图形库,它集成了支持半透明的视窗系统以及在LinuxFramebuffer驱动之上的多层显示。它是一个用软件封装当前硬件无法支持的图形算法来完成硬件加速的层。DirectFB是为嵌入式系统而设计。它是以最小的资源开销来实现最高的硬件加速性能。

DirectFB是图形API存在于FrameBuffer层之上与高级图形管理层如GTK+等之下的。它可以以很小的系统资源占用来提供图形硬件加速功能,提供类如多路a通道渲染模型等高级图像操作。它不修改Linux内核,除了标准C库没有其他库的依赖。应用在了基于Linux系统的DTV显示系统的研发和其他有关Linux显示界面的项目上。支持市面上绝大多数显示卡,支持键盘、鼠标、遥控器、游戏手柄、触摸屏等输入设备。支持JPEG、PNG、GIF、mpeg1/2、AVI、MOV、Flash、Video4Linux、DirectFBbitmapfont和TrueType等音视频文件和字体。

二:DirectFB在系统的位置
从GUI整个系统架构来讲,对于一般的MMP,DTV和STB来说,下面图中是比较经典的结构。DirectFB都处于QT,GTK+这样的高级GUI框架的下面,Linux系统驱动的上面。如下图所示:

DirectFB简介以及移植[一]【转】第1张

从功能上面来讲,下面图中比较形象的说明了DirectFB的主要作用:图形,文字的处理(DirectFB把TS经过Decoder处理之后的码流,再加上图形和文字,一起传给视频的芯片),如下图所示:

DirectFB简介以及移植[一]【转】第2张

三:DirectFB GUI的架构

对于上层的GUI高级框架来说,DirectFB是透明的,下图是一个更加细化的DirectFB的结构图:

DirectFB简介以及移植[一]【转】第3张

对于底层的驱动来说,DirectFB里面负责和硬件打交道的显卡的驱动(gfxdriver)和显示系统(system),这里面gfxdriver是和各个硬件平台相关的,有可能需要自己写。为了更易于理解DirectFB,需要先介绍几个DirectFB里面的概念:

  • Layers:代表互相独立的图形缓存。大多数嵌入式设备都有多个layer。多个layer根据对应的alpha值混合 在一起,从而显示出来。
  • Surface:代表一块预留的内存,来保存像素数据。DirectFB中的Drawing,Bilitting操作就是基于 surface的。Surface的内存根据设定,可以从系统中分配,也可以从显卡的内存中分配。
  • Primary Surface:代表一个特殊layer的特殊surface。如果primary surface是单缓冲的,任何对于 primary surface的操作都会直接反应到显示屏上。
  • Subsurface:是一个surfac的子集,但是自身并不占有任何内存。
  • Window/Windowstack:控制一个layer中的surface该显示什么。Window属于某个背景可以设定的layer。 每个window有自己的surface,window用这个surface来组合图像。

比如说下图中有三个Layer,最下面的Layer是一幅背景图,中间的Layer是一个透明的带有一个“igel”的Layer,最上面是一个透明的带有subtitle的Layer,最后我们在显示器中看到的就是各个Layer的混合。

DirectFB简介以及移植[一]【转】第4张

再比如说下面这幅图,LowerLayer是一个全屏模式的Layer,它的背景图片渲染在自己的SurFace上面。Videoarea是一个SurFace,用来显示video。UpperLayer通过windowstack/window来显示应用程序的内容,而且Upper Layer是一个透明的Layer,这样混合之后,可以透过上面的Layer看到下面的video。

DirectFB简介以及移植[一]【转】第5张

四:DirectFB的移植

如果要移植DirectFB需要用到以下的第三方库,如下图所示:

DirectFB简介以及移植[一]【转】第6张

DirectFB需要用到第三方库简介:

  • fontconfig-2.10.92:管理系统安装的字体,根据应用程序的字体配置,match(匹配)一种字体,填充match字体的各种属性。
  • freetype-2.5.0:FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。
  • jpeg-8d:jpeg开源库
  • libpng-1.5.8:PNG 库是用来创立和操作PNG 格式的图像文件,PNG 格式是设计来替代GIF,他对于更小范围的TIFF(标记图象文件格式)来说,有了非常多的进步和拓展并且减少了关于专利权的麻烦。
  • libsigc++-2.2.8:libsigc++是实现类型安全回调的一个C++模板库。libsigc++提供了信号(signal)和槽(slot)的概念,实现了信号机制。slot对应一个回调函数,信号(signal)与槽(slot)相关联(attach),当一个信号被发射(emit)时,相对应的槽被调用。
  • libxml2-2.6.28:包含了对 XPath 表达式使用的支持来检索匹配一个指定准则的结点集。libxml2软件包提供允许用户操控XML文件的函数库,包含有读、修改和写XML和HTML文件支持。
4.1: jpeg-8d的编译配置
jpeg-8d的build.sh的脚本配置如下所示:
  1. #!/bin/bash
  2. if["$1"==""];then
  3. INSTALL_PATH=`pwd`/_install
  4. else
  5. if[-d$1];then
  6. INSTALL_PATH=$1
  7. else
  8. exit1
  9. fi
  10. fi
  11. mkdir-p$INSTALL_PATH
  12. #autoreconf-ivf
  13. if[-fconfig.log];then
  14. makedistclean
  15. fi
  16. ./configure--prefix=$INSTALL_PATH
  17. --host=arm-none-linux-gnueabi
  18. --target=arm-none-linux-gnueabi
  19. --build=i486-linux-gnu
  20. --disable-option-checking
  21. --disable-silent-rules
  22. --disable-dependency-tracking
  23. --enable-maintainer-mode
  24. --enable-ld-version-script
  25. --enable-shared=yes
  26. --enable-static=no
  27. --enable-fast-install=yes
  28. --disable-libtool-lock
  29. --with-gnu-ld
  30. if[$?-eq0];then
  31. make
  32. if[$?-eq0];then
  33. makeinstall
  34. exit0
  35. fi
  36. fi
  37. exit1

编译配置成动态库,如上面的build.sh脚本所示,具体的配置可以通过configure --help命令来查看!
4.2:libpng-1.5.8的编译和配置
libpng-1.5.8的build.sh的脚本配置如下所示:
  1. #!/bin/bash
  2. if["$1"==""];then
  3. INSTALL_PATH=`pwd`/_install
  4. else
  5. if[-d$1];then
  6. INSTALL_PATH=$1
  7. else
  8. exit1
  9. fi
  10. fi
  11. mkdir-p$INSTALL_PATH
  12. #autoreconf-ivf
  13. if[-fconfig.log];then
  14. makedistclean
  15. fi
  16. ./configure--prefix=$INSTALL_PATH
  17. --host=arm-none-linux-gnueabi
  18. --target=arm-none-linux-gnueabi
  19. --build=i486-linux-gnu
  20. --disable-option-checking
  21. --disable-dependency-tracking
  22. --enable-maintainer-mode
  23. --disable-arm-neon
  24. --enable-shared=yes
  25. --enable-static=no
  26. --enable-fast-install=yes
  27. --disable-libtool-lock
  28. --with-gnu-ld
  29. if[$?-eq0];then
  30. make
  31. if[$?-eq0];then
  32. makeinstall
  33. exit0
  34. fi
  35. fi
  36. exit1
编译配置成动态库,如上面的build.sh脚本所示,具体的配置可以通过configure --help命令来查看!

4.3:libxml2-2.6.28的编译和配置

libxml2-2.6.28的build.sh的脚本配置如下所示:

  1. #!/bin/bash
  2. if["$1"==""];then
  3. INSTALL_PATH=`pwd`/_install
  4. else
  5. if[-d$1];then
  6. INSTALL_PATH=$1
  7. else
  8. exit1
  9. fi
  10. fi
  11. mkdir-p$INSTALL_PATH
  12. #autoreconf-ivf
  13. if[-fconfig.log];then
  14. makedistclean
  15. fi
  16. ./configure--prefix=$INSTALL_PATH
  17. --host=arm-none-linux-gnueabi
  18. --build=i486-linux-gnu
  19. --disable-option-checking
  20. --disable-dependency-tracking
  21. --enable-maintainer-mode
  22. --disable-silent-rules
  23. --enable-shared=yes
  24. --enable-static=no
  25. --enable-fast-install=yes
  26. --disable-libtool-lock
  27. --disable-documentation
  28. --enable-warnings=min
  29. --with-sax1=yes
  30. --with-catalog=yes
  31. --with-gnu-ld
  32. if[$?-eq0];then
  33. make
  34. if[$?-eq0];then
  35. makeinstall
  36. exit0
  37. fi
  38. fi
  39. exit1
编译配置成动态库,如上面的build.sh脚本所示,具体的配置可以通过configure --help命令来查看!

4.4:freetype-2.5.0的编译和配置

freetype-2.5.0的build.sh的脚本配置如下所示:

  1. #!/bin/bash
  2. if["$1"==""];then
  3. INSTALL_PATH=`pwd`/_install
  4. else
  5. if[-d$1];then
  6. INSTALL_PATH=$1
  7. else
  8. exit1
  9. fi
  10. fi
  11. mkdir-p$INSTALL_PATH
  12. #autoreconf-ivf
  13. if[-fconfig.log];then
  14. makedistclean
  15. fi
  16. ./configure--prefix=$INSTALL_PATH
  17. --host=arm-none-linux-gnueabi
  18. --build=i486-linux-gnu
  19. --disable-option-checking
  20. --disable-dependency-tracking
  21. --enable-biarch-config
  22. --disable-mmap
  23. --enable-shared=yes
  24. --enable-static=no
  25. --enable-fast-install=yes
  26. --disable-libtool-lock
  27. --without-bzip2
  28. --without-zlib
  29. --without-png
  30. --with-gnu-ld
  31. if[$?-eq0];then
  32. make
  33. if[$?-eq0];then
  34. makeinstall
  35. exit0
  36. fi
  37. fi
  38. exit1
编译配置成动态库,如上面的build.sh脚本所示,具体的配置可以通过configure --help命令来查看!

4.5:fontconfig-2.10.92的编译和配置

fontconfig-2.10.92的build.sh的脚本配置如下所示:

  1. #!/bin/bash
  2. if["$1"==""];then
  3. INSTALL_PATH=`pwd`/_install
  4. else
  5. if[-d$1];then
  6. INSTALL_PATH=$1
  7. else
  8. exit1
  9. fi
  10. fi
  11. mkdir-p$INSTALL_PATH
  12. exportLDFLAGS="-L$INSTALL_PATH/lib"
  13. exportCFLAGS="-I$INSTALL_PATH/include"
  14. exportPKG_CONFIG_PATH="$INSTALL_PATH/lib/pkgconfig"
  15. exportLIBS="-ldl-lpthread-lpng"
  16. if[-fconfig.log];then
  17. makedistclean
  18. fi
  19. ./configure--prefix=$INSTALL_PATH
  20. --host=arm-none-linux-gnueabi
  21. --build=i486-linux-gnu
  22. --disable-option-checking
  23. --disable-dependency-tracking
  24. --disable-silent-rules
  25. --disable-largefile
  26. --enable-shared=yes
  27. --enable-static=no
  28. --enable-fast-install=yes
  29. --disable-libtool-lock
  30. --enable-libxml2
  31. --disable-iconv
  32. --with-gnu-ld
  33. FREETYPE_CFLAGS="-I$INSTALL_PATH/include/freetype2"
  34. FREETYPE_LIBS="-L$INSTALL_PATH/lib-lfreetype"
  35. LIBXML2_CFLAGS="-I$INSTALL_PATH/include/libxml2"
  36. LIBXML2_LIBS="-L$INSTALL_PATH/lib-lxml2"
  37. if[$?-eq0];then
  38. make
  39. if[$?-eq0];then
  40. makeinstall
  41. exit0
  42. fi
  43. fi
  44. exit1
编译配置成动态库,如上面的build.sh脚本所示,具体的配置可以通过configure --help命令来查看!

4.6:libsigc++-2.2.8的编译和配置

libsigc++-2.2.8的build.sh的脚本配置如下所示:

  1. #!/bin/bash
  2. if["$1"==""];then
  3. INSTALL_PATH=`pwd`/_install
  4. else
  5. if[-d$1];then
  6. INSTALL_PATH=$1
  7. else
  8. exit1
  9. fi
  10. fi
  11. mkdir-p$INSTALL_PATH
  12. #autoreconf-ivf
  13. if[-fconfig.log];then
  14. makedistclean
  15. fi
  16. ./configure--prefix=$INSTALL_PATH
  17. --host=arm-none-linux-gnueabi
  18. --build=i486-linux-gnu
  19. --disable-option-checking
  20. --disable-dependency-tracking
  21. --enable-maintainer-mode
  22. --enable-shared=yes
  23. --enable-static=no
  24. --enable-fast-install=yes
  25. --disable-libtool-lock
  26. --enable-ipv6=no
  27. --with-gnu-ld
  28. if[$?-eq0];then
  29. make
  30. if[$?-eq0];then
  31. makeinstall
  32. exit0
  33. fi
  34. fi
  35. exit1
编译配置成动态库,如上面的build.sh脚本所示,具体的配置可以通过configure --help命令来查看!

五:移植总结

DirectFB的移植留到下一篇来详细介绍,这一篇只详细的介绍DirectFB所需要的第三方库的编译和配置。


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wavemcu/article/details/39251805

免责声明:文章转载自《DirectFB简介以及移植[一]【转】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#集合类型大盘点Log4在.NetCore中的应用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux动态链接库---一篇讲尽

一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如:tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory原因一般有两个, 一个是操作系统里确...

Appium(四):真实机第一个appium程序、模拟器第一个appium程序、查看元素

1. 真实机第一个appium程序 学完了前面的知识,也将环境搭建好了,接下来我们就正式开始appium的学习了。 在做app自动化的时候,我们肯定是针对某个产品、某个软件进行测试,那么我们一定是先让模拟器或真机帮我们打开这款软件才可以。所以接下来要学的就是如何打开某个应用程序。 启动步骤: USB连接手机,开启调试模式 打开appium工具 创建pyth...

GDB如何调试没有符号表(未加-g选项的编译)的程序

/********************************************************************* * Author  : Samson * Date    : 01/30/2015 * Test platform: *              3.13.0-24-generic *              G...

Azure DevOps Server 2020 (原名TFS)安装说明

1. 概述 Azure DevOps Server(原名TFS)是微软研发管理平台产品,是实现软件运维一体化(DevOps)的实施方案,是敏捷开发方法论在研发团队中的落地工具,是微软研发大数据管理系统。 根据企业当前软件研发管理的实际情况,结合Azure DevOps Server的自身功能,可以协助企业在软件质量和开发效率上实现双提升,可以建立起规范统一...

【UE】常用的UltraEdit使用技巧

Tip 1: Alt+C 列模式可以说最初选择使用这个文本编辑软件,原因很简单,就是因为“她”具有列编辑模式。如果您还不知道什么是列编辑模式的话,我想您应该好好研究一下啦。这是一个超级“赞”的功能。在对大文本进行批量的列编辑时候非她莫属(如果您是Windows平台上另外一个强大的文本编辑软件gVim的使用者除外)。快实验一下这个功能吧。Tip 2:Ctrl...

使用wps跨ubuntu和windows编辑“.doc”文档。报错“编辑受限”,乱码,软件卡死,强制关闭

背景介绍: 本人使用wps跨ubuntu和windows编辑“.doc”文档。文档一直存放在移动硬盘上,切换系统没有插拔移动硬盘。切换系统好几次,一切正常。 某日早晨,在ubuntu下编辑文档,保存,转入windows下打算继续编辑。windows下打开文档时,报错“编辑受限”,乱码,软件卡死,只能强制关闭。 尝试以下方法: 1)把文档从移动硬盘拷贝到wi...