RT-Thread/GUI字体生成器
用于Windows主机上的字体生成器(我测试的是Windows XP,x86),选择字体后,点生成按钮,会在当前目录生成相应的.c字体文件,把这个和RT-Thread/GUI编译既可。目前这个能够生成Windows上能显示的字体,包括fnt、TTF等字体。但仅生成了用于固定宽度字体引擎的字体数据,所以对于非等宽字体显示效果不是太理想。后续再加入中文字体和非等宽字体引擎吧。
点击此处下载 ourdev_581809UE68CC.zip(文件大小:4.47M) (原文件名:fontmade.zip) 太好了,赶快试一试! Mark make,支持 great! 那是不是把生成的字库文件覆盖原来的就可以用了?
比如用新生成的字库文件覆盖hz16font.c,RTT会自动显示新的字体? 好东西 哈哈 感謝!!!
我立刻試了,但rtgui_bitmap_font_engine 只支持寛8 的字,我立即改了,現在多寛的字体也OK 了
void rtgui_bitmap_font_draw_char(struct rtgui_font_bitmap* font, struct rtgui_dc* dc, const char ch,
rtgui_rect_t* rect)
{
const rt_uint8_t* font_ptr;
rt_uint16_t x, y, w, h,cnt;
register rt_base_t i, j, k;
x = rect->x1;
y = rect->y1;
/* check first and last char */
if (ch < font->first_char || ch > font->last_char) return;
//font_ptr = font->bmp + (ch - font->first_char) * font->height;
cnt =(font->width/8);
if(font->width%8 != 0)
cnt++;
font_ptr = font->bmp + (ch - font->first_char) * cnt * font->height;
w = (font->width + x > rect->x2)? rect->x2 - rect->x1 : font->width;
h = (font->height + y > rect->y2)? rect->y2 - rect->y1 : font->height;
for (i = 0; i < h*cnt; i ++ ){
for (k=0; k<cnt;k++){
w-=(8*k);
for (j = 0; j < w; j ++){
if(j>=8)
break;
if (((font_ptr >> (7-j)) & 0x01) != 0){
/* draw a pixel */
rtgui_dc_draw_point(dc, k*8+j + x, i/cnt + y);
}
}
}
i+=(cnt-1);
}
} http://cache.amobbs.com/bbs_upload782111/files_33/ourdev_581918FDXGNG.jpg
(原文件名:font.jpg)
第一行是tahoma W8 H14
第二行是tahoma W9 H16
第三行是tahoma W12 H24
我的屏是寛 480 的 mark! 回复【7楼】appele
(原文件名:font.jpg)
第一行是tahoma w8 h14
第二行是tahoma w9 h16
第三行是tahoma w12 h24
我的屏是寛 480 的
-----------------------------------------------------------------------
只支持8位宽的吗?我试过了,svn trunk的版本是支持24、32点阵的。
因为目前还是支持等宽的字体,所以最好还是采用等宽的字体来转换。 看來我得更新了 哈哈,
看了trunk
不過好像只有一整Byte的更新?? 支持一下,也来好好研究下 回复【10楼】appele
看來我得更新了 哈哈,
看了trunk
不過好像只有一整byte的更新??
-----------------------------------------------------------------------
按常用的字体宽度考虑,整byte的为多,最内层循环按整byte处理,减少循环中的if判断。即宽度为8的倍数的字体,渲染效率最高,不为8的倍数的,会有少许多余指令。 请问appele 回复【7楼】appele
-----------------------------------------------------------------------
请问你这个是在什么上调试的?我用 bbs上那个vc工程就没显示出来 謝謝 gzhuli 咕唧霖 的說明,
長知識了
nibia
我用VS 2010 ,也是bbs上那个vc工程 回复【14楼】appele
-----------------------------------------------------------------------
bbs上的vc例程是比较旧的代码了,我更改了svn上trunk 下的gui 和example部分 。一直都不行,改成你的代码可以了,是宽度不对的问题。 好东西,用不用rtgui都要顶; 怎么回事,这个程序有问题吧,导入size为12的字体,结果是正常的,导入size为16的字体,生成数据的长度却远大于16,如下
/*---char: ---*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*---char: ! ---*/
0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*---char: " ---*/
0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x7e,0x00,0x7c,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
struct rtgui_font_bitmap microsoft_sans_serif10_16 =
{
(const rt_uint8_t*)font_data, /* bmp */
8, /* width */
16, /* height */
32, /* first char */
127 /* last char */
};
struct rtgui_font microsoft_sans_serif10_16_font =
{
"microsoft sans serif", /* family */
16, /* height */
1, /* refer count */
&bmp_font_engine, /* font engine */
µsoft_sans_serif10_16, /* font private data */
};
已解决,原因是版本升级了 MARK mark!!学习 mark等着下来用下看 mark{:smile:} 好像这个软件只能产生英文,不支持汉字,请问要怎么做才能生成历程里hz16font.c文件呢??? 没明白是做什么 用的。 cool
页:
[1]