嵌入式linux添加字体,嵌入式字体编辑及解析知识
最近在項目里用到很多字體方面的東西,下面我來總結下我的理解和運用,希望能幫助大家理解
兩個字體生成軟件,如果有需要軟件的朋友可以上網下。我也可以發給你門
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上就可以顯示
}
總結
以上是生活随笔為你收集整理的嵌入式linux添加字体,嵌入式字体编辑及解析知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Trello架构分享
- 下一篇: linux如何发现内存卡,分享|如何在