lock_lfvx/docs/bk7258/zh_CN/gui/osd/font_generate.rst
2025-10-10 16:07:00 +08:00

191 lines
6.0 KiB
ReStructuredText
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

字库生成
=================================
: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中确定字符串的长宽一般是(最大宽度,最大高度), 但是可能以适当减小,只要满足实际长宽加坐标偏移量即可。