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

原因:因為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拷貝到大圖像上以後必須對其進行排版。文字不能都直接拷貝入同樣大小的方形子圖像上,雖然對于東亞文字問題不大,但是對于西方文字會非常的難看。因為東亞文字不存在基線,字元的大小也相同;而西方的文字存在基線,文字需要對齊,字元的大小也不相同。
字型排版不是很好看,需要重新進行排版。
官方給出了一個圖,根據這個圖來進行排版:
擷取字型的基線(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);
}
最後效果: