updating cache documentation

This commit is contained in:
David Turner 2006-04-01 09:14:12 +00:00
parent 6e9df6855d
commit 9da74d844b
1 changed files with 236 additions and 157 deletions

View File

@ -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,85 +139,72 @@ FT_BEGIN_HEADER
/*************************************************************************/
/*************************************************************************/
/* */
/* <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,
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) )
@ -186,22 +212,6 @@ FT_BEGIN_HEADER
((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;
/*************************************************************************/
/*************************************************************************/
@ -220,8 +230,20 @@ FT_BEGIN_HEADER
/* 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 @@ FT_BEGIN_HEADER
/* <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 @@ FT_BEGIN_HEADER
/* <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 @@ FT_BEGIN_HEADER
/* 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 @@ FT_BEGIN_HEADER
/* 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,
@ -835,6 +872,48 @@ FT_BEGIN_HEADER
#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,
FTC_FaceID face_id,