在STM32移植ucGUI之存储设备与抗锯齿
1.1 存储设备概述
存储设备用来防止显示屏在有对象重叠的绘图操作时的闪烁现象。当在液晶屏上绘制一些文字叠加在图片上的效果时,通常是先在液晶屏上绘制底层的图片,然后再在图片上叠加上文字。而如果使用了存储设备,这些操作首先是由单片机进行处理,它通过将所有的绘图操作进行综合,在其内部形成一个处理后的图像,然后再将其一次性绘制到液晶屏上。从而有效的消除了闪烁。
存储设备在ucGUI中是一个附加的可选包,它位于子目录GUI\Memdev下。当在软件中需要使用存储设备时,应首先在GUIConf.h中将该部分的预处理命令开启。
#define GUI_SUPPORT_MEMDEV 1
存储设备的使用非常简单,通常的步骤如下所示:
1. 建立存储设备(使用 GUI_MEMDEV_Create);
2. 激活它(使用 GUI_MEMDEV_Select);
3. 执行绘图操作;
4. 将结果拷贝到显示屏(使用 GUI_MEMDEV_CopyToLCD);
5. 如果你不再需要存储设备,删除它(使用 GUI_MEMDEV_Delete)。
当同一个器件用于不同的屏幕区域或存储设备的内容拷贝到不同的区域时,修改存储设备的原点比删除然后重建它更有效。此时我们可以实用void GUI_MEMDEV_SetOrg()函数。
1.2 分片存储设备
一个存储设备首先通过执行指定的绘图函数进行内容填充。设备填充完毕后,其内容写入LCD。有些情况下,可能没有足够的有效存储器空间能够立刻用于所有输出区域的存储,这依赖于在GUIConf.h中对GUI_ALLOC_SIZE宏的配置。一个分片存储设备将需要绘制的LCD区域分成几个片段,在每一个片段里面用尽可能多占用当前可用的存储空间。
不同于普通存储设备的是分片存储设备的使用更加简洁,只需要用GUI_RECT声明一个需要需要绘图的区域,然后调用GUI_MEMDEV_Draw()函数即可执行绘图操作。该函数原型如下所示:
int GUI_MEMDEV_Draw ( GUI_RECT* pRect,GUI_CALLBACK_VOID_P* pDraw,void* pData,
int NumLines,int Flags)
参数 | 含义 |
pRect | 需要执行绘图操作的LCD区域的GUI_RECT指针 |
pDraw | 执行绘图操作的回调函数的指针 |
pData | 作为回调函数参数使用的一个数据结构的指针 |
NumLines | 0(推荐)或者是存储设备使用的分段数量 |
Flags | 0 或者 GUI_MEMDEV_HASTRANS |
1.3 自动存储设备
一个自动设备对象是基于分片存储设备建立的,它可以再某些应用方面更有效,例如移动标志,这种情况下,在一段时间内显示屏只有一小部分要更新。
该设备能自动识别显示屏的哪一部分包含固定的对象,哪一部分包含移动或改变的对象(必须更新)。当绘图函数第一次被调用时,所有的对象都被绘制出。而以后的函数调用只更新需要移动或改变的物体。实际的绘图操作使用分片存储设备机制,但只在需要的空间内使用。使用一个自动存储设备(与直接使用分片存储设备相比)的主要优点是节省了计算时间,因为它需要更新整个显示屏。
GUI_AUTODEV_INFO 结构包含有哪些对象必须要由用户函数绘制的信息():
1 | typedef struct |
2 | { |
3 | char DrawFixed; |
4 | } GUI_AUTODEV_INFO; |
如果所有的对象都要绘制,DrawFixed 设为1。当只有被移动或改变的物体才需要绘制的
时候,设为0(由软件自动进行计算)。在使用自动绘图设备进行绘图操作时,推荐使用下面的程序结构:
01 | typedef struct |
02 | { |
03 | GUI_AUTODEV_INFO AutoDevInfo; /* 哪些内容需要绘制的信息 */ |
04 | /* 给用户函数添加使用的数据 */ |
05 | …… |
06 | } PARAM; |
07 | static void Draw( void * p) |
08 | { |
09 | PARAM * pParam = (PARAM *)p; |
10 | if (pParam->AutoDevInfo.DrawFixed) |
11 | { |
12 | /* 绘固定的背景 */ |
13 | …… |
14 | } |
15 | /* 绘制移动的物体 */ |
16 | …… |
17 | if (pParam->AutoDevInfo.DrawFixed) |
18 | { |
19 | /* 绘固定的前景(如果需要) */ |
20 | …… |
21 | } |
22 | } |
23 | void main ( void ) |
24 | { |
25 | PARAM Param; /* 绘图函数的参数*/ |
26 | GUI_AUTODEV AutoDev; /* 分片存储设备的对象 */ |
27 | /* 绘图函数的 设置/修改 信息 */ |
28 | …… |
29 | GUI_MEMDEV_CreateAuto(&AutoDev); /* 建立 GUI_AUTODEV 对象 */ |
30 | GUI_MEMDEV_DrawAuto ( &AutoDev, /* 使用 GUI_AUTODEV 对象用于绘图 */ |
31 | &Param.AutoDevInfo, |
32 | &Draw, &Param); |
33 | GUI_MEMDEV_DeleteAuto(&AutoDev); /* 删除 GUI_AUTODEV 对象 */ |
34 | } |
ucGUI中抗锯齿是作为一个独立的部分发布的,它位于GUI\AntiAlias目录下。
2.1 抗锯齿的品质
抗锯齿的品质由函数GUI_AA_SetFactor设定。总共可以设置的等级为1~6,其中等级为1表示没有使用抗锯齿。一般来说抗锯齿系数取4就可以适应大部分的应用,再增加抗锯齿系数对于最终结果的影响并不显著,只会增加计算时间。
2.2 高分辨率坐标
当使用抗锯齿进行绘图时,使用的坐标与非抗锯齿的函数一样的,这是默认模式。在函数中不必考虑抗锯齿系数。ucGUI的高分辨率坐标特性可以使用抗锯齿系数和显示屏所决定的区域进行绘图。高分辨率坐标必须由函数GUI_AA_EnableHiRes启动,使用GUI_AA_DisableHiRes函数进行进行显示。
为了使用抗锯齿系数为3 的高分辨率模式从像素(50,100)到(100,50)绘一条直线,
程序应当这样写:
GUI_AA_DrawLine(150, 300, 300, 150);
源码详见:http://pan.baidu.com/share/link?shareid=590010509&uk=1208661112