打印

M4/M3 StellarisWare图形库(Grlib)入门系列(三)——基本图形绘制

[复制链接]
5959|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
TI_MCU|  楼主 | 2011-11-2 11:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 TI_MCU 于 2011-11-2 11:33 编辑

4.基本图形绘制
当完成3.2中驱动的设置后,就可以进行基本图形的绘制了。基本图形层的主要功能为绘制线、框、文字及位图文件。本章将分别介绍如何绘制这些对象。

4.1.绘图上下文 (tContext)
前文已经提到过,StellarisWare图形库可以在多个设备上进行绘制,所以在进行基本绘图时要指定绘图的设备。在StellarisWare图形库中,绘图设备由绘图上下文 (tContext) 这个对象指定。各类绘图函数都需要提供这个对象 (GrRectFill)

声明tContext后,需要用GrContextInit函数将其初始化,指明其所指的设备。而设备的对象为tDisplay,在显示驱动中提供。在LM3S9B96开发板上,tDisplay对象在Kitronix320x240x16_SSD2119.c中提供。代码如下所示:


//声明驱动库中定义的tDisplay对象
extern const tDisplay g_sKitronix320x240x16_SSD2119;
//================================================

// 声明绘图上下文
tContext sContext;

// 初始化StellarisWare图形库上下文
GrContextInit(&sContext, &g_sKitronix320x240x16_SSD2119);



4.2.颜色设置
通过以下两个函数可以设置绘图的颜色:
GrContextForegroundSet(pContext, ulValue)
GrContextBackgroundSet(pContext, ulValue)
其中一个是前景色,指的是绘制的图形或文字的颜色。另一个是背景色,但不是屏幕背景的颜色,而是绘制时可能会用到的颜色设置,如文字的底色等。

pContext指的当然是前面声明的tContext对象的指针,而ulValue是颜色值。为24bit颜色。用unsigned long表示,高8bit无效。如0x00FF0000代表纯红色,0x0000FF00代表纯绿色,0x000000FF代表纯蓝色。StellarisWare图形库中也定义了一些常用的颜色,如ClrBlueClrYellow等等。这些颜色 (附图片) 可以在图形库说明手册的附录中找到。或者也可以在grlib.h文件中找到这些定义。

4.3.绘制基本图形
下面的函数实现了圆形的绘制。其中GrCircleDraw画的是空心圆,GrCircleFill画的是实心圆。圆的颜色就是GrContextForegroundSet设置的颜色。
void GrCircleDraw (const tContext *pContext, long lX, long lY, long lRadius)
void GrCircleFill (const tContext *pContext, long lX, long lY, long lRadius)
GrRectDraw实现了空心方框的绘制而GrRectFill绘制实心方框。
void GrRectDraw (const tContext *pContext, const tRectangle *pRect)
void GrRectFill (const tContext *pContext, const tRectangle *pRect)
当绘制完成,调用GrFlush(const tContext *pContext)来确保图形都正常显示在屏幕上。下面的示例代码完成了两个不同颜色圆形的绘制:

// 声明绘图上下文
tContext sContext;

// 初始化StellarisWare图形库上下文
GrContextInit(&sContext, &g_sKitronix320x240x16_SSD2119);
// =================================================

// 设置画笔为黄色
GrContextForegroundSet(&sContext, ClrYellow);
// 画一个实心圆
GrCircleFill(&sContext, 80, 120, 40);


// 设置画笔为白色
GrContextForegroundSet(&sContext, ClrBlue);
// 画一个空心圆
GrCircleDraw(&sContext, 240, 120, 40);


// 确保图形被绘制在屏幕上
GrFlush(&sContext);


线条绘制同理。使用下面函数:
GrLineDraw (const tContext *pContext, long lX1, long lY1, long lX2, long lY2)


4.4.绘制文字
文字的绘制需要先设置字体,其它方面则和图形绘制相类似,如设置颜色。这里背景色也会用到。当文字背景色不为透明时,就会填充文字底色。

设置字体的函数为GrContextFontSet(tContext *pContext, const tFont *pFont)。其中tFont定义了字体,可以用于新建字体 (包括中文),这里不详述。StellarisWare图形库已经内置了上百种文字。这些字体可以在手册附录中查到名称及示例。常见的字体名如g_sFontCm12g_sFontCmss18i,
g_sFontCmsc20b
等。结尾的bi分别表示加粗和斜体,数字则是字体大小,Font后是字体名称。


绘制文字的函数主要有以下两种:
GrStringDraw(const tContext *pContext, const char *pcString, long lLength, long lX, long lY, unsigned long bOpaque);
GrStringDrawCentered(const tContext *pContext, const char *pcString, long lLength, long lX, long lY, unsigned long bOpaque);
参数中,pcString是指向文本的指针,lLength表示要显示的文字的长度,lXlY是位置。Opaque表示是否绘制文字底色 (背景色),当为0时则不绘制,非零时绘制底色。

DrawDrawCentered的区别是对齐方式。Draw是文字最左侧坐标为X,而DrawCentered是字符串的中间位置坐标为X。下面的示例代码完成了文字绘制:

// 声明绘图上下文
tContext sContext;

// 初始化StellarisWare图形库上下文
GrContextInit(&sContext, &g_sKitronix320x240x16_SSD2119);
// =================================================

// 设置画笔为黄色
GrContextForegroundSet(&sContext, ClrYellow);
// 设置字体为Cm,18号,粗体
GrContextFontSet(&sContext, &g_sFontCm18b);
// 输出文字
GrStringDraw(&sContext, "Hello World!", 12, 80, 150, true);

// 确保图形被绘制在屏幕上
GrFlush(&sContext);


4.5.
绘制图片
图片绘制要用到下面的函数:
GrImageDraw(const tContext *pContext, const unsigned char *pucImage, long lX, long lY)
lXlY表示图片的位置。pucImage是图片的数据。图片信息在StellarisWare图形库中有专门结构表示。

4.5.1.图片表示方式
用结构体可以比较轻易地描述StellarisWare对图片结构的定义,如下所示:


typedef struct
{
// 图片数据表示格式选择,可以有如下几种:
// IMAGE_FMT_1BPP_UNCOMP, IMAGE_FMT_4BPP_UNCOMP,
// IMAGE_FMT_8BPP_UNCOMP, IMAGE_FMT_1BPP_COMP
// IMAGE_FMT_4BPP_COMP or IMAGE_FMT_8BPP_COMP.
// UNCOMP表示非压缩格式,COMP表示压缩格式
unsigned char ucFormat;

// 图片的像素宽度
unsigned short usWidth;

// 图片的像素高度
unsigned short usHeight;

// 图片数据
unsigned char pucData[];
}tImage;


图片数据格式就不做过多说明,具体细节可以查看StellarisWare图形库的用户手册。

有一点需要注意到,GrImageDraw中图片指针的类型不是tImage而是unsigned char。这样做的原因是出于对效率的考虑,因为用tImage->pucData这样的形式在C中的效率比较低。在实际使用中,图片文件均被定义为unsigned char的数组而非结构体。TI提供了专门的工具从图片生成所需的数组。

4.5.2.图片生成工具
从上一节已经知道,在用StellarisWare图形库开发过程中,图片是用C语言中unsigned char数组表示的。这一节将介绍如何生成和使用它们。

TI StellarisWare图形库提供了一个将图片文件转换成C代码的软件。在StellarisWare/tools文件夹下,有一个叫pnmtoc.exe的程序 (pnmtoc文件夹下是源代码)。使用pnmtoc可以将pnm格式的图片转换为C代码。pnm不是常见的图片格式,但很多常见的绘图软件都可以直接生成pnm格式,如Photoshop。同时,也有很多免费转换工具可以将bmpjpeg等常见格式转换为pnm文件,如NetPBMGIMP等。

当得到pnm格式图片后可以使用pnmtoc来转换,命令如下:
pnmtoc -c image.pnm > image.c
这里会将image.pnm文件转换输出为image.c-c命令表示启用图片压缩。如果压缩后体积大于不压缩时,会自动关闭图片压缩。

通常生成如下形式的图片数组,g_pucImage**可直接作为GrImageDrawpucImage的参数。


const unsigned char g_pucImage**[] =
{
IMAGE_FMT_8BPP_COMP,
33, 0,
16, 0,

101,
0x00, 0x00, 0x00,
0x10, 0x10, 0x10,
0x2a, 0x2a, 0x2a,


0xc7, 0x07, 0x07, 0x00, 0x0f, 0x11, 0x07, 0x07, 0x07, 0x87, 0x01, 0x1b,
0x4d, 0x52, 0x1f, 0x07, 0x07, 0x04, 0x00, 0x0c, 0x37, 0x54, 0x55, 0x53,
0x00, 0x2d, 0x2f, 0x33, 0x33, 0x33, 0x33, 0x34, 0x34, 0x10, 0x34, 0x33,

};


相关帖子

沙发
teet| | 2011-11-3 07:22 | 只看该作者
谢谢楼主

使用特权

评论回复
板凳
teet| | 2011-11-3 07:22 | 只看该作者
真是经典啊

使用特权

评论回复
地板
tcwntc| | 2011-11-16 19:50 | 只看该作者
谢谢 楼主 不过没用过 所以没太看懂。。。

使用特权

评论回复
5
jjkkty| | 2014-5-20 19:52 | 只看该作者
LZ好像是ti的职工?
话说苦恼怎么显示数字,用那个显示文字的函数只能显示char...我想显示float类型.有什么办法么?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

420

帖子

7

粉丝