FreeType的缓存

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

FreeType的缓存.txt你妈生你的时候是不是把人给扔了把胎盘养大?别把虾米不当海鲜。别把虾米不当海鲜。 FreeType的缓存子系统提供了一个高性能的管理face、size、glyph image和charmap的途径。

I. Requirements and Design Goals:

When dealing with fonts, caching rapidly becomes a necessity for at least the following reasons:

当处理字体时,高速缓存是必要的,原因如下:

l 打开字体文件是相当慢的,因为它需要加载数据到内存中。所以,尽可能地保持FT_Face对象处于打开状态是一个好主意。

l 每一个FT_Face 或 FT_Size对象会占用几百KB,假设它总是很大,应该限制打开的face的个数到最小。

l 每个face包含成百上千的字形,由于通常只是使用一个face中的一小部分字形,一次性加载所有的字形是完全没有必要的。应该缓存我们经常使用的字形。

l 当属于给定face的所有字形已经载入内存时,对应的FT_Face对象可以被关闭已减少内存的占用。

FreeType缓存子系统提供了自动完成上述任务的很好的途径。

II. The Cache Manager:

FTC_Manager用于处理缓存中的各种数据。应首先调用FTC_Manager_New 来创建它。

1. 通过FTC_FaceID鉴别face:

FTC_Manager并不直接知晓哪些字体被安装了或者在运行期是否有效。应用程序有责任定位和鉴别face,并打开相应的字体文件。这意味着应用程序必须使用一个指针(FTC_FaceID)来唯一鉴别一个给定的有效的或已安装的face。虽然这个指针对于FTC_Manager来说并不重要,但是它们的值在程序运行期必须始终保持不变,用于关联缓存的数据和它们相应的face。

应用程序也必须提供(在FTC_Manager_New期间)一个专门的回调函数FTC_Face_Requester。这个外观请求器管理从一个给定的FTC_FaceID转换到一个新FT_Face对象,这通常暗示着调用FT_New_Face 或FT_Open_Face。

大多数情况下,FTC_FaceID指向一个包含着字体文件名和face index的结构。

In most cases, a FTC_FaceID is a pointer to a structure that contains a file pathname and a face index, and where the face requester simply calls FT_New_Face, as illustrated by the following code:

/* define custom face identification structure */

typedef struct MyFaceRec_

{

const char* file_path;

int face_index;

} MyFaceRec, *MyFace;

/* our custom face requester is dead simple */

static FT_Error

my_face_requester( FTC_FaceID face_id,

FT_Library library,

FT_Pointer request_data,

FT_Face *aface )

{

MyFace face = (MyFace) face_id; // simple typecase

return FT_New_Face( library, face->file_path, face->face_index, aface );

}

{

FTC_Manager manager;

...

/* initialize cache manager */

error = FTC_Manager_New(

library,

0, /* use default */

0, /* use default */

0, /* use default */

& my_face_requester, /* use our requester */

NULL, /* don't need this. */

&manager );

}

What this code doesn't show is how the list of available/existing FTC_FaceID/MyFace handle is generated, since this is highly program or platform specific. For a more concrete example, have a look at the file ftcommon.i in the "ft2demos" package distributed by FreeType.

2. 缓存 FT_Face 和 FT_Size 对象:

客户程序不应当直接用FT_New_Face 或 FT_Open_Face 来打开一个新的FT_Face对象,而是应该通过调用FTC_Lookup_Face接口来直接从cache manager中查询它们。因为通过一个预定义的threshold ,manager自动限制了在运行期可打开的FT_Face对象的个数。它是通过保持所有打开的face对象在一个经过most-recently-used (MRU)排序的列表中,来实现这一点的。

当一个新face对象被请求,并且当这个列表已满时,最旧的FT_Face对象将自动被关闭,以为一个新对象腾出空间。每次调用FTC_Lookup_Face时,返回的总是位于列表头部的那个face。FTC_Lookup_Face通过输入的FTC_FaceID返回一个有效的FT_Face句柄。

与FT_Face句柄一样,cache manager也处理一个包含了打开的FT_Size对象的列表,FT_Size

相关文档
最新文档