基本图形和图像的绘制
上次,我和大家一起分享了如何为ti的图形驱动库编写底层驱动函数。
现在让我们来看一下如果使用ti提供的库来绘制最基本的字符图形,图形和图像。也就是我说的图形驱动库的第二层:图形基元层。
首先,在mian函数文件中我们要包含grlib.h这个头文件。在这个头文件里定义了一些图形绘制所需要的最基本的一些数据结构和一些宏函数。同时也有对图形绘制函数的声明。同时定义一个全局的结构体:tContext MyContext;
tContext是一个图形绘制的上下文。其定义如下:
typedef struct
{
//
//! The size of this structure.
//
long lSize;
//
//! The screen onto which drawing operations are performed.
//
const tDisplay *pDisplay;
//
//! The clipping region to be used when drawing onto the screen.
//
tRectangle sClipRegion;
//
//! The color used to draw primitives onto the screen.
//
unsigned long ulForeground;
//
//! The background color used to draw primitives onto the screen.
//
unsigned long ulBackground;
//
//! The font used to render text onto the screen.
//
const tFont *pFont;
} 大家可以看出这个结构中就包含了绘制的显示驱动结构,区域,前景,背景,字体。这个结构在函数中我们会对他初始化,并做为绘制的一个依据。
进入主函数我们在完成系统时钟配置之后,我们要做的第一件事情就是初始化LCD,使LCD进入一个合理的工作状态。然后以一种颜色把lcd清屏。并设置好背光。在我的这个硬件条件下。代码如下:
LCD_Init();//初始化LCD
SSD1963_SetBacklight(255);//设置背光
LCDClearScreen(DpyColorTranslate(&MyDisplay, ClrWhite));//清屏
大家注意一点就是,我使用的LCD是RGB666方式,而TI的库则是以RGB888的数据格式提供给我们颜色数据。所以在调用LCDClearScreen这个函数的时候我们传入的颜色参数必须由我们编写的底层驱动函数来转换。否则LCD的颜色显示将会不正常。
上面一系列的初始化我们可以认为是使用TI图形库的一些先决条件。然后我们来初始化TI的库。
这是ti的库提供的预定义的颜色。如我们要想在使用ClrLightCoral这个颜色的话,那么我们只需要用ti库提供的函数进行如下设置:
GrContextForegroundSet(&MyContext,ClrLightCoral);
这句实际就是把MyContext这个绘制上下文的前景颜色设置为ClrLightCoral。
字体设置也是一样的道理。字体参考如下:
如我想设置为g_sFontCmss36b这种字体,那么我们只需要写一句:
GrContextFontSet(&MyContext,
&g_sFontCmss36b);这样就在MyContext这个上下文中设置好了绘制的字体。
[ 本帖最后由 zhengjiewen 于 2010-11-23 12:38 编辑 ]
现在我们开始绘制。 调用函数void GrStringDraw(const tContext *pContext, const char *pcString, long lLength, long lX, long lY, unsigned long bOpaque); 形参意义如下: pContext:图形绘制的上下文。 *pcString,:要绘制的字符串指针 long lLength:要绘制的字符串长度,如果全部绘制的话那么设置为-1. long lX, long lY,为绘制的起始坐标。 bOpaque:这个参数决定了在绘制的时候是否绘制背景色。 首先说明一下,我这块lcd的坐标定义如下图:
以左上角为原点,向下为y轴,向右为x轴。现在我想把”hello eeworld!这个字符串打到lcd上起始坐标为10,120.那么我们可以写上如下代码:GrStringDraw(&MyContext,"hello
eeworld !",-1,40,120,true);在执行
这句后我们再看lcd显示状态:
可以看到,“hello eeworld!”这句话以我们预定的颜色和字体出现在lcd上了,是不是很不可思意? 当然大家也可以看到了个问题,再字符的周围全是黑的。这是因为我们没有设置绘制背景色,默认就是黑色。可以通过代码:
GrContextBackgroundSet(&MyContext,ClrWhite);
来设置绘制背景色为白色。设置好了再次绘制就可以看到我们想要的结果了。如下图:
那么除了写字符,还可以画点,画线,画矩形,画填充矩形,画圆,画填充圆。画图象。这些都是图形基元层提供给大家的功能。函数的具体使用大家可以参考ti的图形驱动库文档,在这里我就不再详述。下面我就来调用这些函数在lcd上实现绘制图形。 int main() { tContext MyContext; tRectangle MyRect; SysCtlClockSet(SYSCTL_XTAL_8MHZ|\ SYSCTL_OSC_MAIN| SYSCTL_SYSDIV_4| SYSCTL_USE_PLL ); TheSysClock=SysCtlClockGet(); LCD_Init();//初始化LCD SSD1963_SetBacklight(255);//设置背光 LCDClearScreen(DpyColorTranslate(&MyDisplay,ClrWhite));//清屏 GrContextInit(&MyContext, &MyDisplay);//初始化绘制上下文 GrContextForegroundSet(&MyContext,ClrLightCoral); GrContextBackgroundSet(&MyContext,ClrWhite); GrContextFontSet(&MyContext, &g_sFontCmss36b); //写字符 GrStringDraw(&MyContext,"hello eeworld !",-1,40,120,true); //画线 GrLineDraw(&MyContext,0,0,320,20); //设置前景色为蓝色 GrContextForegroundSet(&MyContext,ClrBlue); //画线 GrLineDraw(&MyContext,0,20,320,40); //设置矩形大小 MyRect.sXMin = 50; MyRect.sYMin = 50; MyRect.sXMax = 200; MyRect.sYMax = 80; //设置前景色 GrContextForegroundSet(&MyContext,ClrNavy); GrRectFill(&MyContext, &MyRect); //设置前景色 GrContextForegroundSet(&MyContext,ClrDeepPink); MyRect.sXMin = 40; MyRect.sYMin = 60; MyRect.sXMax = 210; MyRect.sYMax = 90; //画矩形 GrRectDraw(&MyContext, &MyRect); //画填充矩形 GrCircleDraw(&MyContext,160,120,100); //设置前景色 GrContextForegroundSet(&MyContext,ClrLime); //画填充圆 GrCircleFill(&MyContext,250,60,50); //设置前景色 GrContextForegroundSet(&MyContext,ClrDarkOrange); //画填充圆 GrCircleFill(&MyContext,50,190,40); while(1); 最后实现的效果如下图:
以上就是如何使用TI的图形库来完成基本图形的绘制。代码请大家在附件中下载。下次我会和大家一起分享如何使用ti提供的工具来来生成我们自己想要的字体和图像。
睡午觉先。。
[ 本帖最后由 zhengjiewen 于 2010-11-23 12:58 编辑 ]