英创信息技术EM9280矢量字库应用简介

1、简述
使用矢量字库的好处是可灵活选择显示的字体以及字体大小,便于客户进行用户界面的设计。一般来说一个矢量字库文件包含一组字形,每个字形可以存成位图、向量表示或其他结构(可缩放的格式使用一种数学表示和控制数据/程序的结合方式),字体文件包含一个或多个表,叫做字符图,可用来为某种字符编码将字符码转换成字形索引,例如ascii、unicode、big5等等。因此如何从字体文件中获取到字符码所对应的位图数据才是关键。
freetype 是一个开源的获取字模数据的软件包,其函数库可实现让客户应用程序方便的访问字体文件,并方便地提取某个字符的字形数据(bitmap),从而使得应用程序可按照bitmap格式将字形显示出来。所以要在em9280上实现矢量字库的应用,必须首先移植freetype。
2、freetype移植
freetype的移植过程:
1、下载源码:git clone git://git.sv.nongnu.org/freetype/freetype2.git
2、转入工作目录:cd freetype2
3、生成configure:./autogen.sh
4、配置,生成makefile
./configure --host=arm-none-linux-gnueabi(平台) --prefix=/(安装目录)
5、编译 make
6、安装 make install
编译成功后将生成的libfreetype.so.2.6.10等库文件,这些文件放入到em9280根文件系统/lib目录下。为了方便客户使用,同时我们还放置了两个字体文件:
simsun_2_50.ttc (宋体)
arial_1_08.ttf (arial)
到此em9280的环境下freetype的移植就完成了。下面将介绍应用程序如何利用freetype函数进行字符显示。
3、矢量字库的应用程序开发
调用freetype函数库进行字符显示一般是以下几个步骤:
1、初始化库 ft_init_freetype( )
2、通过创建一个新的 face 对象来打开一个字体文件 ft_new_face( )
3、以点或者象素的形式选择一个字符大小 ft_set_char_size( )
4、装载一个字形(glyph)图像,并把它转换为位图 ft_render_glyph( )
5、显示一个简单的字符 draw_bitmap( )
在进行应用程序开发时,首先需要将freetype相关的头文件添加到编译工具的相关include目录下,对应英创公司提供eclipse编译环境,即如下图所示,需要将 freetype2 include目录下的ft2build.h 和freetype复制到 pc机的c:\sourcery g++ lite \ arm-none-linux-gnueabi\libc\usr\include\目录下。
freetype的应用需要用到专用的动态库libfreetype.so、libz.so两个文件,所以需要将这两个文件复制到应用程序工程文件project目录下,同时在eclipse环境对此程序编译时,需要设置相应的编译属性。在project explorer视窗下,选择需要设置的工程文件,然后点击鼠标右键,选择 properties项,在窗口中选择c/c++ build -> settings -> tool settings -> sourcery g++ c++ linker -> libraries,如下图所示。其中的一个窗口用于指定库文件的名称,一个用于指定库文件的路径。
在英创公司提供的光盘示例程序step1_lcdtest中, 其中lcd_graph.h文件图形操作的api函数,在此基础之上,我们增加了显示文本的几个函数:
功能描述: 初始化freetype库,并创建face打开simsun_2_50.ttc字体文件。
返回值: 0 成功 <0 失败
int loadttf( )
功能描述: 设置字体大小。
输入参数: size 字体大小标号,对应关系:10 -- 五号 14 -- 四号 16 -- 三号 22 -- 二号 26 -- 一号 42 -- 初号
返回值: 当前字体大小值。
int setfntsize( int size )
功能描述: 获取字体大小。
返回值: 当前字体大小值。
int getfntsize( )
功能描述: 设置前景色。
输入参数: color 32位rgb值
void setcolor( unsigned int color )
功能描述: 设置背景色。
输入参数: color 32位rgb值
void setbkcolor( unsigned int color )
功能描述: 显示字符串到屏幕相应位置。
输入参数: rect 用于定义字符串显示位置框:left top right bottom。textstring 字符串内容,由汉字内码和ascii码组成
返回值: 当前字体大小值。
void drawtext( rect rect, char* textstring )
在调用drawtext()函数之前,客户可调用setcolor( ) 、setbkcolor( )分别设置字体的颜色以及背景颜色。对于字体显示来说,目前我们提供的范例程序仅支持单一背景颜色。
以下为freetype应用实现的部分代码:
int loadttf( )
{
int error;
error = ft_init_freetype( &library );
if( error )
{
printf( 'ft_init_freetype error:%d\n ', error );
return -1;
}
error = ft_new_face( library,'/usr/simsun_2_50.ttc',0,&face_simsun );
if( error )
{
printf( 'ft_new_face error:%d\n ', error );
return -1;
}
error = ft_select_charmap( face_simsun, ft_encoding_unicode );
if( error )
{
printf( 'ft_select_charmap error:%d\n ', error );
return -1;
}
return 0;
}
void drawtext( rect rect, char* textstring )
{
int i1, len;
char* u_text;
int pen_x, pen_y;
int error;
ft_uint glyph_index;
ft_ulong ul_char;
ft_bool use_kerning;
ft_uint previous;
pen_x = rect.left;
pen_y = rect.bottom;
if( textstring==null ) return;
i1 = strlen(textstring);
u_text = new char[2*i1];
/*字符串进行unicode的转换*/
len = ucs2.getunicode( textstring, u_text, 2*i1 );
use_kerning = ft_has_kerning( face_simsun );
previous = 0;
for( i1=0; i1 {
ul_char = (u_text[i1+1] 6;
}
error = ft_load_glyph( face_simsun, /* handle to face object */
glyph_index, /* glyph index */
ft_load_default); /* load flags, see below */
if( error )
printf( 'ft_load_glyph():%d\n ', error );
error = ft_render_glyph( face_simsun->glyph, /* glyph slot */
ft_render_mode_lcd);
if( error )
printf( 'ft_render_glyph():%d\n ', error );
ft_glyphslot slot = face_simsun->glyph;
/*显示字符的bitmap*/
draw_bitmap( &slot->bitmap, pen_x + slot->bitmap_left, pen_y-slot->bitmap_top );
pen_x += slot->advance.x >> 6;
}
delete u_text;
}
void setfntsize( int size )
{
int error;
error = ft_set_char_size(
face_simsun, /* handle to face object */
0, /* char_width in 1/64th of points */
size*64, /* char_height in 1/64th of points */
129, /* horizontal device resolution */
135 ); /* vertical device resolution */
if( error )
{
printf( 'ft_set_char_size error:%d\n ', error );
return;
}
fontsize = (unsigned int)size;
}
这里需要解释下设置字符大小参数中垂直分辨率以及水平分辨率的定义,这两个参数均是指显示设备的分辨率,单位每英寸(inch)的点数(dpi),所以对于不同尺寸的lcd屏,其参数值是不同的。以下为em9280常接的几种lcd屏dpi值。
名称 型号 分辨率 dpi分辨率
4.3' tft彩色lcd lr430 480×272 128×128
5.6' tft彩色lcd at056tn52 640×480 144×144
7.0' tft彩色lcd at070tn83 640×480 135×129
8.4' tft彩色lcd g084sn03 800×600 119×119
10.4' tft彩色lcd g104sn03 800×600 119×119

Alphabet旗下智慧城市项目即将展开 华为中标42个智慧城市项目
电力监控系统Acrel-2000在某商业中心应用实例分析
LED显示屏驱动扫描的特性解析
化纤行业低压无功补偿电能质量问题及解决办法
苹果发布会另一嘉宾 Pokemon Go CEO 登台演示 用apple watch怎么玩
英创信息技术EM9280矢量字库应用简介
对数字化车钥匙开发贡献卓著,恩智浦荣获宝马集团供应商创新奖!
无敌是多么寂寞!小米6外形、价格曝光:1999元配置无敌!
锂离子电池正负极补锂技术
滴滴未来5年布局新能源汽车, 推动新能源汽车普及
TSMC 28nm产能将优先提供NVIDIA使用
芯片的雕刻刀!揭秘走在国产替代前列的刻蚀设备
Qualcomm扩大Wi-Fi接入点和路由器领域802.11ac MU-MIMO产品组合
FPGA如何修复时序混乱问题(2)
Mini LED电视涨势凶猛但还缺有人推一把
科大讯飞智能家居生态合作峰会召开 以MORFEI(讯飞魔飞)为核心的讯飞智能家居生态正在形成
富士康与珠海市政府签署合作协议 将对珠海IC晶圆厂进行支援与推展
因取消支付宝渠道美团遭遇反垄断诉讼,是正常商业行为还是侵犯消费者选择
高速差分接口及共模滤波与保护的需求
印度可穿戴设备连续增长 小米手环占据了一半的出货量