[c++] 字模的变化 bitmapfont 2.0

 photo Screenshotfrom2013-02-27234134_zps64be6f4b.png

利用春节假期,也把 BitmapFont 进行了一定改进。在之前《字模的解析》一文中,为了以文本图的方式收集到的字库文件,启动了 BitmapFont 项目。当时的程序相对简单,就是顺序逐一打印字模,如果需要对个别字模进行查询,则需要使用相对敏捷的文本工具打开生成的解析文件进行查找。对于日常使用还是有些许不变。新版的 bitmapfont 借助标准C的 getopt 函数,让主程序支持一个相对复杂的参数表。参数表之前一直是我比较困扰我的一个地方,要让程序变得通用性更强,就不好整那么神秘数,而需要尽量将参数放到程序外部再导入,而如果单纯依赖(int argv, char **argv)来解析,也是比较痛苦,有的参数可有可无,有的参数又再带着附属参数,顺序也是千奇百怪。好在optget可以很好的解决这些问题。不过参数支持得太多,解析参数表的 switch 也很长,目前功力似乎没发现什么很好的方法。希望这个程序一方面可以作为字模辅助工具,一方面也能为初学者一点参考的意义。

实例与参数表定义:

$ ./bitmapfont -f font/HZK16 -c 2 -n 16 -p -a 墙
  • -f: 必填,字体选择,一般为字库文件的相对路径,保存在font目录内的地址,程序会根据其文件名判断是半角字符(“ASC”),还是全角字符(“HZK”)。
  • -c: 必填,字体横向的字节数。16×16的字体,每行16个点由2个字节组成,所以参数c为2。因为还有12×12的中文字体,每行也是2个字节,再加上半角字符的情况,所以这个参数不太容易又文件名计算,所以由外部参数设置。这些字库文件只是一个简单的二进制存储文件,而不像bmp/jpg文件那样还包含一个头header,告诉文件的一些配置信息。
  • -n: 可选,设置打印的数组列表单行显示的字节数。
  • -p: 可选,输出点阵图样。
  • -a: 可选,指定输出的字符。如果-f参数选择的是半角字体,而指定字符位全角字符,则无法显示,反之亦然。若不带该参数,则等效于原始功能,将输出字库中的所有文字(会很长哦~)。

 photo Screenshotfrom2013-02-28001006_zps44568669.png

$ ./bitmapfont -f font/HZK16 -c 2 -n 16 -p -a 墙 -h
  • -h: 可选,字模水平翻转。

 photo Screenshotfrom2013-02-28001040_zps6c3b019c.png

$ ./bitmapfont -f font/HZK16 -c 2 -n 16 -p -a 墙 -v
  • -v: 可选,字模垂直翻转。

 photo Screenshotfrom2013-02-28001359_zps9a00cbc2.png

$ ./bitmapfont -f font/HZK16 -c 2 -n 16 -p -a 墙 -b
  • -b: 可选,取反。可以把“阳模”变成“阴模”。
  •  photo Screenshotfrom2013-02-28001114_zpsb338fc22.png

    $ ./bitmapfont -f font/HZK16 -c 2 -n 16 -p -a 墙 -s
    
  • -s: 可选,字节取反,字节翻转,适合把原先 MSB First 状态的数组,转换位 LSB First 的状态,或者反过来。
  •  photo Screenshotfrom2013-02-28002557_zps5025d96c.png
     photo Screenshotfrom2013-02-28002612_zpsbfb409c0.png
     photo Screenshotfrom2013-02-28002627_zps33c72dba.png

    $ ./bitmapfont -f font/HZK16 -c 2 -n 16 -p -a 墙 -r 1
    
  • -r: 可选,字模逆时针翻转90度,附属参数为旋转的次数。设0或4等于没设。
  •  photo Screenshotfrom2013-02-28003317_zpsa5787bb8.png

    $ ./bitmapfont -f font/HZK16 -c 2 -n 16 -p -a 墙 -d
    
  • -r: 可选,严对角线翻转。
  • 细心的您,肯定发现这里面有点玄机,没错,所有的这些变换都是蕴含这相互转换的关系。这也是我把它们每种都截图出来的原因,比方说:

    -r 2 = -h -v 
    -r 3 = -h -d
    

    确实是这样,旋转其实就是基本翻装的组合。所以在类库之中,哪些更基本更底层,那些更抽象更飘逸,写程序的时候就可以好好研究下咯。注:-r -h 参数只支持方形的字体,也就是高宽相等的字体,比方说HZK12(实际占用字节为 2×12)这样的不太方的字体,都不支持。在操作数组的时候,指针越界的话就不好玩了哦~

     photo Screenshotfrom2013-02-28010115_zps067d3366.png
     photo Screenshotfrom2013-02-28010244_zps3c5a288b.png

    $ ./bitmapfont -f font/HZK16 -c 2 -n 16 -p -a 墙 -m 1 -t 2
    $ ./bitmapfont -f font/HZK16 -c 2 -n 16 -p -a 墙 -m 20 -t 2
    
  • -m: 可选,平移方向,1: 右;2:左;4:上;8:下;如果方向值加上16,则为循环平移。
  • -t: 可选,平移量。
  • 并不是每次变化都只能带一种参数,可以实现多种组合,实现自己需要的效果,总会配出适合当前单片机屏显应用的组合。从程序角度来看,会依次执行旋转、平移、翻转操作,其中旋转只有一次。能这样折腾基本就能满足一般的需要。不过鉴于标准点阵字模的数据结构,还是推荐按照标准的方式来调用字模,让自己的显示设备默认就使用这样的方式。

     photo Screenshotfrom2013-02-28150042_zps558d3af2.png

    $ ./bitmapfont -f font/HZK16 -c 2 -n 16 -p -a "古作坊" -m 1 -t 2 -o myfont
    
  • -o: 可选,字模输出。
  • 程序默认在stdin输出文本的字符或图样,可以使用重定向,将输出转到其它特定的文件。-o参数让用户将修改过的字模,重新以二进制方式导出到另一个文件。这个输出文件和原始的字库文件一样,都是以二进制数组顺序排列。如果在命令中省去了-a参数,就可以对整个字库文件进行改造了。

    基本就介绍这么多,希望对大家有所帮助。这篇文章介绍了目前已经具备的功能,但相信随着持续开发,还会有更多的功能添加进来,当然也希望您的加入~

    BitmapFont 托管地址:https://github.com/aguegu/BitmapFont/
    之前的博文:《字模的解析

    关于aGuegu

    阿古 真名:官微宏,技术Geek,玩Arduino,玩Linux,爱Google,爱开源;现居福州
    此条目发表在C/C++分类目录,贴了, , , 标签。将固定链接加入收藏夹。