FreeType的缓存
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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