LVGL通过freetype渲染阿拉伯语

1:阿拉伯语与汉语的比较

       阿拉伯语与汉语在书写方式上存在的一定差异,汉语是从左到右(LTR)的书写方式而阿拉伯语为从右到左(RTL)的书写方式,在LVGL中要想对文本方向进行设置我们需要打开lv_conf.h 中的     LV_USE_BIDI 将其置为1,然后再选择我们想要设置的文本方向,文本方向宏定义为LV_BIDI_BASE_DIR_DEF,其值有三种:

1:LV_BASE_DIR_LTR 从左到右 

2:LV_BASE_DIR_RTL 从右到左

3: LV_BASE_DIR_AUTO 自动选择其文本方向

2:阿拉伯的unicode编码

2.1:什么是unicode编码

Unicode编码是一种字符编码标准,它为世界上几乎所有的字符和符号分配了唯一的数字标识符,以便在计算机系统中进行统一的表示和处理。

2.2:阿拉伯文字的unicode范围

( U+0600 – U+06FF) 阿拉伯字符

( U+FB50 – U+FDFF) 阿拉伯表达形式字符集 A

( U+FE70 – U+FEFF) 阿拉伯表达形式字符集 B

2.3:阿拉伯文字的unicode编码字符集的区别

阿拉伯字符(U+0600 – U+06FF):

这个字符集包含了阿拉伯语的基本字符集,包括字母、数字、标点符号和其他特殊字符。它涵盖了阿拉伯语的基本写作和书写所需的字符。

阿拉伯表达形式字符集 A(U+FB50 – U+FDFF):

这个字符集包含了阿拉伯语的表达形式字符,用于在特定上下文中表示阿拉伯语的字母和词汇。它包括了与阿拉伯语书写方式相关的字母变体、连接形式和调整形式等特殊字符。

阿拉伯表达形式字符集 B(U+FE70 – U+FEFF):

这个字符集也包含了阿拉伯语的表达形式字符,用于在特定上下文中表示阿拉伯语的字母和词汇。它包括了更多的字母变体、连接形式和其他特殊字符,用于在不同书写环境中正确呈现阿拉伯语文本。

3:阿拉伯语连笔

"مفاتيح الاختصار"对这个观察可以看出其中存在着多个字符连接在一起的情况,这就是阿拉伯语中的连笔写法,连笔(Ligature)是一种书写特性,它涉及将相邻的字母以一种特定的方式连接在一起形成一个字形。连笔在阿拉伯语中广泛使用,旨在改善字母之间的连续性和整体美感。如果要想我们LVGL显示出来的文本也具有这种连笔效果效果的话,我们就需要使能开启lv_conf.h中的LV_USE_ARABIC_PERSIAN_CHARS 置为1,使能这个宏定义的作用在于/*启用阿拉伯语/波斯语处理在这些语言中,字符应根据它们在文本中的位置被替换为其他形式。

#define LV_USE_ARABIC_PERSIAN_CHARS 0

#define LV_USE_ARABIC_PERSIAN_CHARS 1

4:直接使用LVGL里面的自定义字体

在lvgl中阿拉伯的相关字体是LV_FONT_DEJAVU_16_PERSIAN_HEBREW 16 px 字体,正常范围 + 希伯来语、阿拉伯语、波斯语字母及其所有形式,我们想要使用的话就想要打开 将LV_FONT_DEJAVU_16_PERSIAN_HEBREW 使能置1,然后再设置lable字体的时候设置为该字体

lv_obj_t *mylable=lv_label_creat(lv_scr_act());
lv_obj_set_style_text_font(mylable,&&lv_font_dejavu_16_persian_hebrew,0);
lv_obj_align(mylable,LV_ALIGN_CENTER,0,0);
lv_obj_set_size(mylable,LV_PCT(50),LV_PCT(50));
LV_label_set_text(mylable,"مفاتيح الاختصار");

 5:结合freetype进行渲染

5.1:什么是ttf文件

ttf(True Type Font)是一种字库名称,ttf文件就是字体文件;

5.2:freetype

freetypeFreeType是一个完全开源的、可扩展、可定制且可移植的字体引擎,它提供TrueType字体驱动的实现统一的接口来访问多种字体格式文件,包括点阵字、TrueType、OpenType、Type1

 5.3:获取字体的ttf文件

     为了达到连笔的效果ttf文件一定要包含( U+0600 – U+06FF) 阿拉伯字符( U+FB50 – U+FDFF) 阿拉伯表达形式字符集 A ( U+FE70 – U+FEFF) 阿拉伯表达形式字符集 B,此处我推荐下载DejaVu Sans 字体 | Fonts2u.com 的阿拉伯字体库(因为我下载了其他的阿拉伯字体库里面没有包含字符集A和B,造成显示的阿拉伯字体一直没有连笔的效果,在这里就卡了很长的时间)。

5.3:初始化字体

//字体信息,ttf文件名,字体大小
bool _InitFont(lv_ft_info_t* pftinfo, const char* ttfname, int size)
{
    pftinfo->name = ttfname;
    pftinfo->weight = size;
    pftinfo->style = FT_FONT_STYLE_NORMAL;
    pftinfo->mem = NULL;
    if (!lv_ft_font_init(pftinfo))
    {
        xlog_error("init font error! font:%s, size:%d", ttfname, size);
        return false;
    }
    pftinfo->font->fallback = LV_FONT_DEFAULT;
    return true;
}
/*lv_ft_info_t*/
typedef struct {
    const char * name;  /* The name of the font file */
    const void * mem;   /* The pointer of the font file */
    size_t mem_size;    /* The size of the memory */
    lv_font_t * font;   /* point to lvgl font */
    uint16_t weight;    /* font size */
    uint16_t style;     /* font style */
} lv_ft_info_t;

5.4:使用通过freetype渲染出来的字体

lv_obj_t *mylable=lv_label_creat(lv_scr_act());
lv_obj_set_style_text_font(mylable,pftinfo.font,0);
lv_obj_align(mylable,LV_ALIGN_CENTER,0,0);
lv_obj_set_size(mylable,LV_PCT(50),LV_PCT(50));
LV_label_set_text(mylable,"مفاتيح الاختصار");

5.5:效果图

参考:freetype使用总结-CSDN博客

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值