Skip to content

FreeType » Docs » Cache Sub-System » Cache Sub-System


Cache Sub-System

Synopsis

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 rather than the usual FT_ prefix in the rest of FreeType.

The cache is highly portable and, thus, doesn't know anything about the fonts installed on your system, or how to access them. Therefore, it requires the following.

  • FTC_FaceID, an arbitrary non-zero value that uniquely identifies available or installed font faces, has to be 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, but they have to be persistent on the client side.

  • FTC_Face_Requester, a method to convert an FTC_FaceID into a new FT_Face object when necessary, has to be provided to the cache by the client. The FT_Face object is completely managed by the cache, including its termination through FT_Done_Face. To monitor termination of face objects, the finalizer callback in the generic field of the FT_Face object can be used, which might also be used to store the FTC_FaceID of the face.

Clients are free to map face IDs to anything useful. The most simple usage is, for example, to associate them to a {pathname,face_index} pair that is then used by FTC_Face_Requester 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 contents 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 in FTC_Face_Requester.

To use the cache, start with calling FTC_Manager_New to create a new FTC_Manager object, which models a single cache instance. You can then look up FT_Face and FT_Size objects with FTC_Manager_LookupFace and FTC_Manager_LookupSize, respectively, and use them in any FreeType work stream. You can also cache other FreeType objects as follows.

FTC_Manager

Defined in FT_CACHE_H (freetype/ftcache.h).

  typedef struct FTC_ManagerRec_*  FTC_Manager;

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 control 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.


FTC_FaceID

Defined in FT_CACHE_H (freetype/ftcache.h).

  typedef FT_Pointer  FTC_FaceID;

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 that calls, 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.


FTC_Face_Requester

Defined in FT_CACHE_H (freetype/ftcache.h).

  typedef FT_Error
  (*FTC_Face_Requester)( FTC_FaceID  face_id,
                         FT_Library  library,
                         FT_Pointer  req_data,
                         FT_Face*    aface );

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 as 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!


FTC_Manager_New

Defined in FT_CACHE_H (freetype/ftcache.h).

  FT_EXPORT( FT_Error )
  FTC_Manager_New( FT_Library          library,
                   FT_UInt             max_faces,
                   FT_UInt             max_sizes,
                   FT_ULong            max_bytes,
                   FTC_Face_Requester  requester,
                   FT_Pointer          req_data,
                   FTC_Manager        *amanager );

Create a new cache manager.

input

library

The parent FreeType library handle to use.

max_faces

Maximum number of opened FT_Face objects managed by this cache instance. Use 0 for defaults.

max_sizes

Maximum number of opened FT_Size objects managed by this cache instance. Use 0 for defaults.

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 objects.

requester

An application-provided callback used to translate face IDs into real FT_Face objects.

req_data

A generic pointer that is passed to the requester each time it is called (see FTC_Face_Requester).

output

amanager

A handle to a new manager object. 0 in case of failure.

return

FreeType error code. 0 means success.


FTC_Manager_Reset

Defined in FT_CACHE_H (freetype/ftcache.h).

  FT_EXPORT( void )
  FTC_Manager_Reset( FTC_Manager  manager );

Empty a given cache manager. This simply gets rid of all the currently cached FT_Face and FT_Size objects within the manager.

inout

manager

A handle to the manager.


FTC_Manager_Done

Defined in FT_CACHE_H (freetype/ftcache.h).

  FT_EXPORT( void )
  FTC_Manager_Done( FTC_Manager  manager );

Destroy a given manager after emptying it.

input

manager

A handle to the target cache manager object.


FTC_Manager_LookupFace

Defined in FT_CACHE_H (freetype/ftcache.h).

  FT_EXPORT( FT_Error )
  FTC_Manager_LookupFace( FTC_Manager  manager,
                          FTC_FaceID   face_id,
                          FT_Face     *aface );

Retrieve the FT_Face object that corresponds to a given face ID through a cache manager.

input

manager

A handle to the cache manager.

face_id

The ID of the face object.

output

aface

A handle to the face object.

return

FreeType error code. 0 means success.

note

The returned FT_Face object is always owned by the manager. You should never try to discard it yourself.

The FT_Face object doesn't necessarily have a current size object (i.e., face->size can be 0). If you need a specific ‘font size’, use FTC_Manager_LookupSize instead.

Never change the face's transformation matrix (i.e., never call the FT_Set_Transform function) on a returned face! If you need to transform glyphs, do it yourself after glyph loading.

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 was available for the operation.


FTC_Manager_LookupSize

Defined in FT_CACHE_H (freetype/ftcache.h).

  FT_EXPORT( FT_Error )
  FTC_Manager_LookupSize( FTC_Manager  manager,
                          FTC_Scaler   scaler,
                          FT_Size     *asize );

Retrieve the FT_Size object that corresponds to a given FTC_ScalerRec pointer through a cache manager.

input

manager

A handle to the cache manager.

scaler

A scaler handle.

output

asize

A handle to the size object.

return

FreeType error code. 0 means success.

note

The returned FT_Size object is always owned by the manager. You should never try to discard it by yourself.

You can access the parent FT_Face object simply as size->face 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.


FTC_Manager_RemoveFaceID

Defined in FT_CACHE_H (freetype/ftcache.h).

  FT_EXPORT( void )
  FTC_Manager_RemoveFaceID( FTC_Manager  manager,
                            FTC_FaceID   face_id );

A special function used to indicate to the cache manager that a given FTC_FaceID is no longer valid, either because its content changed, or because it was deallocated or uninstalled.

input

manager

The cache manager handle.

face_id

The FTC_FaceID to be removed.

note

This function flushes all nodes from the cache corresponding to this face_id, with the exception of nodes with a non-null reference count.

Such nodes are however modified internally so as to never appear in later lookups with the same face_id value, and to be immediately destroyed when released by all their users.


FTC_Node

Defined in FT_CACHE_H (freetype/ftcache.h).

  typedef struct FTC_NodeRec_*  FTC_Node;

An opaque handle to a cache node object. Each cache node is reference-counted. A node with a count of 0 might be flushed out of a full cache whenever a lookup request is performed.

If you look up nodes, you have the ability to ‘acquire’ them, i.e., to increment their reference count. This will prevent the node from being flushed out of the cache until you explicitly ‘release’ it (see FTC_Node_Unref).

See also FTC_SBitCache_Lookup and FTC_ImageCache_Lookup.


FTC_Node_Unref

Defined in FT_CACHE_H (freetype/ftcache.h).

  FT_EXPORT( void )
  FTC_Node_Unref( FTC_Node     node,
                  FTC_Manager  manager );

Decrement a cache node's internal reference count. When the count reaches 0, it is not destroyed but becomes eligible for subsequent cache flushes.

input

node

The cache node handle.

manager

The cache manager handle.


FTC_ImageCache

Defined in FT_CACHE_H (freetype/ftcache.h).

  typedef struct FTC_ImageCacheRec_*  FTC_ImageCache;

A handle to a glyph image cache object. They are designed to hold many distinct glyph images while not exceeding a certain memory threshold.


FTC_ImageCache_New

Defined in FT_CACHE_H (freetype/ftcache.h).

  FT_EXPORT( FT_Error )
  FTC_ImageCache_New( FTC_Manager      manager,
                      FTC_ImageCache  *acache );

Create a new glyph image cache.

input

manager

The parent manager for the image cache.

output

acache

A handle to the new glyph image cache object.

return

FreeType error code. 0 means success.


FTC_ImageCache_Lookup

Defined in FT_CACHE_H (freetype/ftcache.h).

  FT_EXPORT( FT_Error )
  FTC_ImageCache_Lookup( FTC_ImageCache  cache,
                         FTC_ImageType   type,
                         FT_UInt         gindex,
                         FT_Glyph       *aglyph,
                         FTC_Node       *anode );

Retrieve a given glyph image from a glyph image cache.

input

cache

A handle to the source glyph image cache.

type

A pointer to a glyph image type descriptor.

gindex

The glyph index to retrieve.

output

aglyph

The corresponding FT_Glyph object. 0 in case of failure.

anode

Used to return the address of the corresponding cache node after incrementing its reference count (see note below).

return

FreeType error code. 0 means success.

note

The returned glyph is owned and managed by the glyph image cache. Never try to transform or discard it manually! You can however create a copy with FT_Glyph_Copy and modify the new one.

If anode is not NULL, it receives the address of the cache node containing the glyph image, after increasing its reference count. This ensures that the node (as well as the FT_Glyph) will always be kept in the cache until you call FTC_Node_Unref to ‘release’ it.

If anode is NULL, the cache node is left unchanged, which means that the FT_Glyph could be flushed out of the cache on the next call to one of the caching sub-system APIs. Don't assume that it is persistent!


FTC_SBit

Defined in FT_CACHE_H (freetype/ftcache.h).

  typedef struct FTC_SBitRec_*  FTC_SBit;

A handle to a small bitmap descriptor. See the FTC_SBitRec structure for details.


FTC_SBitCache

Defined in FT_CACHE_H (freetype/ftcache.h).

  typedef struct FTC_SBitCacheRec_*  FTC_SBitCache;

A handle to a small bitmap cache. These are special cache objects used to store small glyph bitmaps (and anti-aliased pixmaps) in a much more efficient way than the traditional glyph image cache implemented by FTC_ImageCache.


FTC_SBitCache_New

Defined in FT_CACHE_H (freetype/ftcache.h).

  FT_EXPORT( FT_Error )
  FTC_SBitCache_New( FTC_Manager     manager,
                     FTC_SBitCache  *acache );

Create a new cache to store small glyph bitmaps.

input

manager

A handle to the source cache manager.

output

acache

A handle to the new sbit cache. NULL in case of error.

return

FreeType error code. 0 means success.


FTC_SBitCache_Lookup

Defined in FT_CACHE_H (freetype/ftcache.h).

  FT_EXPORT( FT_Error )
  FTC_SBitCache_Lookup( FTC_SBitCache    cache,
                        FTC_ImageType    type,
                        FT_UInt          gindex,
                        FTC_SBit        *sbit,
                        FTC_Node        *anode );

Look up a given small glyph bitmap in a given sbit cache and ‘lock’ it to prevent its flushing from the cache until needed.

input

cache

A handle to the source sbit cache.

type

A pointer to the glyph image type descriptor.

gindex

The glyph index.

output

sbit

A handle to a small bitmap descriptor.

anode

Used to return the address of the corresponding cache node after incrementing its reference count (see note below).

return

FreeType error code. 0 means success.

note

The small bitmap descriptor and its bit buffer are owned by the cache and should never be freed by the application. They might as well disappear from memory on the next cache lookup, so don't treat them as persistent data.

The descriptor's buffer field is set to 0 to indicate a missing glyph bitmap.

If anode is not NULL, it receives the address of the cache node containing the bitmap, after increasing its reference count. This ensures that the node (as well as the image) will always be kept in the cache until you call FTC_Node_Unref to ‘release’ it.

If anode is NULL, the cache node is left unchanged, which means that the bitmap could be flushed out of the cache on the next call to one of the caching sub-system APIs. Don't assume that it is persistent!


FTC_CMapCache

Defined in FT_CACHE_H (freetype/ftcache.h).

  typedef struct FTC_CMapCacheRec_*  FTC_CMapCache;

An opaque handle used to model a charmap cache. This cache is to hold character codes -> glyph indices mappings.


FTC_CMapCache_New

Defined in FT_CACHE_H (freetype/ftcache.h).

  FT_EXPORT( FT_Error )
  FTC_CMapCache_New( FTC_Manager     manager,
                     FTC_CMapCache  *acache );

Create a new charmap cache.

input

manager

A handle to the cache manager.

output

acache

A new cache handle. NULL in case of error.

return

FreeType error code. 0 means success.

note

Like all other caches, this one will be destroyed with the cache manager.


FTC_CMapCache_Lookup

Defined in FT_CACHE_H (freetype/ftcache.h).

  FT_EXPORT( FT_UInt )
  FTC_CMapCache_Lookup( FTC_CMapCache  cache,
                        FTC_FaceID     face_id,
                        FT_Int         cmap_index,
                        FT_UInt32      char_code );

Translate a character code into a glyph index, using the charmap cache.

input

cache

A charmap cache handle.

face_id

The source face ID.

cmap_index

The index of the charmap in the source face. Any negative value means to use the cache FT_Face's default charmap.

char_code

The character code (in the corresponding charmap).

return

Glyph index. 0 means ‘no glyph’.


FTC_ScalerRec

Defined in FT_CACHE_H (freetype/ftcache.h).

  typedef struct  FTC_ScalerRec_
  {
    FTC_FaceID  face_id;
    FT_UInt     width;
    FT_UInt     height;
    FT_Int      pixel;
    FT_UInt     x_res;
    FT_UInt     y_res;

  } FTC_ScalerRec;

A structure used to describe a given character size in either pixels or points to the cache manager. See FTC_Manager_LookupSize.

fields

face_id

The source face ID.

width

The character width.

height

The character height.

pixel

A Boolean. If 1, the width and height fields are interpreted as integer pixel character sizes. Otherwise, they are expressed as 1/64 of points.

x_res

Only used when pixel is value 0 to indicate the horizontal resolution in dpi.

y_res

Only used when pixel is value 0 to indicate the vertical resolution in dpi.

note

This type is mainly used to retrieve FT_Size objects through the cache manager.


FTC_Scaler

Defined in FT_CACHE_H (freetype/ftcache.h).

  typedef struct FTC_ScalerRec_*  FTC_Scaler;

A handle to an FTC_ScalerRec structure.


FTC_ImageTypeRec

Defined in FT_CACHE_H (freetype/ftcache.h).

  typedef struct  FTC_ImageTypeRec_
  {
    FTC_FaceID  face_id;
    FT_UInt     width;
    FT_UInt     height;
    FT_Int32    flags;

  } FTC_ImageTypeRec;

A structure used to model the type of images in a glyph cache.

fields

face_id

The face ID.

width

The width in pixels.

height

The height in pixels.

flags

The load flags, as in FT_Load_Glyph.


FTC_ImageType

Defined in FT_CACHE_H (freetype/ftcache.h).

  typedef struct FTC_ImageTypeRec_*  FTC_ImageType;

A handle to an FTC_ImageTypeRec structure.


FTC_ImageCache_LookupScaler

Defined in FT_CACHE_H (freetype/ftcache.h).

  FT_EXPORT( FT_Error )
  FTC_ImageCache_LookupScaler( FTC_ImageCache  cache,
                               FTC_Scaler      scaler,
                               FT_ULong        load_flags,
                               FT_UInt         gindex,
                               FT_Glyph       *aglyph,
                               FTC_Node       *anode );

A variant of FTC_ImageCache_Lookup that uses an FTC_ScalerRec to specify the face ID and its size.

input

cache

A handle to the source glyph image cache.

scaler

A pointer to a scaler descriptor.

load_flags

The corresponding load flags.

gindex

The glyph index to retrieve.

output

aglyph

The corresponding FT_Glyph object. 0 in case of failure.

anode

Used to return the address of the corresponding cache node after incrementing its reference count (see note below).

return

FreeType error code. 0 means success.

note

The returned glyph is owned and managed by the glyph image cache. Never try to transform or discard it manually! You can however create a copy with FT_Glyph_Copy and modify the new one.

If anode is not NULL, it receives the address of the cache node containing the glyph image, after increasing its reference count. This ensures that the node (as well as the FT_Glyph) will always be kept in the cache until you call FTC_Node_Unref to ‘release’ it.

If anode is NULL, the cache node is left unchanged, which means that the FT_Glyph could be flushed out of the cache on the next call to one of the caching sub-system APIs. Don't assume that it is persistent!

Calls to FT_Set_Char_Size and friends have no effect on cached glyphs; you should always use the FreeType cache API instead.


FTC_SBitRec

Defined in FT_CACHE_H (freetype/ftcache.h).

  typedef struct  FTC_SBitRec_
  {
    FT_Byte   width;
    FT_Byte   height;
    FT_Char   left;
    FT_Char   top;

    FT_Byte   format;
    FT_Byte   max_grays;
    FT_Short  pitch;
    FT_Char   xadvance;
    FT_Char   yadvance;

    FT_Byte*  buffer;

  } FTC_SBitRec;

A very compact structure used to describe a small glyph bitmap.

fields

width

The bitmap width in pixels.

height

The bitmap height in pixels.

left

The horizontal distance from the pen position to the left bitmap border (a.k.a. ‘left side bearing’, or ‘lsb’).

top

The vertical distance from the pen position (on the baseline) to the upper bitmap border (a.k.a. ‘top side bearing’). The distance is positive for upwards y coordinates.

format

The format of the glyph bitmap (monochrome or gray).

max_grays

Maximum gray level value (in the range 1 to 255).

pitch

The number of bytes per bitmap line. May be positive or negative.

xadvance

The horizontal advance width in pixels.

yadvance

The vertical advance height in pixels.

buffer

A pointer to the bitmap pixels.


FTC_SBitCache_LookupScaler

Defined in FT_CACHE_H (freetype/ftcache.h).

  FT_EXPORT( FT_Error )
  FTC_SBitCache_LookupScaler( FTC_SBitCache  cache,
                              FTC_Scaler     scaler,
                              FT_ULong       load_flags,
                              FT_UInt        gindex,
                              FTC_SBit      *sbit,
                              FTC_Node      *anode );

A variant of FTC_SBitCache_Lookup that uses an FTC_ScalerRec to specify the face ID and its size.

input

cache

A handle to the source sbit cache.

scaler

A pointer to the scaler descriptor.

load_flags

The corresponding load flags.

gindex

The glyph index.

output

sbit

A handle to a small bitmap descriptor.

anode

Used to return the address of the corresponding cache node after incrementing its reference count (see note below).

return

FreeType error code. 0 means success.

note

The small bitmap descriptor and its bit buffer are owned by the cache and should never be freed by the application. They might as well disappear from memory on the next cache lookup, so don't treat them as persistent data.

The descriptor's buffer field is set to 0 to indicate a missing glyph bitmap.

If anode is not NULL, it receives the address of the cache node containing the bitmap, after increasing its reference count. This ensures that the node (as well as the image) will always be kept in the cache until you call FTC_Node_Unref to ‘release’ it.

If anode is NULL, the cache node is left unchanged, which means that the bitmap could be flushed out of the cache on the next call to one of the caching sub-system APIs. Don't assume that it is persistent!