ref: 9da74d844bd56815c4c6f4c1e1c6e6f9e22279d2
parent: 6e9df6855dc24a7a94c244132acc2ac29a93cef9
author: David Turner <[email protected]>
date: Sat Apr 1 04:14:12 EST 2006
updating cache documentation
--- a/include/freetype/ftcache.h
+++ b/include/freetype/ftcache.h
@@ -16,21 +16,6 @@
/***************************************************************************/
- /*************************************************************************/
- /*************************************************************************/
- /*************************************************************************/
- /*************************************************************************/
- /*************************************************************************/
- /********* *********/
- /********* WARNING, THIS IS BETA CODE. *********/
- /********* *********/
- /*************************************************************************/
- /*************************************************************************/
- /*************************************************************************/
- /*************************************************************************/
- /*************************************************************************/
-
-
#ifndef __FTCACHE_H__
#define __FTCACHE_H__
@@ -42,51 +27,105 @@
FT_BEGIN_HEADER
- /*************************************************************************/
- /* */
- /* <Section> */
- /* cache_subsystem */
- /* */
- /* <Title> */
- /* Cache Sub-System */
- /* */
- /* <Abstract> */
- /* How to cache face, size, and glyph data with FreeType 2. */
- /* */
- /* <Description> */
- /* This section describes the FreeType 2 cache sub-system which is */
- /* still in beta. */
- /* */
- /* <Order> */
- /* FTC_Manager */
- /* FTC_FaceID */
- /* FTC_Face_Requester */
- /* */
- /* FTC_Manager_New */
- /* FTC_Manager_Reset */
- /* FTC_Manager_Done */
- /* FTC_Manager_LookupFace */
- /* FTC_Manager_LookupSize */
- /* FTC_Manager_RemoveFaceID */
- /* */
- /* FTC_Node */
- /* FTC_Node_Unref */
- /* */
- /* FTC_Font */
- /* FTC_ImageCache */
- /* FTC_ImageCache_New */
- /* FTC_ImageCache_Lookup */
- /* */
- /* FTC_SBit */
- /* FTC_SBitCache */
- /* FTC_SBitCache_New */
- /* FTC_SBitCache_Lookup */
- /* */
- /* FTC_CMapCache */
- /* FTC_CMapCache_New */
- /* FTC_CMapCache_Lookup */
- /* */
- /*************************************************************************/
+ /*************************************************************************
+ *
+ * <Section>
+ * cache_subsystem
+ *
+ * <Title>
+ * Cache Sub-System
+ *
+ * <Abstract>
+ * How to cache face, size, and glyph data with FreeType 2.
+ *
+ * <Description>
+ * This section describes the FreeType 2 cache sub-system, which is used
+ * to limit the number of concurrently opened @FT_Face and @FT_Size
+ * objects, as well as caching information like character maps and glyph
+ * images while limiting their maximum memory usage.
+ *
+ * Note that all types and functions begin with the FTC_ prefix.
+ *
+ * the cache is highly portable and thus doesn't know anything about
+ * the fonts installed on your system, or how to access them. This implies
+ * the following scheme:
+ *
+ * first, available/installed font faces are uniquely identified by
+ * @FTC_FaceID values provided to the cache by the client. Note that the
+ * cache only stores and compares these values, and doesn't try to
+ * interpret them in any way.
+ *
+ * Second, the cache will call, only when needed, a client-provided
+ * function to convert a @FTC_FaceID into a new @FT_Face object. The latter
+ * will then be completely managed by the cache, including its termination
+ * through @FT_Done_Face.
+ *
+ * Clients are free to map face ids to anything. The most simple usage is
+ * to associate them to a (pathname,face_index) pair that is used to call
+ * @FT_New_Face. However, more complex schemes are also possible.
+ *
+ * Note that for the cache to work correctly, the face id values must be
+ * *persistent*, which means that the content they point to should not
+ * change at runtime, or that their value should not become invalid.
+ *
+ * If this is unavoidable (e.g. when a font is uninstalled at runtime),
+ * you should call @FTC_Manager_RemoveFaceID as soon as possible, to let
+ * the cache get rid of any references to the old @FTC_FaceID it may
+ * keep internally. Failure to do so will lead to incorrect behaviour
+ * or even crashes.
+ *
+ * To use the cache, start by calling @FTC_Manager_New to create a new
+ * @FTC_Manager object, which models a single cache instance. You can
+ * then lookup @FT_Face and @FT_Size objects with @FTC_Manager_LookupFace
+ * and @FTC_Manager_LookupSize respectively.
+ *
+ * If you want to use the charmap caching, call @FTC_CMapCache_New, then
+ * later use @FTC_CMapCache_Lookup to perform the equivalent of
+ * @FT_Get_Char_Index, only much faster.
+ *
+ * If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then
+ * later use @FTC_ImageCache_Lookup to retrieve the corresponding
+ * @FT_Glyph objects from the cache.
+ *
+ * If you need lots of small bitmaps, it is much more memory efficient to
+ * call @FTC_SBitCache_New, then later @FTC_SBitCache_Lookup, this returns
+ * @FTC_SBitRec structures, which are used to store small bitmaps directly.
+ * (a small bitmap is one whose metrics and dimensions all fit in 8-bit
+ * integers).
+ *
+ * We hope to also provide a kerning cache in the near future. Stay
+ * tuned.
+ *
+ *
+ * <Order>
+ * FTC_Manager
+ * FTC_FaceID
+ * FTC_Face_Requester
+ *
+ * FTC_Manager_New
+ * FTC_Manager_Reset
+ * FTC_Manager_Done
+ * FTC_Manager_LookupFace
+ * FTC_Manager_LookupSize
+ * FTC_Manager_RemoveFaceID
+ *
+ * FTC_Node
+ * FTC_Node_Unref
+ *
+ * FTC_ImageCache
+ * FTC_ImageCache_New
+ * FTC_ImageCache_Lookup
+ *
+ * FTC_SBit
+ * FTC_SBitCache
+ * FTC_SBitCache_New
+ * FTC_SBitCache_Lookup
+ *
+ * FTC_CMapCache
+ * FTC_CMapCache_New
+ * FTC_CMapCache_Lookup
+ *
+ *************************************************************************/
/*************************************************************************/
@@ -100,45 +139,65 @@
/*************************************************************************/
- /*************************************************************************/
- /* */
- /* <Type> */
- /* FTC_FaceID */
- /* */
- /* <Description> */
- /* An opaque pointer type that is used to identity face objects. The */
- /* contents of such objects is application-dependent. */
- /* */
+ /*************************************************************************
+ *
+ * @type: FTC_FaceID
+ *
+ * @description:
+ * An opaque pointer type that is used to identity face objects. The
+ * contents of such objects is application-dependent.
+ *
+ * these pointers are typically used to point to a user-defined
+ * structure containing a font file path, and face index.
+ *
+ * @note:
+ * never use NULL as a valid @FTC_FaceID
+ *
+ * Face ids are passed by the client to the cache manager, which will
+ * call, when needed, the @FTC_Face_Requester to translate them into
+ * new @FT_Face objects
+ *
+ * if the content of a given face id changes at runtime, or if the
+ * value becomes invalid (e.g. when uninstalling a font), you should
+ * immediately call @FTC_Manager_RemoveFaceID before any other cache
+ * function.
+ *
+ * Failure to do so will result in incorrect behaviour or even
+ * memory leaks and crashes !
+ **/
typedef struct FTC_FaceIDRec_* FTC_FaceID;
- /*************************************************************************/
- /* */
- /* <FuncType> */
- /* FTC_Face_Requester */
- /* */
- /* <Description> */
- /* A callback function provided by client applications. It is used */
- /* to translate a given @FTC_FaceID into a new valid @FT_Face object. */
- /* */
- /* <Input> */
- /* face_id :: The face ID to resolve. */
- /* */
- /* library :: A handle to a FreeType library object. */
- /* */
- /* data :: Application-provided request data. */
- /* */
- /* <Output> */
- /* aface :: A new @FT_Face handle. */
- /* */
- /* <Return> */
- /* FreeType error code. 0 means success. */
- /* */
- /* <Note> */
- /* The face requester should not perform funny things on the returned */
- /* face object, like creating a new @FT_Size for it, or setting a */
- /* transformation through @FT_Set_Transform! */
- /* */
+ /************************************************************************
+ *
+ * @functype: FTC_Face_Requester
+ *
+ * @description:
+ * A callback function provided by client applications. It is used
+ * by the cache manager to translate a given @FTC_FaceID into a new
+ * valid @FT_Face object, on demand.
+ *
+ * <Input>
+ * face_id :: The face ID to resolve.
+ *
+ * library :: A handle to a FreeType library object.
+ *
+ * req_data :: Application-provided request data (see note below).
+ *
+ * <Output>
+ * aface :: A new @FT_Face handle.
+ *
+ * <Return>
+ * FreeType error code. 0 means success.
+ *
+ * <Note>
+ * The third parameter 'req_data' is the same than the one passed
+ * by the client when @FTC_Manager_New is called.
+ *
+ * The face requester should not perform funny things on the returned
+ * face object, like creating a new @FT_Size for it, or setting a
+ * transformation through @FT_Set_Transform!
+ **/
typedef FT_Error
(*FTC_Face_Requester)( FTC_FaceID face_id,
FT_Library library,
@@ -145,41 +204,8 @@
FT_Pointer request_data,
FT_Face* aface );
+ /* */
- /*************************************************************************/
- /* */
- /* <Struct> */
- /* FTC_FontRec */
- /* */
- /* <Description> */
- /* A simple structure used to describe a given `font' to the cache */
- /* manager. Note that a `font' is the combination of a given face */
- /* with a given character size. */
- /* */
- /* <Fields> */
- /* face_id :: The ID of the face to use. */
- /* */
- /* pix_width :: The character width in integer pixels. */
- /* */
- /* pix_height :: The character height in integer pixels. */
- /* */
- typedef struct FTC_FontRec_
- {
- FTC_FaceID face_id;
- FT_UShort pix_width;
- FT_UShort pix_height;
-
- } FTC_FontRec;
-
-
- /* */
-
-
-#define FTC_FONT_COMPARE( f1, f2 ) \
- ( (f1)->face_id == (f2)->face_id && \
- (f1)->pix_width == (f2)->pix_width && \
- (f1)->pix_height == (f2)->pix_height )
-
#define FT_POINTER_TO_ULONG( p ) ( (FT_ULong)(FT_Pointer)(p) )
#define FTC_FACE_ID_HASH( i ) \
@@ -186,26 +212,10 @@
((FT_UInt32)(( FT_POINTER_TO_ULONG( i ) >> 3 ) ^ \
( FT_POINTER_TO_ULONG( i ) << 7 ) ) )
-#define FTC_FONT_HASH( f ) \
- (FT_UInt32)( FTC_FACE_ID_HASH((f)->face_id) ^ \
- ((f)->pix_width << 8) ^ \
- ((f)->pix_height) )
-
/*************************************************************************/
- /* */
- /* <Type> */
- /* FTC_Font */
- /* */
- /* <Description> */
- /* A simple handle to an @FTC_FontRec structure. */
- /* */
- typedef FTC_FontRec* FTC_Font;
-
-
/*************************************************************************/
/*************************************************************************/
- /*************************************************************************/
/***** *****/
/***** CACHE MANAGER OBJECT *****/
/***** *****/
@@ -220,9 +230,21 @@
/* FTC_Manager */
/* */
/* <Description> */
- /* This object is used to cache one or more @FT_Face objects, along */
- /* with corresponding @FT_Size objects. */
+ /* This object corresponds to one instance of the cache-subsystem. */
+ /* It is used to cache one or more @FT_Face objects, along with */
+ /* corresponding @FT_Size objects. */
/* */
+ /* the manager intentionally limits the total number of opened */
+ /* @FT_Face and @FT_Size objects to limit memory usage. See the */
+ /* 'max_faces' and 'max_sizes' parameters of @FTC_Manager_New. */
+ /* */
+ /* the manager is also used to cache 'nodes' of various types */
+ /* while limiting their total memory usage. */
+ /* */
+ /* All limitations are enforced by keeping lists of managed objects */
+ /* in most-recently-used order, and flushing old nodes to make room */
+ /* for new ones. */
+ /* */
typedef struct FTC_ManagerRec_* FTC_Manager;
@@ -257,6 +279,12 @@
/* <Input> */
/* library :: The parent FreeType library handle to use. */
/* */
+ /* max_faces :: Maximum number of opened @FT_Face objects managed */
+ /* by this cache instance. */
+ /* */
+ /* max_sizes :: Maximum number of opened @FT_Size objects managed */
+ /* by this cache instance. */
+ /* */
/* max_bytes :: Maximum number of bytes to use for cached data */
/* nodes. Use 0 for defaults. Note that this value */
/* does not account for managed FT_Face and FT_Size */
@@ -275,15 +303,6 @@
/* <Return> */
/* FreeType error code. 0 means success. */
/* */
- /* <Note> */
- /* When you perform a lookup, out-of-memory errors are detected */
- /* _within_ the lookup and force incremental flushes of the cache */
- /* until enough memory is released for the lookup to succeed. */
- /* */
- /* If a lookup fails with FT_Err_Out_Of_Memory the cache has already */
- /* been completely flushed, and still no memory is available for the */
- /* operation. */
- /* */
FT_EXPORT( FT_Error )
FTC_Manager_New( FT_Library library,
FT_UInt max_faces,
@@ -357,6 +376,15 @@
/* the @FT_Set_Transform function) on a returned face! If you need */
/* to transform glyphs, do it yourself after glyph loading. */
/* */
+ /* <Note> */
+ /* When you perform a lookup, out-of-memory errors are detected */
+ /* _within_ the lookup and force incremental flushes of the cache */
+ /* until enough memory is released for the lookup to succeed. */
+ /* */
+ /* If a lookup fails with FT_Err_Out_Of_Memory the cache has already */
+ /* been completely flushed, and still no memory is available for the */
+ /* operation. */
+ /* */
FT_EXPORT( FT_Error )
FTC_Manager_LookupFace( FTC_Manager manager,
FTC_FaceID face_id,
@@ -434,6 +462,15 @@
/* if you need it. Note that this object is also owned by the */
/* manager. */
/* */
+ /* <Note> */
+ /* When you perform a lookup, out-of-memory errors are detected */
+ /* _within_ the lookup and force incremental flushes of the cache */
+ /* until enough memory is released for the lookup to succeed. */
+ /* */
+ /* If a lookup fails with FT_Err_Out_Of_Memory the cache has already */
+ /* been completely flushed, and still no memory is available for the */
+ /* operation. */
+ /* */
FT_EXPORT( FT_Error )
FTC_Manager_LookupSize( FTC_Manager manager,
FTC_Scaler scaler,
@@ -834,6 +871,48 @@
/* */
#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+ /*@***********************************************************************/
+ /* */
+ /* <Struct> */
+ /* FTC_FontRec */
+ /* */
+ /* <Description> */
+ /* A simple structure used to describe a given `font' to the cache */
+ /* manager. Note that a `font' is the combination of a given face */
+ /* with a given character size. */
+ /* */
+ /* <Fields> */
+ /* face_id :: The ID of the face to use. */
+ /* */
+ /* pix_width :: The character width in integer pixels. */
+ /* */
+ /* pix_height :: The character height in integer pixels. */
+ /* */
+ typedef struct FTC_FontRec_
+ {
+ FTC_FaceID face_id;
+ FT_UShort pix_width;
+ FT_UShort pix_height;
+
+ } FTC_FontRec;
+
+
+ /* */
+
+
+#define FTC_FONT_COMPARE( f1, f2 ) \
+ ( (f1)->face_id == (f2)->face_id && \
+ (f1)->pix_width == (f2)->pix_width && \
+ (f1)->pix_height == (f2)->pix_height )
+
+#define FTC_FONT_HASH( f ) \
+ (FT_UInt32)( FTC_FACE_ID_HASH((f)->face_id) ^ \
+ ((f)->pix_width << 8) ^ \
+ ((f)->pix_height) )
+
+ typedef FTC_FontRec* FTC_Font;
+
FT_EXPORT( FT_Error )
FTC_Manager_Lookup_Face( FTC_Manager manager,