191 lines
6.0 KiB
ReStructuredText
191 lines
6.0 KiB
ReStructuredText
|
字库生成
|
|||
|
=================================
|
|||
|
|
|||
|
:link_to_translation:`en:[English]`
|
|||
|
|
|||
|
1、功能概述
|
|||
|
--------------------
|
|||
|
|
|||
|
本文档主要介绍OSD中所用到的字库生成以及在代码中的适配。
|
|||
|
|
|||
|
2、参考路径
|
|||
|
--------------------
|
|||
|
|
|||
|
OSD参考代码在 ``components/bk_draw_blend`` 和 ``components/display_service/src/lcd_draw_blend.c``
|
|||
|
|
|||
|
|
|||
|
3、字库生成
|
|||
|
--------------------
|
|||
|
|
|||
|
1) 字库定义路径在 ``../components/bk_draw_blend/string.c``
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
#if FONT_ANTI4BPP_BLACK24
|
|||
|
………
|
|||
|
#endif
|
|||
|
|
|||
|
2) 字库的头文件声明路径 ``../bk_idk/include/modules/lcd_font.h``
|
|||
|
|
|||
|
3) 字库生成的工具:FontCvt.exe
|
|||
|
|
|||
|
.. figure:: ../../../../common/_static/osd/fontcvt-exe.png
|
|||
|
:align: center
|
|||
|
:figclass: align-center
|
|||
|
|
|||
|
|
|||
|
4) 双击打开FomtCvt.exe,出现下面界面:默认选择Extended,antialiased,4bpp,点击OK
|
|||
|
|
|||
|
.. figure:: ../../../../common/_static/osd/fontcvt-1.png
|
|||
|
:align: center
|
|||
|
:figclass: align-center
|
|||
|
|
|||
|
|
|||
|
5) 出现下面的弹框,根据自己需求去修改字体、字形或者字体大小。
|
|||
|
|
|||
|
.. figure:: ../../../../common/_static/osd/fontcvt-2.png
|
|||
|
:align: center
|
|||
|
:figclass: align-center
|
|||
|
|
|||
|
|
|||
|
6) 选择菜单栏的edit选项,选择展开的“Disable all characters”选项
|
|||
|
|
|||
|
.. figure:: ../../../../common/_static/osd/fontcvt-3.png
|
|||
|
:align: center
|
|||
|
:figclass: align-center
|
|||
|
|
|||
|
|
|||
|
7) 选择“enable range of characters”选项,选择特定的汉字
|
|||
|
|
|||
|
.. figure:: ../../../../common/_static/osd/fontcvt-4.png
|
|||
|
:align: center
|
|||
|
:figclass: align-center
|
|||
|
|
|||
|
.. figure:: ../../../../common/_static/osd/fontcvt-5.png
|
|||
|
:align: center
|
|||
|
:figclass: align-center
|
|||
|
|
|||
|
|
|||
|
8) 或者将第7步使用下面的方式,这种方式更加便捷简单
|
|||
|
打开记事本将所需的字另存为unicode编码格式:
|
|||
|
|
|||
|
.. figure:: ../../../../common/_static/osd/fontcvt-6.png
|
|||
|
:align: center
|
|||
|
:figclass: align-center
|
|||
|
|
|||
|
然后读入刚才的temp.txt文件
|
|||
|
|
|||
|
.. figure:: ../../../../common/_static/osd/fontcvt-7.png
|
|||
|
:align: center
|
|||
|
:figclass: align-center
|
|||
|
|
|||
|
.. figure:: ../../../../common/_static/osd/fontcvt-8.png
|
|||
|
:align: center
|
|||
|
:figclass: align-center
|
|||
|
|
|||
|
|
|||
|
9) 选择菜单栏的File选项,选择展开的“Save AS”选项, 把生成的c文另存为,注意文件名字改成英文
|
|||
|
|
|||
|
.. figure:: ../../../../common/_static/osd/fontcvt-9.png
|
|||
|
:align: center
|
|||
|
:figclass: align-center
|
|||
|
|
|||
|
10) 用编译器打开该C文件,去掉下图的部分
|
|||
|
|
|||
|
|
|||
|
.. figure:: ../../../../common/_static/osd/fontcvt-10.png
|
|||
|
:align: center
|
|||
|
:figclass: align-center
|
|||
|
|
|||
|
将剩余的拷贝到string.c中
|
|||
|
|
|||
|
.. figure:: ../../../../common/_static/osd/fontcvt-11.png
|
|||
|
:align: center
|
|||
|
:figclass: align-center
|
|||
|
|
|||
|
11) 参考其他的字体,将文件修改完善
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
GUI_CONST_STORAGE gui_font_digit_struct GUI_Fontnoanti_newsong48_CharInfo[95] = {
|
|||
|
|
|||
|
{1, 1, 24, 34, 0, 0, 24, NULL} //the first must 1.
|
|||
|
|
|||
|
,{ 0x002E, 1, 6, 6, 3, 35, 24, acGUI_Fontnoanti_newsong48_002E } /* code 002E, FULL STOP */
|
|||
|
,{ 0x0030, 1,20, 33, 2, 8, 24, acGUI_Fontnoanti_newsong48_0030 } /* code 0030, DIGIT ZERO */
|
|||
|
,{ 0x0031, 1,13, 33, 6, 8, 24, acGUI_Fontnoanti_newsong48_0031 } /* code 0031, DIGIT ONE */
|
|||
|
,{ 0x0032, 1,19, 33, 2, 8, 24, acGUI_Fontnoanti_newsong48_0032 } /* code 0032, DIGIT TWO */
|
|||
|
,{ 0x0033, 1,18, 33, 3, 8, 24, acGUI_Fontnoanti_newsong48_0033 } /* code 0033, DIGIT THREE */
|
|||
|
,{ 0x0034, 1,20, 33, 2, 8, 24, acGUI_Fontnoanti_newsong48_0034 } /* code 0034, DIGIT FOUR */
|
|||
|
,{ 0x0035, 1,18, 33, 3, 8, 24, acGUI_Fontnoanti_newsong48_0035 } /* code 0035, DIGIT FIVE */
|
|||
|
,{ 0x0036, 1,20, 33, 2, 8, 24, acGUI_Fontnoanti_newsong48_0036 } /* code 0036, DIGIT SIX */
|
|||
|
,{ 0x0037, 1,18, 33, 3, 8, 24, acGUI_Fontnoanti_newsong48_0037 } /* code 0037, DIGIT SEVEN */
|
|||
|
,{ 0x0038, 1,19, 33, 2, 8, 24, acGUI_Fontnoanti_newsong48_0038 } /* code 0038, DIGIT EIGHT */
|
|||
|
,{ 0x0039, 1,19, 33, 2, 8, 24, acGUI_Fontnoanti_newsong48_0039 } /* code 0039, DIGIT NINE */
|
|||
|
,{ 0x003A, 1, 5, 23, 9, 18, 24, acGUI_Fontnoanti_newsong48_003A } /* code 003A, COLON */
|
|||
|
|
|||
|
,{ 0x0056, 1,22, 33, 1, 8, 24, acGUI_Fontnoanti_newsong48_0056 } /* code 0056, LATIN CAPITAL LETTER V */
|
|||
|
,{ 0x004C, 1,20, 33, 2, 8, 24, acGUI_Fontnoanti_newsong48_004C } /* code 004C, LATIN CAPITAL LETTER L */
|
|||
|
|
|||
|
,{0, 1, 24, 34, 0, 0, 24, NULL} //the end must 0.
|
|||
|
};
|
|||
|
|
|||
|
在刚才的字体文件中补全数组的第一行和最后一行,注意补全下方红色边框框出的逗号
|
|||
|
|
|||
|
|
|||
|
.. figure:: ../../../../common/_static/osd/fontcvt-12.png
|
|||
|
:align: center
|
|||
|
:figclass: align-center
|
|||
|
|
|||
|
|
|||
|
需要对文件进行如下的替换操作,下图中指向部分填充4个空格,选全部替换。
|
|||
|
|
|||
|
.. figure:: ../../../../common/_static/osd/fontcvt-13.png
|
|||
|
:align: center
|
|||
|
:figclass: align-center
|
|||
|
|
|||
|
在将下图中红色框2中所有选择部分填充到前面红色框1处,可用Alt+左键,进行竖向选择。
|
|||
|
|
|||
|
.. figure:: ../../../../common/_static/osd/fontcvt-14.png
|
|||
|
:align: center
|
|||
|
:figclass: align-center
|
|||
|
|
|||
|
替换操作后,需要去掉下图中圈出的参数。
|
|||
|
|
|||
|
.. figure:: ../../../../common/_static/osd/fontcvt-15.png
|
|||
|
:align: center
|
|||
|
:figclass: align-center
|
|||
|
|
|||
|
12) 最后,声明字库
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
#if FONT_NOANTI_NEWSONG42
|
|||
|
extern const gui_font_digit_struct *const font_noanti_newsong42;
|
|||
|
#endif
|
|||
|
|
|||
|
.. note::
|
|||
|
|
|||
|
如何确认生成字库的尺寸?
|
|||
|
字库的结构体中是如下定义的:
|
|||
|
|
|||
|
::
|
|||
|
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
const unsigned short value;
|
|||
|
const unsigned char bit_point; //every point user bit.
|
|||
|
const unsigned char x_size;
|
|||
|
const unsigned char y_size;
|
|||
|
const signed char x_pos;
|
|||
|
const signed char y_pos;
|
|||
|
const unsigned char width;
|
|||
|
const unsigned char *const data;
|
|||
|
}gui_font_digit_struct;
|
|||
|
|
|||
|
|
|||
|
所以,字符的高度最大是用工具生成的最大像素,比如按48pixel生成的汉字,最大高度为48,实际是字符高度加上y_pos, 但是结构体中没有字符高度的表示,用户只能在工具中看到。
|
|||
|
每个字符的宽度是结构体中的width,但是还需要加上x_pos。
|
|||
|
所以,在做OSD中确定字符串的长宽一般是(最大宽度,最大高度), 但是可能以适当减小,只要满足实际长宽加坐标偏移量即可。
|
|||
|
|