自制和烧录单片机 unicode 字库芯片 - 创建字库

此词库被应用于微信点餐系统的打印机中。
打印输出结果

生成的字库优点

可以完全自定义创建自己的字库:
  • 可自由选择任何字体,宋体,楷体,黑体……
  • 可自定义字体的大小
  • 可自定义需要的字符编码(简体gb2312,gb18030,繁体,韩文,日文……)
  • UNICODE支持
  • 价格便宜,买 Flash ROM,自己写进 Flash ROM就可以了。

创建字体库需要的软件

Windows系统,安装 Python 2.7 和 PIL 库( Python Image Library),下载 Make ROM Font 工具
打开 Windows 命令行,进入取下的代码目录,执行: c:\Python27\python.exe make_font.py -s 23 -c
会在当前目录下产生 cn_font.bin 文件,将此文件烧录到 Flash ROM 中,安装下面的字库格式即可读取。
  • 如果要选择不同的字体,修改 make_chinese_font 中 font_file 指向对应的字体文件;
  • 如果要选择不同的字符编码,修改 make_chinese_font 中 get_glyph_set,添加新的编码;

字库格式

	The format of font.bin: [File Header][Glyphs Table][Glyphs Data]
	File Header: 	BF [2 bytes]
					VersionNumber [1 byte]
					FontHeight [ 1 byte]
					FontWidthMinimum [1 byte]
					FontWidthMaximum [1 byte]
					Glyph Count [2 bytes] 
	Glyphs Table: 	[ data position[2 bytes], width [1 byte] ] x Glyph Count
	Glyphs Data:	(Glyph data) x Actual Glyph count


	GlyphDataSize: (FontWidthMaximum + 7) / 8 x FontHeight / 8

字库使用

初始化字体

	/**
	 * The font info.
	 */
	struct FontInfo
	{
		u32			offset;
		u8			height;
		u8			width_min;
		u8			width_stride;
		u8			glyph_data_size;
		u16			glyph_count;
	};

	typedef unsigned short WCHAR;

	int init_font(struct FontInfo *fontInfo)
	{
		u32 offset = fontInfo->offset;

		// Not font format
		if (FLASH_read_byte(offset + 0) != 'B' && FLASH_read_byte(offset + 1) != 'F')
			return 0;

		// Invalid font lib version.
		if (FLASH_read_byte(offset + FL_OFFSET_VERSION) != FONT_LIB_VERSION)
			return 0;
		fontInfo->height = FLASH_read_byte(offset + FL_OFFSET_HEIGHT);
		fontInfo->width_min = FLASH_read_byte(offset + FL_OFFSET_WIDTH_MIN);
		u8 width_max = FLASH_read_byte(offset + FL_OFFSET_WIDTH_MAX);
		fontInfo->width_stride = get_glyph_stride(width_max);
		fontInfo->glyph_data_size = (((width_max + 7) / 8) * fontInfo->height); //(fontInfo->width_stride + 7) / 8;
		fontInfo->glyph_count = FLASH_read_u16(offset + FL_OFFSET_GLYPH_COUNT);

		return 1;
	}

寻址读字体

在单片机程序中,通过下面的方式寻址读字体:
	/**
	 * Get the glyph by its UCS2 character encoding.
	 *
	 * If it does not exist, return a special glyph.
	 */
	void get_glyph(WCHAR ch, struct Glyph *glyph)
	{
		u32 pos = FL_OFFSET_GLYPH_TABLE + FONT_GLYPH_INFO_SIZE * (u32) ch;
		u16 posHigh = FLASH_read_byte(pos);
		u16 posLow = FLASH_read_byte(pos + 1);
		glyph->width = FLASH_read_byte(pos + 2);
		glyph->data_pos = (posHigh << 8) | posLow;
	}

	void get_glyph_data(struct FontInfo *fontInfo, struct Glyph *glyph, u8 offset, u8 data[MAX_GLYPH_STRIDE])
	{
		u32 FL_OFFSET_GLYPH_DATA = fontInfo->offset + FL_OFFSET_GLYPH_TABLE
				+ fontInfo->glyph_count * (u32) FONT_GLYPH_INFO_SIZE;
		u32 addr = FL_OFFSET_GLYPH_DATA + (u32) (glyph->data_pos) * fontInfo->glyph_data_size + offset;
		FLASH_fast_read(data, addr, get_glyph_stride(glyph->width));
	}


  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
v1.06 (20120410) FontMaker(点阵字库) 1. 增加系统字体支持,操作更简单,快捷。 v1.05 (20120324) FontMaker(点阵字库) 1. 修正了字符对齐问题。 2. 增加了单个字符或多个字符输出成位图文件设定。 3. 完善了阿拉伯文字库unicode 字库有效)。 4. 增加自定义字符功能(unicode 字库有效)。 Multi-language(多国语言) 1. 增加输出编码格式 (mbcs, utf16-lb, utf8)设置 2. 增加数组格式输出。 Image Manager(图像管理) 1. 该页为新增功能,支持图片图像的数据转换。主要应用在做产品logo图片方面。 V1.04 (20110716) 1. 增加了一个字符串mbcs2unicode(内码转统一码)的功能。 (支持转:U16-LE, U16-BE, UTF8) V1.03 (20110705) 1. 修改了 Example 中点阵字库解析源码,更加便于移植。(基本做到只需修改font_file.c 即可) 2. 修改了内码(MBCS)字库点阵信息读取的一个错误。 3. 增加了多语言支持(简中,英文),还有待完善。。。 V1.02 (20110701) 1. FontMaker V2.03 a. 增加字符宽高比调节(HorR & VerR) b. 增加对*.ttc 字库的支持。 c. 增加bdf(*.bdf)文件格式转Simple Unicode编码格式的bin文件。 V1.01 (20110629) 1. FontMaker V2.02 a. 增加了 Simple Unicode功能。(适合小字库) b. 增加了 “扫描方向及反显”设置。 2. Multi-Language V1.01 a. 修改了除 office 2000 外,其它不能支持的问题。 V1.00: (20110627) 1. 继承 FontMaker V2.01 的所有功能。 2. 增加了一个 Multi-Languge V1.00 的打包转换功能。 FontMaker 基本功能: 1.支持所有 windows 字符集:CP932(日文Shift-JIS)CP936(简体中文GBK)CP949(韩文)CP950(繁体中文 Big5),CP874(泰文),CP1250(中欧)CP1251(西里尔文),CP1252(西欧--"拉丁文I"),CP1253(希腊文), CP1254(土耳其文),CP1255(希伯来文),CP1256(阿拉伯文),CP1257(波罗的海文),CP1258(越南) 2.支持非等宽字库。 3.支持BIN,TXT,BMP,BDF 文件输出。 4.支持unicode字库输出,即可以做到在一个窗口中同时显示多国语言(文字) 5.支持单个字符编辑,预览(所见即所得)。 6.支持字库文件和输出路径记忆功能 7. 支持从bdf格式转换自定义字库(bin文件)格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值