希伯来语与印地语调试总结
📎 原始文档:https://www.kdocs.cn/l/cdAa8pAc27pQ 希伯来语与印地语调试总结
一、编写目的
二、更换.a文件
三、字库接口更换
(1)获取语言类型的接口调整为font_lang_get()
(2)确认偏移表是否打开
四、字库初始化
五、添加字库文件
六、字库接口介绍
七、示例
一、编写目的
由于字库文件有相应的调整,直接使用公版SDK显示希伯来语以及印地语可能会出现问题,故作此文记录调试过程,供其他测试人员参考。
*注意:以下步骤均是基于701n_watch_release_v 1.0.2进行。
目前希伯来语以及印地语显示中遇到的问题如下所示:
| 编 号 | 遇到的问题 | 原因 | 解决办法 |
|---|---|---|---|
| 1 | 希伯来语字符不能正常显示,具体表现为显示空白 | 字库接口调整后,相应的接口没有进行替换 | 更新接口,具体请查看第三点 |
| 2 | 切换为印地语后,显示ascii码表字符只能显示字符的上面部分 | 显示的高度没有设置好 | 更新最新的font_new.a文件,具体请看第二点 |
| 3 | 不断切换语言,多次切换印地语后导致卡死 | 文件句柄在字库显示退出的时候没有关 | 更新最新的font_new.a文件,具体请看第二点 |
其中希伯来语问题为字符不能正常显示,原因是更新库后还要改用新的接口,以及需要注意希伯来语不支持混合的问题;而印地语主要有ascii码表字符只能显示上面部分,以及多次切换印地语后导致卡死的问题,由于涉及到库里面的函数,需要更换.a文件进行处理。 目前以上问题均得以解决,具体步骤请看下文。
二、更换.a文件
用新的font_new.a替换掉sdk\cpu\br28\liba的同名文件,并在code blocks进行rebuild。
三、字库接口更换
因多国语言与字库接口分开,使用字库时,需要将ui_language_set和ui_language_get分别换成font_lang_set和 font_lang_get。在ui_platform.c中,需要进行以下调整:
(1)获取语言类型的接口调整为font_lang_get()


使用希伯来语的话还需以下修改:
1 if (font_lang_get() == Arabic || font_lang_get() == Hebrew)
(2)确认偏移表是否打开

| 1 2 3 4 5 | if(font_lang_get() == MixAllLanguage){ font_set_offset_table (lange_offset_table ) ; }else{ font_set_offset_table (NULL) ; } |
|---|
四、字库初始化
在fontinit.c中对相应的语言进行初始化
如上图所示,在宏定义中添加相应的标志位BIT(),并配置相应语言的字库文件,即可完成字库的初始化。值得注意的是,希伯来语不支持混合,需要将其混合关闭才能够正常使用:
1 .language_id = Hebrew , //希伯来语
2 .flags = FONT_SHOW_PIXEL | FONT_SHOW_MULTI_LINE , [3](3 // .pixel.file.name =)[ // .pixel.file.name =](3 // .pixel.file.name =) (char *)FONT_PATH"F_Mix.PIX", [4](4 .ascpixel.file.name =)[ .ascpixel.file.name =](4 .ascpixel.file.name =) (char *)FONT_PATH"F_CP1255.PIX", [5](5 .tabfile.name =)[ .tabfile.name =](5 .tabfile.name =) (char *)FONT_PATH"F_CP1255.TAB", 6 .isgb2312 = false ,
7 .bigendian = false ,
8 .putchar = platform_putchar ,
如上图所示,需要将F_Mix. PIX去掉,并将F_Mix.TAB文件替换成F_CP1255.TAB。印地语则保持默认配置即可,如下所示:
1 .language_id = Indic , //印地语
2 .flags = FONT_SHOW_PIXEL | FONT_SHOW_MULTI_LINE , [3](3 .pixel.file.name =)[ .pixel.file.name =](3 .pixel.file.name =) (char *)FONT_PATH"F_GB2312.PIX", [4](4 .ascpixel.file.name =)[ .ascpixel.file.name =](4 .ascpixel.file.name =) (char *)FONT_PATH"F_ASCII.PIX", [5](5 .tabfile.name =)[ .tabfile.name =](5 .tabfile.name =) (char *)FONT_PATH"F_GB2312.TAB", [6](6 .extfile.name =)[ .extfile.name =](6 .extfile.name =) (char *)FONT_PATH"F_UNICO.PIX", [7](7 .gposfile.name =)[ .gposfile.name =](7 .gposfile.name =) (char *)FONT_PATH"gpos.bin",
8 .isgb2312 = false ,
9 .bigendian = false ,
10 .putchar = platform_putchar ,
到此为止,字库的初始化以及希伯来语的配置修改已经完成,接下来需要添加对应的字库文件。
五、添加字库文件
将需要用到的语言所需的. PIX、 .TAB等字库文件拷贝sdk\cpu\br28\tools\ ui_resource路径下,并对
sdk\cpu\br28\tools\download\watch下的download. bat文件进行编辑,添加所需的字库文件,如下图所示:
这个时候就可以对相应语言进行显示了。
六、字库接口介绍
在ui_text. h中,有以下字库接口:
其中主要分为带id的与不带id的,带id的接口自带刷新,一般在定时器的回调函数中使用,而不带id的接口需要手动刷新后才能够显示,一般在onchange事件中使用。
七、示例
demo1:
在相应文字控件上显示印地语字符:
demo2:
通过定时器在两个控件中分别显示ascii码表的内容和对应语言的字符,每隔500ms切换一次语言并显示相应内容。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | static u8 *hb_test = " מבחן קוד שלום " ; static u8 *hb_test1 = "hebrew_12/3/4/ 5 " ; static u8 *hb_test2 = " מבחן קוד שלום " ; static u8 *hb_test3 = " indic_345%! , .?& " ; static u8 *hb_test4 = " 345 अꃀ " ; static u8 *hb_test5 = "hello_china@#% " ;//हैलो 345 अꃀ static u8 *hb_test6 = "你好中国" ;//अꃀ static u8 *hb_test7 = "`@#$%^ , ./ " ;//अꃀ static u8 *hb_test8 = "你好" ;//अꃀ static u8 *hb_test9 = "एक परी∜ण कोड " ;//अꃀ static void Hebrew_show_timer(void *priv ) { static lang_num = 0 ; mem_stats(); switch (lang_num){ case 0 : font_lang_set(Indic ) ; ui_text_set_textu_by_id(HEBREW_1 , (char * )hb_test3 , strlen(hb_test3) , FONT_DEFAULT) ; ui_text_set_textu_by_id(HEBREW_WEATHER , (char * )hb_test4 , strlen(hb_test4) , FONT_DEFAULT) ; break ; case 1 : font_lang_set(Hebrew) ; ui_text_set_textu_by_id(HEBREW_1 , (char * )hb_test1 , strlen(hb_test1) , FONT_DEFAULT) ; ui_text_set_textu_by_id(HEBREW_WEATHER , (char * )hb_test2 , strlen(hb_test2) , FONT_DEFAULT) ; break ; case 2 : font_lang_set(Chinese_Simplified); ui_text_set_textu_by_id(HEBREW_1 , (char * )hb_test5 , strlen(hb_test5) , FONT_DEFAULT) ; ui_text_set_textu_by_id(HEBREW_WEATHER , (char * )hb_test6 , strlen(hb_test6) , FONT_DEFAULT) ; break ; default : break ;} lang_num++; if(lang_num > 2 ) lang_num = 0 ;} static int HEBREW_onchange(void *ctr , enum element_change_event e , void *arg){ |
|---|
45 struct ui_text *text = ( struct ui_text * )ctr; 46
47 static int timer = 0 ;
48 switch (e ) {
49 case ON CHANGE INIT :
50 if(!timer){
51 timer = sys_timer_add(NULL , Hebrew_show_timer , 500) ; 52 }
53 break ;
54 case ON CHANGE SHOW :
55 break ;
56 case ON CHANGE RELEASE :
57 if(timer){
58 sys_timeout_del (timer) ;
59 timer = 0 ; 60 }
61 break ;
62 default :
63 return FALSE; 64 }
65 return FALSE; 66 }