RTGUI中已经支持FreeType了,相信有人对TTF等字体比较青睐。实测RTGUI只在PC验证平台上支持了FreeType,在ARM上还不能跑起来.对比之后发现,原来PC平台上使用的标准连接库函数,这是FreeType原生支持的,要想在嵌入式使用,需要作少量修改。
FreeType使用头文件freetype/config/ftstdlib.h实现标准库函数的可移植性支持,
下面这些需要替换:
/* file handling */
#include <stdio.h>
#define FT_FILE FILE
#define ft_fclose fclose
#define ft_fopen fopen
#define ft_fread fread
#define ft_fseek fseek
#define ft_ftell ftell
#define ft_sprintf sprintf
可以使用rtgui的struct filerw替换:
#include <stdio.h>
#define FT_FILE rtgui_filerw_t
#define ft_fclose rtgui_filerw_close
#define ft_fopen rtgui_filerw_create_file
#define ft_fread rtgui_filerw_read
#define ft_fseek rtgui_filerw_seek
#define ft_ftell rtgui_filerw_tell
之后检查函数的形参是否一致,顺序是否正确,
如果开启了宏FT_DEBUG_LEVEL_ERROR和FT_DEBUG_LEVEL_TRACE,
还需要修改ftdebug.c和ftdbgmem.c和其它文件中引用以下函数的地方,
vfprintf,vprintf,fprintf,
可以自己修改成与RTT相关的函数,最简单的办法是把它们都指向串口输出rt_kprintf,
最后有一个比较奇怪的地方是FT_Stream_Seek函数:
FT_BASE_DEF( FT_Error )
FT_Stream_Seek( FT_Stream stream,
FT_ULong pos )
{
FT_Error error = FT_Err_Ok;
if ( stream->read )
{
if ( stream->read( stream, pos, 0, 0 ) ) //此语句在RTT下测试不能通过
{
FT_ERROR(( "FT_Stream_Seek:"
" invalid i/o; pos = 0x%lx, size = 0x%lx
",
pos, stream->size ));
error = FT_Err_Invalid_Stream_Operation;
}
}
上面注释的语句修改成
if ( stream->read ) {
stream->read( stream, pos, 0, 0 );
}
只执行,不再对错误处理就行了,
如果没有遗漏的地方,FreeType应该可以成功跑起来了。
想流畅的运行FreeType,建议ARM11以上平台,ARM9以下勉勉强强的。
原作者:amsl