lock_lfvx/docs/bk7258/zh_CN/gui/osd/font_generate.rst

191 lines
6.0 KiB
ReStructuredText
Raw Normal View History

2025-10-10 16:07:00 +08:00
字库生成
=================================
: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出现下面界面默认选择Extendedantialiased4bpp点击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中确定字符串的长宽一般是(最大宽度,最大高度), 但是可能以适当减小,只要满足实际长宽加坐标偏移量即可。