当前位置: BOLT界面引擎 > 知识库文章 > 图形库XLGraphic的简单说明(和GDI/GDI+关系)

图形库XLGraphic的简单说明(和GDI/GDI+关系)

作者:李亚星 2013-03-13

很多人对BOLT的底层渲染部分存在疑问,比如是否依赖GDIGDI+?是否使用了硬件加速如directxOpenGL等? win32平台的界面引擎,在win32平台的界面绘制部分,或多或少都要依赖GDI/GDI+,有些东西是绕不过去的,否则没办法和系统对接。但是不同于传统界面引擎全盘使用GDI/GDI+的渲染策略,BOLT只是在和系统对接时候才使用了GDI/GDI+的相关部分(比如DIB),其余部分则全是使用自己的方式来实现(GDI字体引擎除外)

1.      渲染效率高于GDI/GDI+,目前使用MMX/SSE指令集加速

2.      渲效果可控制,尤其是字体部分

3.      BOLT渲染体系天然支持alpha通道,这个是GDI/GDI+不满足的

4.      也是为了跨平台准备,渲染链可以很轻松的移植到maclinux等平台


BOLT的绘制核心在XLGraphic.dll,也就是BOLT的图形库。目前图形库支持三大基础功能:位图,文本和矢量

 

一、        位图

位图是图形渲染里面最核心的,所有绘制操作都需要围绕位图展开(硬件加速的除外)BOLT引擎图形库定义了自己的位图格式XL_BITMAP,所有渲染都是围绕这个来展开的。

XL_BITMAP格式和GDIDIB相似,支持32(默认)24位和8位格式位图,并且XGPDDB/DIBßà相互转化的接口,很方便,需要注意的是,BOLT渲染链里面的位图必须是32位的,也就是每个像素需要具备RGBA四个通道

位图的加载,png格式是默认格式,依赖libpng;非png格式的则需要依赖XGP,包括jpgbmpgif等,并且支持第三方扩展

位图的算法,基于位图的叠加,混合,拉伸等基础操作则全部是自己写的代码,依赖MMXSSE指令集加速,这块并没有使用GDI/GDI+的相关接口,也没有使用DirectXOpenGL等硬件加速(以后会增加硬件加速的支持,以便处理一些更复杂,更耗时的算法比如3D曲面动画等)

 

二、        文本

文本部分是图形库的一个核心,也是难点。传统的依赖GDI/GDI+UI引擎,往往觉得文本绘制这部分都很简单,但是对于BOLT来说,这块内容在图形库里面非常庞大,因为下面两个原因:

l  BOLT里面的所有文本渲染都天然支持alpha通道的,但是GDI/GDI+在字体alpha通道这块支持非常不友好,要么不支持,要么有各种问题

l  BOLT的一个核心原则就是效率,GDI/GDI+文本绘制的效率偏低,并且很多时候不可控

 

基于上述原因,BOLT图形库开发了自己的文本引擎。简单来说,BOLT的文本引擎包括字体引擎、排版引擎、渲染引擎等几大块,字体引擎负责把指定的字符按照指定的字体和相关设置,渲染成一个个小位图;排版引擎则负责对文本进行单行/多行的排版处理等,可供外部的TextObject/EditObject等方便使用;渲染引擎则负责把相关文本按照一定的策略和配置,绘制到目标位图等

 

BOLT图形库目前有两个字体引擎:

l  FREETYPE字体引擎

基于开源库freetype的渲染引擎,这个是BOLT图形库一开始就支持的,用以提供平台无关的字体渲染,在1.4版本之前是默认的字体引擎,1.4版本以后的默认字体引擎切换到GDI

 

l  GDI字体引擎

GDI字体引擎分两个时期:

1.         1.4版本之前,存在GDIGDI+等多个后端,但一般是使用GDI+的后端,同时也使用GDI/GDI+的排版引擎,由于采用了alpha通道反推算法,所以绘制效果偏低,并且效果也不尽人意

2.         1.4版本GDI字体引擎使用了字模+颜色抖动技术,字模是基于GDI,上层的颜色抖动等后处理则由BOLT全新开发,使用颜色抖动后的GDI渲染引擎,可以非常好的模拟Windows下的ClearType效果,字体渲染效果清晰度大大提升,并且不再受系统是否开启ClearType效果制约,所有系统下都有一致的渲染效果,可以给各产品带来更加优秀的产品体验

 

关于文本排版引擎

1.4版本之前,GDI引擎使用的是GDI自带的排版引擎,而FREETYPE引擎使用的是自己的排版引擎,所以当在这两个引擎之间切换时候,会造成很多细节上的不一致。1.4版本后使用统一的排版引擎,所以不管使用GDI字体引擎,还是FREETYPE引擎,都能达到一致的排版效果

 

三、        矢量

BOLT图形库对矢量支持的不完善,目前只支持一些基础的,常用的矢量算法,包括填充,画线,画圆等,一方面是普通互联网软件的需求上,矢量绘制部分的很少(只有一些专有领域的软件,可能会大量使用矢量渲染),另外一方面也由于矢量算法的支持成本太大,这个以后会完善

 

如果现在有使用BOLT的产品,里面用到了复杂矢量绘制,比如制表,曲线图等,那么可以先用GDI/GDI+绘制矢量图到位图,然后转换到BOLT图形库的位图格式XL_BITMAP_HANDLE,就可以在BOLT里面使用了。

 

 

 

迅雷公司 版权所有 Copyright 2003-2010 Thunder Inc.All Rights Reserved. 意见反馈:xl7doc@xunlei.com