天天看點

LittlevGL中使用FreeType問題LittlevGL中使用FreeType問題

LittlevGL中使用FreeType問題

問題一:噪點

直接使用FreeType傳回的位圖,當lvgl調用的時候回産生如下情況,字型下面會有很多的噪點:

LittlevGL中使用FreeType問題LittlevGL中使用FreeType問題

原因:因為FreeType傳回的字型位圖高度不一緻,而lvgl處理的時候是按照一定的字型高度進行處理,是以造成混亂,輸入很多的噪點。

解決方法:對位圖進行處理,高度不夠的字型進行0填充,使它的高度與lvgl定義的高度一緻,然後使用這個位圖。代碼如下:

memset(lv_bitmap, 0,  H_PX * bitmap->width); // H_PX為lvgl字型高度,像素為機關
memcpy(&lv_bitmap[copy_pos * bitmap->width], bitmap->buffer, bitmap->rows*bitmap->width);
           

問題二:字母排版

生成的bitmap正好就是文字的大小,是以把bitmap拷貝到大圖像上以後必須對其進行排版。文字不能都直接拷貝入同樣大小的方形子圖像上,雖然對于東亞文字問題不大,但是對于西方文字會非常的難看。因為東亞文字不存在基線,字元的大小也相同;而西方的文字存在基線,文字需要對齊,字元的大小也不相同。

LittlevGL中使用FreeType問題LittlevGL中使用FreeType問題

字型排版不是很好看,需要重新進行排版。

官方給出了一個圖,根據這個圖來進行排版:

LittlevGL中使用FreeType問題LittlevGL中使用FreeType問題

擷取字型的基線(origin),在更大的位圖中也需要找出一個基線(lvgl位圖),兩個基線對應,基線的上半部分位圖是存放字型的上半部分,他的高度為bearingY,lvgl的基線減去(bearingY+1),即可得到字型在更大圖中的起始位置:完整代碼如下

uint8_t lv_origin = (uint8_t)(H_PX * 0.85);
uint8_t copy_pos = lv_origin - slot->metrics.horiBearingY/64 - 1;

copy_bitmap(&slot->bitmap,copy_pos);
           
void copy_bitmap(FT_Bitmap*  bitmap,uint8_t copy_pos)
{
    int h_count = H_PX - bitmap->rows;
    memset(lv_bitmap, 0,  H_PX * bitmap->width);
    memcpy(&lv_bitmap[copy_pos * bitmap->width], bitmap->buffer, bitmap->rows*bitmap->width);
}
           

最後效果:

LittlevGL中使用FreeType問題LittlevGL中使用FreeType問題