FreeType2 获取中文字体名称

10 篇文章 0 订阅
8 篇文章 0 订阅

//由fontconfig项目分析提取出来的

#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_TRUETYPE_TABLES_H
#include FT_SFNT_NAMES_H
#include FT_TRUETYPE_IDS_H

static const FT_UShort platform_order[] = {
	TT_PLATFORM_MICROSOFT,
	TT_PLATFORM_APPLE_UNICODE,
	TT_PLATFORM_MACINTOSH,
};

#define NUM_PLATFORM_ORDER (sizeof (platform_order) / sizeof (platform_order[0]))

static const FT_UShort nameid_order[] = {
	TT_NAME_ID_PREFERRED_FAMILY,
	TT_NAME_ID_FONT_FAMILY,
	TT_NAME_ID_MAC_FULL_NAME,
	TT_NAME_ID_FULL_NAME,
	TT_NAME_ID_PREFERRED_SUBFAMILY,
	TT_NAME_ID_FONT_SUBFAMILY,
	TT_NAME_ID_TRADEMARK,
	TT_NAME_ID_MANUFACTURER,
};

#define NUM_NAMEID_ORDER  (sizeof (nameid_order) / sizeof (nameid_order[0]))


typedef struct {
	const FT_UShort	platform_id;
	const FT_UShort	encoding_id;
	const char	fromcode[12];
} FcFtEncoding;

#define TT_ENCODING_DONT_CARE	0xffff
#define FC_ENCODING_MAC_ROMAN	"MACINTOSH"

static const FcFtEncoding   fcFtEncoding[] = {
	{ TT_PLATFORM_APPLE_UNICODE,	TT_ENCODING_DONT_CARE,	"UCS-2BE" },
	{ TT_PLATFORM_MACINTOSH,	TT_MAC_ID_ROMAN,	"MACINTOSH" },
	{ TT_PLATFORM_MACINTOSH,	TT_MAC_ID_JAPANESE,	"SJIS" },
	{ TT_PLATFORM_MICROSOFT,	TT_MS_ID_UNICODE_CS,	"UTF-16BE" },
	{ TT_PLATFORM_MICROSOFT,	TT_MS_ID_SJIS,		"SJIS-WIN" },
	{ TT_PLATFORM_MICROSOFT,	TT_MS_ID_GB2312,	"GB3212" },
	{ TT_PLATFORM_MICROSOFT,	TT_MS_ID_BIG_5,		"BIG-5" },
	{ TT_PLATFORM_MICROSOFT,	TT_MS_ID_WANSUNG,	"Wansung" },
	{ TT_PLATFORM_MICROSOFT,	TT_MS_ID_JOHAB,		"Johab" },
	{ TT_PLATFORM_MICROSOFT,	TT_MS_ID_UCS_4,		"UCS4" },
	{ TT_PLATFORM_ISO,		TT_ISO_ID_7BIT_ASCII,	"ASCII" },
	{ TT_PLATFORM_ISO,		TT_ISO_ID_10646,	"UCS-2BE" },
	{ TT_PLATFORM_ISO,		TT_ISO_ID_8859_1,	"ISO-8859-1" },
};

#define NUM_FC_FT_ENCODING  (int) (sizeof (fcFtEncoding) / sizeof (fcFtEncoding[0]))

typedef unsigned char FcChar8;

static FcChar8 * FcSfntNameTranscode(FT_SfntName *sname)
{
	int	       i;
	const char *fromcode;
	FcChar8 *utf8;

	for (i = 0; i < NUM_FC_FT_ENCODING; i++)
		if (fcFtEncoding[i].platform_id == sname->platform_id &&
			(fcFtEncoding[i].encoding_id == TT_ENCODING_DONT_CARE ||
				fcFtEncoding[i].encoding_id == sname->encoding_id))
			break;
	if (i == NUM_FC_FT_ENCODING)
		return 0;
	fromcode = fcFtEncoding[i].fromcode;
	//......
	//完整函数请参考fongconfig项目的fcfreetype.c源码

	return 0;
}

void get_full_name(FT_Face face)
{
	TT_OS2 *os2 = (TT_OS2 *)FT_Get_Sfnt_Table(face, ft_sfnt_os2);


	int		    p, platform;
	int		    n, nameid;
	FT_SfntName	    sname;
	FT_UInt    	    snamei, snamec;

	nameid = TT_NAME_ID_FULL_NAME;

	snamec = FT_Get_Sfnt_Name_Count(face);
	for (p = 0; p <= NUM_PLATFORM_ORDER; p++)
	{
		if (p < NUM_PLATFORM_ORDER)
			platform = platform_order[p];
		else
			platform = 0xffff;

		for (n = 0; n < NUM_NAMEID_ORDER; n++)
		{
			

			for (snamei = 0; snamei < snamec; snamei++)
			{
				FcChar8		*utf8;
				const FcChar8	*lang;
				const char	*elt = 0, *eltlang = 0;
				int		*np = 0, *nlangp = 0;

				if (FT_Get_Sfnt_Name(face, snamei, &sname) != 0)
					continue;
				if (sname.name_id != nameid)
					continue;

				if (p < NUM_PLATFORM_ORDER)
				{
					if (sname.platform_id != platform)
						continue;
				}
				else
				{
					int	    sp;

					for (sp = 0; sp < NUM_PLATFORM_ORDER; sp++)
						if (sname.platform_id == platform_order[sp])
							break;
					if (sp != NUM_PLATFORM_ORDER)
						continue;
				}

				utf8 = FcSfntNameTranscode(&sname);

			}
		}
	}

}

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
FreeType是一个开源的字体渲染库,它提供了一套功能强大的API,用于加载、解析和渲染字体文件。使用FreeType库,您可以在应用程序中实现高质量的字体渲染。 以下是使用FreeType库加载和渲染字体的基本步骤: 1. 下载和安装FreeType库:您可以从FreeType官方网站(https://www.freetype.org)下载库文件,并按照文档进行安装。 2. 引入头文件和链接库:在您的项目中引入FreeType的头文件和链接库。具体的引入方式会根据您使用的编程语言和开发环境而有所不同。 3. 初始化FreeType库:在使用FreeType之前,需要调用FT_Init_FreeType函数来初始化FreeType库。 4. 加载字体文件:使用FT_New_Face函数加载字体文件。您需要提供字体文件的路径,并指定要加载的字体索引(如果字体文件包含多个字体)。 5. 设置字体大小:使用FT_Set_Pixel_Sizes函数或FT_Set_Char_Size函数设置字体的大小。 6. 渲染字符:使用FT_Load_Char函数加载要渲染的字符,并使用FT_Render_Glyph函数将字符渲染为位图。 7. 获取位图数据:通过FT_GlyphSlot结构体中的bitmap成员获取位图数据。 8. 绘制位图:将位图数据绘制到屏幕或纹理上,以实现字体渲染效果。 9. 释放资源:在使用完FreeType库后,需要调用相应的清理函数来释放资源,例如FT_Done_Face和FT_Done_FreeType。 请注意,以上仅为使用FreeType库的基本步骤,具体的实现方式会根据您的需求和编程语言而有所不同。您可以参考FreeType库的文档和示例代码,以及相关编程语言的FreeType库绑定或封装库的使用指南,来更详细地了解和应用FreeType库。 希望这些信息对您有所帮助!如果您有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值