最近在项目里用到很多字体方面的东西,下面我来总结下我的理解和运用,希望能帮助大家理解
两个字体生成软件,如果有需要软件的朋友可以上网下。我也可以发给你门
1.FontCreatorProgram 2.点阵字库生成器
在嵌入式系统里面,用的比较多字体库还是点阵,就算是ttf字库,也是需要转换成位图或点阵才
能被framebuff使用的。当然字体文件不能太大,嵌入式吧应该尽量节省资源flash等,可以根据
要求自己制作字库文件,这两个软件是制作字库的时候使用。
大家都知道既然有编码就有解码。那么在程序里面就应该有相应的解析过程,然后把解析出来的
buff放到framebuff上去,这样就可以显示了。
下面我主要介绍一下:点阵和ttf程序里面用到的知识。
点阵:(对于点阵字库生成器 生成的gbk字体文件)
1.加载字库到内存;
FILE *fp = NULL;
char filename[32];
memset(ptxtchsBuf,0,1500*1024);
sprintf(filename,"fonts/gbk.DZK");
fp = fopen(filename,"rb");
fseek(fp, 0, SEEK_SET);
fread(ptxtchsBuf, 1 , filesizechs, fp);
if(fp != NULL)
fclose(fp);
2.定位字库里面的字体;对于一串字符串pch
while(*pch != '\0')
{
if(y>=FONT_HEIGHT||x>=FONT_WIDTH)//超出范围不显示
return 1;
if(*pch == ' ') goto BACK;
if(*pch<128)
{
//此处不是中文,是数字大小写字母等一些特殊符号
}
else
{ //中文
int i=0,j=0,k=0,qh=0,wh=0,offset=0;
if (*(pch+1)<0x7f)
offset=((*(pch)-0x81)*190+(*(pch+1)-0x40))*60;
else if(*(pch+1)>=0x80)
offset=((*(pch)-0x81)*190+(*(pch+1)-0x41))*60;
else
{}
u16 *dst = (u16 *)(scrp->bufp+y*scrp->w+x);//定位framebuff的位置x y 坐标
u8 *src = (u8 *)chsyuv+offset;
for(i=0;i<20;i++)//一共几行
{
for(j=0;j<3;j++)//一行用3字节表示像素点
{
for(k=0;k<8;k++)//一个字节8位
{
if(src[i*3+j] & (0x80>>k))
{
3.显示字体; //上
if(y>0&&g_show_twice)
dst[k+j*8-scrp->w] = color;
//下
//dst[k+j*8+scrp->w]=color;
dst[k+j*8]= color;
}
}
}
dst += WIDTH;
}
x += font_width;
++pch;
}
l1:
x += font_width;
++pch;
}
ttf:解析simfang.ttf需要用到网上比较使用的freetype库(网上比较多此类文章)
1.初始化
FT_Error error;
static int initialized = 0;
if (initialized)
return SUCCESS;
initialized = 1;
error = FT_Init_FreeType(&library);
if (error) {
return FAILURE;
}
error = FT_New_Face(library, filename, 0, &face);
if (error) {
return FAILURE;
}
error = FT_Select_Charmap(face, encoding);
if (error) {
return FAILURE;
}
2.显示到frambuff上
//首先要转换字符集
c_pt = iconv_open("ucs-2","gb2312");
if(c_pt == (iconv_t)-1){
printf("iconv_open failed 1");
return FAILURE;
}
ret = iconv(c_pt, &text, &lenin, &pch, &lenout);
if(ret == -1){
printf("iconv failed 3");
}
ret = iconv_close(c_pt);
if(ret == -1){
printf("iconv_close failed 4");
}
FT_Set_Char_Size(face,
font_height << 6,
font_height << 6,
100,
100);
pen.x = x << 6;
pen.y = y << 6;
for(k=0;k {
FT_Set_Transform(face, NULL, &pen);
code = buf[k]*256+buf[k+1];
index = FT_Get_Char_Index(face, code);
error = FT_Load_Glyph(face, index, 0);
if (error) {
break;
}
if (face->glyph->format != FT_GLYPH_FORMAT_BITMAP) {
error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
if (error) {
break;
}
}
width = face->glyph->bitmap.width;
height = face->glyph->bitmap.rows;
//到这里其实就已经得到了bitmap这样一个结构,里面就有buff
//只要把这块区域映射到framebuff上就可以显示
}
阅读(1995) | 评论(0) | 转发(0) |