ffxz 发表于 2010-9-9 22:07:36

RT-Thread/GUI字体生成器

用于Windows主机上的字体生成器(我测试的是Windows XP,x86),选择字体后,点生成按钮,会在当前目录生成相应的.c字体文件,把这个和RT-Thread/GUI编译既可。

目前这个能够生成Windows上能显示的字体,包括fnt、TTF等字体。但仅生成了用于固定宽度字体引擎的字体数据,所以对于非等宽字体显示效果不是太理想。后续再加入中文字体和非等宽字体引擎吧。

点击此处下载 ourdev_581809UE68CC.zip(文件大小:4.47M) (原文件名:fontmade.zip)

dy008 发表于 2010-9-9 22:55:08

太好了,赶快试一试!

damoplus 发表于 2010-9-9 23:18:24

Mark

john_8 发表于 2010-9-10 09:15:11

make,支持

gavin_li 发表于 2010-9-10 10:35:54

great! 那是不是把生成的字库文件覆盖原来的就可以用了?
比如用新生成的字库文件覆盖hz16font.c,RTT会自动显示新的字体?

zhiyuan1106 发表于 2010-9-10 10:52:41

好东西 哈哈

appele 发表于 2010-9-10 12:04:24

感謝!!!
我立刻試了,但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);
        }
       
}

appele 发表于 2010-9-10 12:07:27

http://cache.amobbs.com/bbs_upload782111/files_33/ourdev_581918FDXGNG.jpg
(原文件名:font.jpg)


第一行是tahoma W8 H14
第二行是tahoma W9 H16
第三行是tahoma W12 H24

我的屏是寛 480 的

charlie2008 发表于 2010-9-10 12:11:09

mark!

ffxz 发表于 2010-9-10 12:18:10

回复【7楼】appele

(原文件名:font.jpg)
第一行是tahoma w8 h14
第二行是tahoma w9 h16
第三行是tahoma w12 h24
我的屏是寛 480 的
-----------------------------------------------------------------------

只支持8位宽的吗?我试过了,svn trunk的版本是支持24、32点阵的。

因为目前还是支持等宽的字体,所以最好还是采用等宽的字体来转换。

appele 发表于 2010-9-10 12:34:41

看來我得更新了 哈哈,
看了trunk
不過好像只有一整Byte的更新??

258963519 发表于 2010-9-10 15:21:50

支持一下,也来好好研究下

gzhuli 发表于 2010-9-10 15:43:27

回复【10楼】appele
看來我得更新了 哈哈,
看了trunk
不過好像只有一整byte的更新??
-----------------------------------------------------------------------

按常用的字体宽度考虑,整byte的为多,最内层循环按整byte处理,减少循环中的if判断。即宽度为8的倍数的字体,渲染效率最高,不为8的倍数的,会有少许多余指令。

nibia 发表于 2010-9-10 18:02:52

请问appele 回复【7楼】appele
-----------------------------------------------------------------------

请问你这个是在什么上调试的?我用 bbs上那个vc工程就没显示出来

appele 发表于 2010-9-11 00:32:36

謝謝 gzhuli 咕唧霖 的說明,
長知識了


nibia

我用VS 2010 ,也是bbs上那个vc工程

nibia 发表于 2010-9-11 09:57:39

回复【14楼】appele
-----------------------------------------------------------------------

bbs上的vc例程是比较旧的代码了,我更改了svn上trunk 下的gui 和example部分 。一直都不行,改成你的代码可以了,是宽度不对的问题。

sdram 发表于 2010-10-25 22:20:18

好东西,用不用rtgui都要顶;

loveic 发表于 2011-4-25 16:07:27

怎么回事,这个程序有问题吧,导入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 */
        &micro;soft_sans_serif10_16,                                /* font private data */
};


已解决,原因是版本升级了

ZigBee_Notes 发表于 2011-6-20 17:53:04

MARK

marrylilili 发表于 2011-12-20 16:34:16

mark!!学习

xuzhenglim 发表于 2012-2-12 20:58:29

mark等着下来用下看

wych159753 发表于 2012-3-29 16:59:43

mark{:smile:}

wych159753 发表于 2012-4-11 15:10:19

好像这个软件只能产生英文,不支持汉字,请问要怎么做才能生成历程里hz16font.c文件呢???

yh8637 发表于 2012-10-30 16:35:31

没明白是做什么 用的。

eryueniao 发表于 2012-11-5 11:11:40

cool                                          
页: [1]
查看完整版本: RT-Thread/GUI字体生成器