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);

			}
		}
	}

}

 

在VC++中,同样可以使用freetype库来获取ttc文件的字体名称。具体操作流程如下: 1. 安装freetype库 2. 打开ttc文件,读取字体信息 ```c++ #include <iostream> #include <ft2build.h> #include FT_FREETYPE_H #include FT_TRUETYPE_TABLES_H #pragma comment(lib, "freetype.lib") // 打开ttc文件,返回字体索引 int open_ttc_file(const char* filename, FT_Library& library, FT_Face& face) { FT_Face ttc_face; int face_index = 0; FT_Open_Args args; args.flags = FT_OPEN_PATHNAME; args.pathname = filename; // 打开ttc文件 if (FT_Open_Face(library, &args, 0, &ttc_face)) { return -1; } // 遍历ttc字体集合,获取字体名称 for (int i = 0; i < ttc_face->num_faces; i++) { if (FT_Get_Face_Info(ttc_face, i, &face_index, NULL, NULL, NULL)) { continue; } if (FT_Open_Face(library, &args, face_index, &face)) { continue; } if (face->face_flags & FT_FACE_FLAG_SCALABLE) { return face_index; } } // 关闭ttc文件 FT_Done_Face(ttc_face); return -1; } // 获取字体名称 std::string get_font_name(const char* filename) { FT_Library library; FT_Face face; int face_index = 0; std::string font_name; // 初始化freetype库 if (FT_Init_FreeType(&library)) { return ""; } // 打开ttc文件,返回字体索引 face_index = open_ttc_file(filename, library, face); if (face_index == -1) { return ""; } // 获取字体名称 if (FT_Get_Postscript_Name(face, font_name.c_str())) { return ""; } // 关闭字体文件 FT_Done_Face(face); // 关闭freetype库 FT_Done_FreeType(library); return font_name; } int main() { std::string font_name = get_font_name("font.ttc"); std::cout << font_name << std::endl; return 0; } ``` 上述代码中,open_ttc_file函数用于打开ttc文件,并遍历其中的字体集合。如果找到可缩放的字体,则返回字体索引。get_font_name函数用于获取ttc文件中第一个可缩放字体的名称。在VC++中,需要添加freetype库的链接。 需要注意的是,上述代码只能获取ttc文件中第一个可缩放字体的名称,如果需要获取其他字体的名称,需要自行修改代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值