CustomFont - larryli/u8g2_wqy GitHub Wiki

自行生成字库数据

多数情况下,并不需要使用到 GB2312 字符集的七千多个字符,直接使用现有的字库数据会浪费空间。所以,根据需要自行生成字库数据更加合适。

系统要求

Linux 与 Mac 下均自带有 bash 和相关工具,如果没有请自行安装相关软件包。

Windows 下请直接使用 Git for Windows 所携带的 Git BASH。

收集字符到 txt 文件

虽然 iconv 工具支持几乎所有的字符集编码,但建议原始 txt 文件还是采用 UTF-8 编码保存。

txt 文本文件可以换行,也可以存在重复的字符。但不能含有 ASCII 字符。比如下列 str.txt 文件:

主菜单
菜单一
菜单二
菜单三
确定
取消
返回

将 txt 转换成 bdfconv 所需要的 map

echo '32-128,' > myfont.map
cat str.txt | iconv -f utf-8 -t c99 | sed 's/\\u\([0-9a-f]\{4\}\)/\$\1,\n/g' | sort | uniq | sed '/^$/d' | tr '/a-f/' '/A-F/' >> myfont.map
# Mac
# cat str.txt | iconv -f utf-8 -t c99 | sed 's/\\u\([0-9a-f]\{4\}\)/\$\1,\'$'\n/g' | sort | uniq | sed '/^$/d' | tr '/a-f/' '/A-F/' >> myfont.map

得到 myfont.map

32-128,
$4E00,
$4E09,
$4E3B,
$4E8C,
$5355,
$53D6,
$56DE,
$5B9A,
$6D88,
$786E,
$83DC,
$8FD4,

使用 bdfconv 转换

因为文泉驿点阵宋体本身的问题,需要修改一下原始的 bdfconv 代码:

--- a/tools/font/bdfconv/bdf_glyph.c
+++ b/tools/font/bdfconv/bdf_glyph.c
@@ -150,8 +150,8 @@ int bg_SetBitmapSize(bg_t *bg, int w, int h)

 void bg_SetBitmapPixel(bg_t *bg, int x, int y, int value)
 {
-  assert( x < bg->bitmap_width );
-  assert( y < bg->bitmap_height );
   assert( x >= 0 );
   assert( y >= 0 );
   bg->bitmap_data[y*bg->bitmap_width + x] = value;

即删除两项字体数据检测。然后编译 bdfconv。

转换:

../u8g2/tools/font/bdfconv/bdfconv -b 0 -f 1 -M myfont.map -n u8g2_font_wqy12_t_myfont -o _u8g2_font_wqy12_t_myfont.c ../u8g2_wqy/bdf/wenquanyi_9pt.bdf
echo '#include "myfont.h"' > u8g2_font_wqy12_t_myfont.c
cat _u8g2_font_wqy12_t_myfont.c >> u8g2_font_wqy12_t_myfont.c
rm _u8g2_font_wqy12_t_myfont.c

arduino 处理

增加头文件 myfont.h

#ifndef _MYFONT_H
#define _MYFONT_H

#include <stdint.h>
#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef U8G2_USE_LARGE_FONTS
#define U8G2_USE_LARGE_FONTS
#endif

#ifndef U8X8_FONT_SECTION

#ifdef __GNUC__
#  define U8X8_SECTION(name) __attribute__ ((section (name)))
#else
#  define U8X8_SECTION(name)
#endif

#if defined(__GNUC__) && defined(__AVR__)
#  define U8X8_FONT_SECTION(name) U8X8_SECTION(".progmem." name)
#endif

#if defined(ESP8266)
#  define U8X8_FONT_SECTION(name) __attribute__((section(".text." name)))
#endif

#ifndef U8X8_FONT_SECTION
#  define U8X8_FONT_SECTION(name) 
#endif

#endif

#ifndef U8G2_FONT_SECTION
#define U8G2_FONT_SECTION(name) U8X8_FONT_SECTION(name) 
#endif

extern const uint8_t u8g2_font_wqy12_t_myfont[] U8G2_FONT_SECTION("u8g2_font_wqy12_t_myfont");


#ifdef __cplusplus
}
#endif

#endif

然后在 ino 中 #include "myfont.h"

自定义字库显示

⚠️ **GitHub.com Fallback** ⚠️