# FontMaker Client
**Repository Path**: walkline/fontmaker-client
## Basic Information
- **Project Name**: FontMaker Client
- **Description**: 以命令行方式生成适合 MicroPython New FontLib 项目使用的字库
- **Primary Language**: C++
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 7
- **Forks**: 2
- **Created**: 2021-08-12
- **Last Updated**: 2023-07-24
## Categories & Tags
**Categories**: hardware
**Tags**: 中文字库, MicroPython
## README
FontMaker Client

### 项目介绍
> 主要功能代码来自于 [FontMaker](https://gitee.com/kerndev/FontMaker) 项目
以命令行方式生成适合 [MicroPython New FontLib](https://gitee.com/walkline/micropython-new-fontlib) 项目使用的字库
### 字库说明
> 使用`v1.0.0`之后版本生成的字库与之前版本的字库不兼容
本项目生成的字库与其它字库的区别如下:
* 文件头,包含字库文件相关信息
* 字符尺寸固定,例如选择`字体大小`为 16 像素,那么字符点阵的宽和高都为 16 像素
* 扫描方式为水平扫描(垂直扫描方式获取的数据有问题,所以暂不支持)
* 字节顺序支持`MSB`和`LSB`(但垂直扫描方式不支持`MSB`)
* 包含`GB2312`索引表,暂不支持外部索引表文件
* 支持使用文本文件生成自定义字库
### 获取可执行文件
可以自行编译代码,或者从 [binary](https://gitee.com/walkline/fontmaker-client/tree/binary/) 分支下载
要查看版本号可使用如下命令:
```bash
$ FontMaker_Cli.exe --version
```
### 如何生成字库
最简单的方法是只指定`字体名称`,其它参数使用默认值
```bash
$ FontMaker_Cli.exe -f "幼圆"
```
这样得到的字库文件属性如下:
* 文件名:`combined.bin`
* 字体名称:`幼圆`
* 字体大小:`16 像素`
* 字体字重:`普通`
* 水平偏移:`0 像素`
* 垂直偏移:`0 像素`
* 点阵宽度:`16 像素`
* 点阵高度:`16 像素`
* 字符宽度:`固定宽度`
* 字节顺序:`低字节在前`
* 扫描方式:`垂直扫描`
* 包含`GB2312 索引表`
如果要生成`微软雅黑`、`大小 24`、`垂直扫描`、`字节高位在前`、`文件名 yahei_24_hmsb.bin`的字库文件,则使用如下命令:
```bash
$ FontMaker_Cli.exe -f "微软雅黑" -s 24 -sh -m -o yahei_24_hmsb.bin
```
如果要生成自定义字库,则使用如下命令:
```bash
$ FontMaker_Cli.exe -f "微软雅黑" --input filename.txt -o customized.bin
```
还可以使用 [FontMaker Client GUI](https://gitee.com/walkline/fontmaker-client-gui) 这个简易窗口程序生成字库
### 如何使用字库
具体使用方法参考 [fontlib.py](https://gitee.com/walkline/micropython-new-fontlib/blob/master/fontlib.py) 相关代码
### 命令行参数
> 带`-`的为短命令,带`--`的为长命令,二选一使用
>
> 参数出现冲突时,如同时选择`-l`和`-m`,则以后出现者为准
* 必选参数
* **-f**, **--face FONTFACE**:指定字体名称
* 可选参数:字形相关
* **-s**, **--size FONTSIZE**:字体大小,**默认值:16**
* **-n**, **--normal**:字体字重为`普通`,**默认选择**
* **-b**, **--bold**:字体字重为`加粗`
* **-i**, **--italic**:字体为`斜体`
* 可选参数:字符点阵相关
* **-w**, **--width CHARWIDTH**:字符点阵宽度,**默认值:FONT_SIZE**
* **-x**, **--offset-x OFFSETX**:水平偏移量,**默认值:0**
* **-y**, **--offset-y OFFSETY**:垂直偏移量,**默认值:0**
* **-sv**, **--scan-vertical**:垂直方式扫描,**默认选择**
* **-sh**, **--scan-horizontal**:水平方式扫描
* **-l**, **--lsb**:字节低位在前,**默认选择**
* **-m**, **--msb**:字节高位在前
* **-rd**, **--reverse-display**:字符反显
* 可选参数:文件相关
* **--charset FILENAME**:指定字符集文件,生成自定义字库
* **--input FILENAME**:使用文本文件生成自定义字库文件
* **-o**, **--output FILENAME**:生成字库文件的文件名,**默认值:combined.bin**
* 不可选参数
* **-h**, **--height CHAR_HEIGHT**:字符点阵高度,**默认值:FONT_SIZE**
* **-d**, **--fixed-width**:字符点阵宽度固定,**默认选择**
* **-v**, **--variable-width**:字符点阵宽度可变
* **-t**, **--include-table**:包含`GB2312`索引表,**默认选择**
### 附录:字库结构
字库结构分为 4 个部分:
* 文件头
* `GB2312`索引表
* `ASCII`字符数据
* `GB2312`字符数据
#### 文件头
```c++
typedef struct tagFontLibHeader {
BYTE magic[4];
DWORD file_size;
BYTE font_width;
BYTE font_height;
WORD char_count;
BYTE has_index_table;
BYTE scan_mode;
BYTE byte_order;
DWORD ascii_start;
DWORD gb2312_start;
char reserved[2];
} FL_Header, * PFL_Header;
```
* `[4] magic`:文件识别代码,默认为`FMUX`,自定义字库为`FMUY`
* `[4] file_size`:字库文件大小
* `[1] font_width`:字体宽度
* `[1] font_height`:字体高度
* `[2] char_count`:包含字符总数
* `[1] has_index_table`:是否包含`GB2312`索引表
* `[1] scan_mode`:扫描方式
* `[1] byte_order`:字节顺序
* `[4] ascii_start`:`ASCII`字符数据起始地址
* `[4] gb2312_start`:`GB2312`或`自定义`字符起始地址
* `[2] reserved`:保留内容
#### `GB2312`索引表
因为`MicroPython`仅支持`Unicode`编码,且`Unicode`与`GB2312`无直接转换关系,所以必须使用一个索引表进行转换查询
#### `ASCII`、`GB2312` 字符数据
根据索引表顺序排列的字符点阵数据,每个字符都为固定尺寸,字符数据大小计算公式为:
```python
((font_width - 1) // 8 + 1) * font_height
```
### 资源版权声明
`/fonts/emoticons21.fon` 文件来自于 [u8g2](https://github.com/olikraus/u8g2/tree/master/tools/font/emoticons) 项目
`/fonts/open-iconic.ttf` 文件来自于 [Open Iconic](https://github.com/iconic/open-iconic) 项目
### 合作及交流
* 联系邮箱:
* QQ 交流群:
* 走线物联:[163271910](https://jq.qq.com/?_wv=1027&k=VlT7Bjs9)
* 扇贝物联:[31324057](https://jq.qq.com/?_wv=1027&k=IQh2OLw9)

