<h1 align="center">FontMaker Client</h1>

<p align="center"><img src="https://img.shields.io/badge/Licence-MIT-green.svg?style=for-the-badge" /></p>

### 项目介绍

> 主要功能代码来自于 [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) 项目

### 合作及交流

* 联系邮箱:<walkline@163.com>
* QQ 交流群:
	* 走线物联:[163271910](https://jq.qq.com/?_wv=1027&k=VlT7Bjs9)
	* 扇贝物联:[31324057](https://jq.qq.com/?_wv=1027&k=IQh2OLw9)

<p align="center"><img src="https://gitee.com/walkline/WeatherStation/raw/docs/images/qrcode_walkline.png" width="300px" alt="走线物联"><img src="https://gitee.com/walkline/WeatherStation/raw/docs/images/qrcode_bigiot.png" width="300px" alt="扇贝物联"></p>