日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

嵌入式linux添加字体,嵌入式字体编辑及解析知识

發布時間:2023/12/31 linux 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌入式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添加字体,嵌入式字体编辑及解析知识的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。