(root)/
freetype-2.13.2/
include/
freetype/
ftcache.h
       1  /****************************************************************************
       2   *
       3   * ftcache.h
       4   *
       5   *   FreeType Cache subsystem (specification).
       6   *
       7   * Copyright (C) 1996-2023 by
       8   * David Turner, Robert Wilhelm, and Werner Lemberg.
       9   *
      10   * This file is part of the FreeType project, and may only be used,
      11   * modified, and distributed under the terms of the FreeType project
      12   * license, LICENSE.TXT.  By continuing to use, modify, or distribute
      13   * this file you indicate that you have read the license and
      14   * understand and accept it fully.
      15   *
      16   */
      17  
      18  
      19  #ifndef FTCACHE_H_
      20  #define FTCACHE_H_
      21  
      22  
      23  #include <freetype/ftglyph.h>
      24  
      25  
      26  FT_BEGIN_HEADER
      27  
      28  
      29    /**************************************************************************
      30     *
      31     * @section:
      32     *   cache_subsystem
      33     *
      34     * @title:
      35     *   Cache Sub-System
      36     *
      37     * @abstract:
      38     *   How to cache face, size, and glyph data with FreeType~2.
      39     *
      40     * @description:
      41     *   This section describes the FreeType~2 cache sub-system, which is used
      42     *   to limit the number of concurrently opened @FT_Face and @FT_Size
      43     *   objects, as well as caching information like character maps and glyph
      44     *   images while limiting their maximum memory usage.
      45     *
      46     *   Note that all types and functions begin with the `FTC_` prefix rather
      47     *   than the usual `FT_` prefix in the rest of FreeType.
      48     *
      49     *   The cache is highly portable and, thus, doesn't know anything about
      50     *   the fonts installed on your system, or how to access them.  Therefore,
      51     *   it requires the following.
      52     *
      53     *   * @FTC_FaceID, an arbitrary non-zero value that uniquely identifies
      54     *     available or installed font faces, has to be provided to the
      55     *     cache by the client.  Note that the cache only stores and compares
      56     *     these values and doesn't try to interpret them in any way, but they
      57     *     have to be persistent on the client side.
      58     *
      59     *   * @FTC_Face_Requester, a method to convert an @FTC_FaceID into a new
      60     *     @FT_Face object when necessary, has to be provided to the cache by
      61     *     the client.  The @FT_Face object is completely managed by the cache,
      62     *     including its termination through @FT_Done_Face.  To monitor
      63     *     termination of face objects, the finalizer callback in the `generic`
      64     *     field of the @FT_Face object can be used, which might also be used
      65     *     to store the @FTC_FaceID of the face.
      66     *
      67     *   Clients are free to map face IDs to anything useful.  The most simple
      68     *   usage is, for example, to associate them to a `{pathname,face_index}`
      69     *   pair that is then used by @FTC_Face_Requester to call @FT_New_Face.
      70     *   However, more complex schemes are also possible.
      71     *
      72     *   Note that for the cache to work correctly, the face ID values must be
      73     *   **persistent**, which means that the contents they point to should not
      74     *   change at runtime, or that their value should not become invalid.
      75     *   If this is unavoidable (e.g., when a font is uninstalled at runtime),
      76     *   you should call @FTC_Manager_RemoveFaceID as soon as possible to let
      77     *   the cache get rid of any references to the old @FTC_FaceID it may keep
      78     *   internally.  Failure to do so will lead to incorrect behaviour or even
      79     *   crashes in @FTC_Face_Requester.
      80     *
      81     *   To use the cache, start with calling @FTC_Manager_New to create a new
      82     *   @FTC_Manager object, which models a single cache instance.  You can
      83     *   then look up @FT_Face and @FT_Size objects with
      84     *   @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively, and
      85     *   use them in any FreeType work stream.  You can also cache other
      86     *   FreeType objects as follows.
      87     *
      88     *   * If you want to use the charmap caching, call @FTC_CMapCache_New,
      89     *     then later use @FTC_CMapCache_Lookup to perform the equivalent of
      90     *     @FT_Get_Char_Index, only much faster.
      91     *
      92     *   * If you want to use the @FT_Glyph caching, call @FTC_ImageCache_New,
      93     *     then later use @FTC_ImageCache_Lookup to retrieve the corresponding
      94     *     @FT_Glyph objects from the cache.
      95     *
      96     *   * If you need lots of small bitmaps, it is much more memory-efficient
      97     *     to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup.  This
      98     *     returns @FTC_SBitRec structures, which are used to store small
      99     *     bitmaps directly.  (A small bitmap is one whose metrics and
     100     *     dimensions all fit into 8-bit integers).
     101     *
     102     * @order:
     103     *   FTC_Manager
     104     *   FTC_FaceID
     105     *   FTC_Face_Requester
     106     *
     107     *   FTC_Manager_New
     108     *   FTC_Manager_Reset
     109     *   FTC_Manager_Done
     110     *   FTC_Manager_LookupFace
     111     *   FTC_Manager_LookupSize
     112     *   FTC_Manager_RemoveFaceID
     113     *
     114     *   FTC_Node
     115     *   FTC_Node_Unref
     116     *
     117     *   FTC_ImageCache
     118     *   FTC_ImageCache_New
     119     *   FTC_ImageCache_Lookup
     120     *
     121     *   FTC_SBit
     122     *   FTC_SBitCache
     123     *   FTC_SBitCache_New
     124     *   FTC_SBitCache_Lookup
     125     *
     126     *   FTC_CMapCache
     127     *   FTC_CMapCache_New
     128     *   FTC_CMapCache_Lookup
     129     *
     130     *************************************************************************/
     131  
     132  
     133    /*************************************************************************/
     134    /*************************************************************************/
     135    /*************************************************************************/
     136    /*****                                                               *****/
     137    /*****                    BASIC TYPE DEFINITIONS                     *****/
     138    /*****                                                               *****/
     139    /*************************************************************************/
     140    /*************************************************************************/
     141    /*************************************************************************/
     142  
     143  
     144    /**************************************************************************
     145     *
     146     * @type:
     147     *   FTC_FaceID
     148     *
     149     * @description:
     150     *   An opaque pointer type that is used to identity face objects.  The
     151     *   contents of such objects is application-dependent.
     152     *
     153     *   These pointers are typically used to point to a user-defined structure
     154     *   containing a font file path, and face index.
     155     *
     156     * @note:
     157     *   Never use `NULL` as a valid @FTC_FaceID.
     158     *
     159     *   Face IDs are passed by the client to the cache manager that calls,
     160     *   when needed, the @FTC_Face_Requester to translate them into new
     161     *   @FT_Face objects.
     162     *
     163     *   If the content of a given face ID changes at runtime, or if the value
     164     *   becomes invalid (e.g., when uninstalling a font), you should
     165     *   immediately call @FTC_Manager_RemoveFaceID before any other cache
     166     *   function.
     167     *
     168     *   Failure to do so will result in incorrect behaviour or even memory
     169     *   leaks and crashes.
     170     */
     171    typedef FT_Pointer  FTC_FaceID;
     172  
     173  
     174    /**************************************************************************
     175     *
     176     * @functype:
     177     *   FTC_Face_Requester
     178     *
     179     * @description:
     180     *   A callback function provided by client applications.  It is used by
     181     *   the cache manager to translate a given @FTC_FaceID into a new valid
     182     *   @FT_Face object, on demand.
     183     *
     184     * @input:
     185     *   face_id ::
     186     *     The face ID to resolve.
     187     *
     188     *   library ::
     189     *     A handle to a FreeType library object.
     190     *
     191     *   req_data ::
     192     *     Application-provided request data (see note below).
     193     *
     194     * @output:
     195     *   aface ::
     196     *     A new @FT_Face handle.
     197     *
     198     * @return:
     199     *   FreeType error code.  0~means success.
     200     *
     201     * @note:
     202     *   The third parameter `req_data` is the same as the one passed by the
     203     *   client when @FTC_Manager_New is called.
     204     *
     205     *   The face requester should not perform funny things on the returned
     206     *   face object, like creating a new @FT_Size for it, or setting a
     207     *   transformation through @FT_Set_Transform!
     208     */
     209    typedef FT_Error
     210    (*FTC_Face_Requester)( FTC_FaceID  face_id,
     211                           FT_Library  library,
     212                           FT_Pointer  req_data,
     213                           FT_Face*    aface );
     214  
     215    /* */
     216  
     217  
     218    /*************************************************************************/
     219    /*************************************************************************/
     220    /*************************************************************************/
     221    /*****                                                               *****/
     222    /*****                      CACHE MANAGER OBJECT                     *****/
     223    /*****                                                               *****/
     224    /*************************************************************************/
     225    /*************************************************************************/
     226    /*************************************************************************/
     227  
     228  
     229    /**************************************************************************
     230     *
     231     * @type:
     232     *   FTC_Manager
     233     *
     234     * @description:
     235     *   This object corresponds to one instance of the cache-subsystem.  It is
     236     *   used to cache one or more @FT_Face objects, along with corresponding
     237     *   @FT_Size objects.
     238     *
     239     *   The manager intentionally limits the total number of opened @FT_Face
     240     *   and @FT_Size objects to control memory usage.  See the `max_faces` and
     241     *   `max_sizes` parameters of @FTC_Manager_New.
     242     *
     243     *   The manager is also used to cache 'nodes' of various types while
     244     *   limiting their total memory usage.
     245     *
     246     *   All limitations are enforced by keeping lists of managed objects in
     247     *   most-recently-used order, and flushing old nodes to make room for new
     248     *   ones.
     249     */
     250    typedef struct FTC_ManagerRec_*  FTC_Manager;
     251  
     252  
     253    /**************************************************************************
     254     *
     255     * @type:
     256     *   FTC_Node
     257     *
     258     * @description:
     259     *   An opaque handle to a cache node object.  Each cache node is
     260     *   reference-counted.  A node with a count of~0 might be flushed out of a
     261     *   full cache whenever a lookup request is performed.
     262     *
     263     *   If you look up nodes, you have the ability to 'acquire' them, i.e., to
     264     *   increment their reference count.  This will prevent the node from
     265     *   being flushed out of the cache until you explicitly 'release' it (see
     266     *   @FTC_Node_Unref).
     267     *
     268     *   See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup.
     269     */
     270    typedef struct FTC_NodeRec_*  FTC_Node;
     271  
     272  
     273    /**************************************************************************
     274     *
     275     * @function:
     276     *   FTC_Manager_New
     277     *
     278     * @description:
     279     *   Create a new cache manager.
     280     *
     281     * @input:
     282     *   library ::
     283     *     The parent FreeType library handle to use.
     284     *
     285     *   max_faces ::
     286     *     Maximum number of opened @FT_Face objects managed by this cache
     287     *     instance.  Use~0 for defaults.
     288     *
     289     *   max_sizes ::
     290     *     Maximum number of opened @FT_Size objects managed by this cache
     291     *     instance.  Use~0 for defaults.
     292     *
     293     *   max_bytes ::
     294     *     Maximum number of bytes to use for cached data nodes.  Use~0 for
     295     *     defaults.  Note that this value does not account for managed
     296     *     @FT_Face and @FT_Size objects.
     297     *
     298     *   requester ::
     299     *     An application-provided callback used to translate face IDs into
     300     *     real @FT_Face objects.
     301     *
     302     *   req_data ::
     303     *     A generic pointer that is passed to the requester each time it is
     304     *     called (see @FTC_Face_Requester).
     305     *
     306     * @output:
     307     *   amanager ::
     308     *     A handle to a new manager object.  0~in case of failure.
     309     *
     310     * @return:
     311     *   FreeType error code.  0~means success.
     312     */
     313    FT_EXPORT( FT_Error )
     314    FTC_Manager_New( FT_Library          library,
     315                     FT_UInt             max_faces,
     316                     FT_UInt             max_sizes,
     317                     FT_ULong            max_bytes,
     318                     FTC_Face_Requester  requester,
     319                     FT_Pointer          req_data,
     320                     FTC_Manager        *amanager );
     321  
     322  
     323    /**************************************************************************
     324     *
     325     * @function:
     326     *   FTC_Manager_Reset
     327     *
     328     * @description:
     329     *   Empty a given cache manager.  This simply gets rid of all the
     330     *   currently cached @FT_Face and @FT_Size objects within the manager.
     331     *
     332     * @inout:
     333     *   manager ::
     334     *     A handle to the manager.
     335     */
     336    FT_EXPORT( void )
     337    FTC_Manager_Reset( FTC_Manager  manager );
     338  
     339  
     340    /**************************************************************************
     341     *
     342     * @function:
     343     *   FTC_Manager_Done
     344     *
     345     * @description:
     346     *   Destroy a given manager after emptying it.
     347     *
     348     * @input:
     349     *   manager ::
     350     *     A handle to the target cache manager object.
     351     */
     352    FT_EXPORT( void )
     353    FTC_Manager_Done( FTC_Manager  manager );
     354  
     355  
     356    /**************************************************************************
     357     *
     358     * @function:
     359     *   FTC_Manager_LookupFace
     360     *
     361     * @description:
     362     *   Retrieve the @FT_Face object that corresponds to a given face ID
     363     *   through a cache manager.
     364     *
     365     * @input:
     366     *   manager ::
     367     *     A handle to the cache manager.
     368     *
     369     *   face_id ::
     370     *     The ID of the face object.
     371     *
     372     * @output:
     373     *   aface ::
     374     *     A handle to the face object.
     375     *
     376     * @return:
     377     *   FreeType error code.  0~means success.
     378     *
     379     * @note:
     380     *   The returned @FT_Face object is always owned by the manager.  You
     381     *   should never try to discard it yourself.
     382     *
     383     *   The @FT_Face object doesn't necessarily have a current size object
     384     *   (i.e., face->size can be~0).  If you need a specific 'font size', use
     385     *   @FTC_Manager_LookupSize instead.
     386     *
     387     *   Never change the face's transformation matrix (i.e., never call the
     388     *   @FT_Set_Transform function) on a returned face!  If you need to
     389     *   transform glyphs, do it yourself after glyph loading.
     390     *
     391     *   When you perform a lookup, out-of-memory errors are detected _within_
     392     *   the lookup and force incremental flushes of the cache until enough
     393     *   memory is released for the lookup to succeed.
     394     *
     395     *   If a lookup fails with `FT_Err_Out_Of_Memory` the cache has already
     396     *   been completely flushed, and still no memory was available for the
     397     *   operation.
     398     */
     399    FT_EXPORT( FT_Error )
     400    FTC_Manager_LookupFace( FTC_Manager  manager,
     401                            FTC_FaceID   face_id,
     402                            FT_Face     *aface );
     403  
     404  
     405    /**************************************************************************
     406     *
     407     * @struct:
     408     *   FTC_ScalerRec
     409     *
     410     * @description:
     411     *   A structure used to describe a given character size in either pixels
     412     *   or points to the cache manager.  See @FTC_Manager_LookupSize.
     413     *
     414     * @fields:
     415     *   face_id ::
     416     *     The source face ID.
     417     *
     418     *   width ::
     419     *     The character width.
     420     *
     421     *   height ::
     422     *     The character height.
     423     *
     424     *   pixel ::
     425     *     A Boolean.  If 1, the `width` and `height` fields are interpreted as
     426     *     integer pixel character sizes.  Otherwise, they are expressed as
     427     *     1/64 of points.
     428     *
     429     *   x_res ::
     430     *     Only used when `pixel` is value~0 to indicate the horizontal
     431     *     resolution in dpi.
     432     *
     433     *   y_res ::
     434     *     Only used when `pixel` is value~0 to indicate the vertical
     435     *     resolution in dpi.
     436     *
     437     * @note:
     438     *   This type is mainly used to retrieve @FT_Size objects through the
     439     *   cache manager.
     440     */
     441    typedef struct  FTC_ScalerRec_
     442    {
     443      FTC_FaceID  face_id;
     444      FT_UInt     width;
     445      FT_UInt     height;
     446      FT_Int      pixel;
     447      FT_UInt     x_res;
     448      FT_UInt     y_res;
     449  
     450    } FTC_ScalerRec;
     451  
     452  
     453    /**************************************************************************
     454     *
     455     * @struct:
     456     *   FTC_Scaler
     457     *
     458     * @description:
     459     *   A handle to an @FTC_ScalerRec structure.
     460     */
     461    typedef struct FTC_ScalerRec_*  FTC_Scaler;
     462  
     463  
     464    /**************************************************************************
     465     *
     466     * @function:
     467     *   FTC_Manager_LookupSize
     468     *
     469     * @description:
     470     *   Retrieve the @FT_Size object that corresponds to a given
     471     *   @FTC_ScalerRec pointer through a cache manager.
     472     *
     473     * @input:
     474     *   manager ::
     475     *     A handle to the cache manager.
     476     *
     477     *   scaler ::
     478     *     A scaler handle.
     479     *
     480     * @output:
     481     *   asize ::
     482     *     A handle to the size object.
     483     *
     484     * @return:
     485     *   FreeType error code.  0~means success.
     486     *
     487     * @note:
     488     *   The returned @FT_Size object is always owned by the manager.  You
     489     *   should never try to discard it by yourself.
     490     *
     491     *   You can access the parent @FT_Face object simply as `size->face` if
     492     *   you need it.  Note that this object is also owned by the manager.
     493     *
     494     * @note:
     495     *   When you perform a lookup, out-of-memory errors are detected _within_
     496     *   the lookup and force incremental flushes of the cache until enough
     497     *   memory is released for the lookup to succeed.
     498     *
     499     *   If a lookup fails with `FT_Err_Out_Of_Memory` the cache has already
     500     *   been completely flushed, and still no memory is available for the
     501     *   operation.
     502     */
     503    FT_EXPORT( FT_Error )
     504    FTC_Manager_LookupSize( FTC_Manager  manager,
     505                            FTC_Scaler   scaler,
     506                            FT_Size     *asize );
     507  
     508  
     509    /**************************************************************************
     510     *
     511     * @function:
     512     *   FTC_Node_Unref
     513     *
     514     * @description:
     515     *   Decrement a cache node's internal reference count.  When the count
     516     *   reaches 0, it is not destroyed but becomes eligible for subsequent
     517     *   cache flushes.
     518     *
     519     * @input:
     520     *   node ::
     521     *     The cache node handle.
     522     *
     523     *   manager ::
     524     *     The cache manager handle.
     525     */
     526    FT_EXPORT( void )
     527    FTC_Node_Unref( FTC_Node     node,
     528                    FTC_Manager  manager );
     529  
     530  
     531    /**************************************************************************
     532     *
     533     * @function:
     534     *   FTC_Manager_RemoveFaceID
     535     *
     536     * @description:
     537     *   A special function used to indicate to the cache manager that a given
     538     *   @FTC_FaceID is no longer valid, either because its content changed, or
     539     *   because it was deallocated or uninstalled.
     540     *
     541     * @input:
     542     *   manager ::
     543     *     The cache manager handle.
     544     *
     545     *   face_id ::
     546     *     The @FTC_FaceID to be removed.
     547     *
     548     * @note:
     549     *   This function flushes all nodes from the cache corresponding to this
     550     *   `face_id`, with the exception of nodes with a non-null reference
     551     *   count.
     552     *
     553     *   Such nodes are however modified internally so as to never appear in
     554     *   later lookups with the same `face_id` value, and to be immediately
     555     *   destroyed when released by all their users.
     556     *
     557     */
     558    FT_EXPORT( void )
     559    FTC_Manager_RemoveFaceID( FTC_Manager  manager,
     560                              FTC_FaceID   face_id );
     561  
     562  
     563    /**************************************************************************
     564     *
     565     * @type:
     566     *   FTC_CMapCache
     567     *
     568     * @description:
     569     *   An opaque handle used to model a charmap cache.  This cache is to hold
     570     *   character codes -> glyph indices mappings.
     571     *
     572     */
     573    typedef struct FTC_CMapCacheRec_*  FTC_CMapCache;
     574  
     575  
     576    /**************************************************************************
     577     *
     578     * @function:
     579     *   FTC_CMapCache_New
     580     *
     581     * @description:
     582     *   Create a new charmap cache.
     583     *
     584     * @input:
     585     *   manager ::
     586     *     A handle to the cache manager.
     587     *
     588     * @output:
     589     *   acache ::
     590     *     A new cache handle.  `NULL` in case of error.
     591     *
     592     * @return:
     593     *   FreeType error code.  0~means success.
     594     *
     595     * @note:
     596     *   Like all other caches, this one will be destroyed with the cache
     597     *   manager.
     598     *
     599     */
     600    FT_EXPORT( FT_Error )
     601    FTC_CMapCache_New( FTC_Manager     manager,
     602                       FTC_CMapCache  *acache );
     603  
     604  
     605    /**************************************************************************
     606     *
     607     * @function:
     608     *   FTC_CMapCache_Lookup
     609     *
     610     * @description:
     611     *   Translate a character code into a glyph index, using the charmap
     612     *   cache.
     613     *
     614     * @input:
     615     *   cache ::
     616     *     A charmap cache handle.
     617     *
     618     *   face_id ::
     619     *     The source face ID.
     620     *
     621     *   cmap_index ::
     622     *     The index of the charmap in the source face.  Any negative value
     623     *     means to use the cache @FT_Face's default charmap.
     624     *
     625     *   char_code ::
     626     *     The character code (in the corresponding charmap).
     627     *
     628     * @return:
     629     *    Glyph index.  0~means 'no glyph'.
     630     *
     631     */
     632    FT_EXPORT( FT_UInt )
     633    FTC_CMapCache_Lookup( FTC_CMapCache  cache,
     634                          FTC_FaceID     face_id,
     635                          FT_Int         cmap_index,
     636                          FT_UInt32      char_code );
     637  
     638  
     639    /*************************************************************************/
     640    /*************************************************************************/
     641    /*************************************************************************/
     642    /*****                                                               *****/
     643    /*****                       IMAGE CACHE OBJECT                      *****/
     644    /*****                                                               *****/
     645    /*************************************************************************/
     646    /*************************************************************************/
     647    /*************************************************************************/
     648  
     649  
     650    /**************************************************************************
     651     *
     652     * @struct:
     653     *   FTC_ImageTypeRec
     654     *
     655     * @description:
     656     *   A structure used to model the type of images in a glyph cache.
     657     *
     658     * @fields:
     659     *   face_id ::
     660     *     The face ID.
     661     *
     662     *   width ::
     663     *     The width in pixels.
     664     *
     665     *   height ::
     666     *     The height in pixels.
     667     *
     668     *   flags ::
     669     *     The load flags, as in @FT_Load_Glyph.
     670     *
     671     */
     672    typedef struct  FTC_ImageTypeRec_
     673    {
     674      FTC_FaceID  face_id;
     675      FT_UInt     width;
     676      FT_UInt     height;
     677      FT_Int32    flags;
     678  
     679    } FTC_ImageTypeRec;
     680  
     681  
     682    /**************************************************************************
     683     *
     684     * @type:
     685     *   FTC_ImageType
     686     *
     687     * @description:
     688     *   A handle to an @FTC_ImageTypeRec structure.
     689     *
     690     */
     691    typedef struct FTC_ImageTypeRec_*  FTC_ImageType;
     692  
     693  
     694    /* */
     695  
     696  
     697  #define FTC_IMAGE_TYPE_COMPARE( d1, d2 )      \
     698            ( (d1)->face_id == (d2)->face_id && \
     699              (d1)->width   == (d2)->width   && \
     700              (d1)->flags   == (d2)->flags   )
     701  
     702  
     703    /**************************************************************************
     704     *
     705     * @type:
     706     *   FTC_ImageCache
     707     *
     708     * @description:
     709     *   A handle to a glyph image cache object.  They are designed to hold
     710     *   many distinct glyph images while not exceeding a certain memory
     711     *   threshold.
     712     */
     713    typedef struct FTC_ImageCacheRec_*  FTC_ImageCache;
     714  
     715  
     716    /**************************************************************************
     717     *
     718     * @function:
     719     *   FTC_ImageCache_New
     720     *
     721     * @description:
     722     *   Create a new glyph image cache.
     723     *
     724     * @input:
     725     *   manager ::
     726     *     The parent manager for the image cache.
     727     *
     728     * @output:
     729     *   acache ::
     730     *     A handle to the new glyph image cache object.
     731     *
     732     * @return:
     733     *   FreeType error code.  0~means success.
     734     */
     735    FT_EXPORT( FT_Error )
     736    FTC_ImageCache_New( FTC_Manager      manager,
     737                        FTC_ImageCache  *acache );
     738  
     739  
     740    /**************************************************************************
     741     *
     742     * @function:
     743     *   FTC_ImageCache_Lookup
     744     *
     745     * @description:
     746     *   Retrieve a given glyph image from a glyph image cache.
     747     *
     748     * @input:
     749     *   cache ::
     750     *     A handle to the source glyph image cache.
     751     *
     752     *   type ::
     753     *     A pointer to a glyph image type descriptor.
     754     *
     755     *   gindex ::
     756     *     The glyph index to retrieve.
     757     *
     758     * @output:
     759     *   aglyph ::
     760     *     The corresponding @FT_Glyph object.  0~in case of failure.
     761     *
     762     *   anode ::
     763     *     Used to return the address of the corresponding cache node after
     764     *     incrementing its reference count (see note below).
     765     *
     766     * @return:
     767     *   FreeType error code.  0~means success.
     768     *
     769     * @note:
     770     *   The returned glyph is owned and managed by the glyph image cache.
     771     *   Never try to transform or discard it manually!  You can however create
     772     *   a copy with @FT_Glyph_Copy and modify the new one.
     773     *
     774     *   If `anode` is _not_ `NULL`, it receives the address of the cache node
     775     *   containing the glyph image, after increasing its reference count.
     776     *   This ensures that the node (as well as the @FT_Glyph) will always be
     777     *   kept in the cache until you call @FTC_Node_Unref to 'release' it.
     778     *
     779     *   If `anode` is `NULL`, the cache node is left unchanged, which means
     780     *   that the @FT_Glyph could be flushed out of the cache on the next call
     781     *   to one of the caching sub-system APIs.  Don't assume that it is
     782     *   persistent!
     783     */
     784    FT_EXPORT( FT_Error )
     785    FTC_ImageCache_Lookup( FTC_ImageCache  cache,
     786                           FTC_ImageType   type,
     787                           FT_UInt         gindex,
     788                           FT_Glyph       *aglyph,
     789                           FTC_Node       *anode );
     790  
     791  
     792    /**************************************************************************
     793     *
     794     * @function:
     795     *   FTC_ImageCache_LookupScaler
     796     *
     797     * @description:
     798     *   A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec to
     799     *   specify the face ID and its size.
     800     *
     801     * @input:
     802     *   cache ::
     803     *     A handle to the source glyph image cache.
     804     *
     805     *   scaler ::
     806     *     A pointer to a scaler descriptor.
     807     *
     808     *   load_flags ::
     809     *     The corresponding load flags.
     810     *
     811     *   gindex ::
     812     *     The glyph index to retrieve.
     813     *
     814     * @output:
     815     *   aglyph ::
     816     *     The corresponding @FT_Glyph object.  0~in case of failure.
     817     *
     818     *   anode ::
     819     *     Used to return the address of the corresponding cache node after
     820     *     incrementing its reference count (see note below).
     821     *
     822     * @return:
     823     *   FreeType error code.  0~means success.
     824     *
     825     * @note:
     826     *   The returned glyph is owned and managed by the glyph image cache.
     827     *   Never try to transform or discard it manually!  You can however create
     828     *   a copy with @FT_Glyph_Copy and modify the new one.
     829     *
     830     *   If `anode` is _not_ `NULL`, it receives the address of the cache node
     831     *   containing the glyph image, after increasing its reference count.
     832     *   This ensures that the node (as well as the @FT_Glyph) will always be
     833     *   kept in the cache until you call @FTC_Node_Unref to 'release' it.
     834     *
     835     *   If `anode` is `NULL`, the cache node is left unchanged, which means
     836     *   that the @FT_Glyph could be flushed out of the cache on the next call
     837     *   to one of the caching sub-system APIs.  Don't assume that it is
     838     *   persistent!
     839     *
     840     *   Calls to @FT_Set_Char_Size and friends have no effect on cached
     841     *   glyphs; you should always use the FreeType cache API instead.
     842     */
     843    FT_EXPORT( FT_Error )
     844    FTC_ImageCache_LookupScaler( FTC_ImageCache  cache,
     845                                 FTC_Scaler      scaler,
     846                                 FT_ULong        load_flags,
     847                                 FT_UInt         gindex,
     848                                 FT_Glyph       *aglyph,
     849                                 FTC_Node       *anode );
     850  
     851  
     852    /**************************************************************************
     853     *
     854     * @type:
     855     *   FTC_SBit
     856     *
     857     * @description:
     858     *   A handle to a small bitmap descriptor.  See the @FTC_SBitRec structure
     859     *   for details.
     860     */
     861    typedef struct FTC_SBitRec_*  FTC_SBit;
     862  
     863  
     864    /**************************************************************************
     865     *
     866     * @struct:
     867     *   FTC_SBitRec
     868     *
     869     * @description:
     870     *   A very compact structure used to describe a small glyph bitmap.
     871     *
     872     * @fields:
     873     *   width ::
     874     *     The bitmap width in pixels.
     875     *
     876     *   height ::
     877     *     The bitmap height in pixels.
     878     *
     879     *   left ::
     880     *     The horizontal distance from the pen position to the left bitmap
     881     *     border (a.k.a. 'left side bearing', or 'lsb').
     882     *
     883     *   top ::
     884     *     The vertical distance from the pen position (on the baseline) to the
     885     *     upper bitmap border (a.k.a. 'top side bearing').  The distance is
     886     *     positive for upwards y~coordinates.
     887     *
     888     *   format ::
     889     *     The format of the glyph bitmap (monochrome or gray).
     890     *
     891     *   max_grays ::
     892     *     Maximum gray level value (in the range 1 to~255).
     893     *
     894     *   pitch ::
     895     *     The number of bytes per bitmap line.  May be positive or negative.
     896     *
     897     *   xadvance ::
     898     *     The horizontal advance width in pixels.
     899     *
     900     *   yadvance ::
     901     *     The vertical advance height in pixels.
     902     *
     903     *   buffer ::
     904     *     A pointer to the bitmap pixels.
     905     */
     906    typedef struct  FTC_SBitRec_
     907    {
     908      FT_Byte   width;
     909      FT_Byte   height;
     910      FT_Char   left;
     911      FT_Char   top;
     912  
     913      FT_Byte   format;
     914      FT_Byte   max_grays;
     915      FT_Short  pitch;
     916      FT_Char   xadvance;
     917      FT_Char   yadvance;
     918  
     919      FT_Byte*  buffer;
     920  
     921    } FTC_SBitRec;
     922  
     923  
     924    /**************************************************************************
     925     *
     926     * @type:
     927     *   FTC_SBitCache
     928     *
     929     * @description:
     930     *   A handle to a small bitmap cache.  These are special cache objects
     931     *   used to store small glyph bitmaps (and anti-aliased pixmaps) in a much
     932     *   more efficient way than the traditional glyph image cache implemented
     933     *   by @FTC_ImageCache.
     934     */
     935    typedef struct FTC_SBitCacheRec_*  FTC_SBitCache;
     936  
     937  
     938    /**************************************************************************
     939     *
     940     * @function:
     941     *   FTC_SBitCache_New
     942     *
     943     * @description:
     944     *   Create a new cache to store small glyph bitmaps.
     945     *
     946     * @input:
     947     *   manager ::
     948     *     A handle to the source cache manager.
     949     *
     950     * @output:
     951     *   acache ::
     952     *     A handle to the new sbit cache.  `NULL` in case of error.
     953     *
     954     * @return:
     955     *   FreeType error code.  0~means success.
     956     */
     957    FT_EXPORT( FT_Error )
     958    FTC_SBitCache_New( FTC_Manager     manager,
     959                       FTC_SBitCache  *acache );
     960  
     961  
     962    /**************************************************************************
     963     *
     964     * @function:
     965     *   FTC_SBitCache_Lookup
     966     *
     967     * @description:
     968     *   Look up a given small glyph bitmap in a given sbit cache and 'lock' it
     969     *   to prevent its flushing from the cache until needed.
     970     *
     971     * @input:
     972     *   cache ::
     973     *     A handle to the source sbit cache.
     974     *
     975     *   type ::
     976     *     A pointer to the glyph image type descriptor.
     977     *
     978     *   gindex ::
     979     *     The glyph index.
     980     *
     981     * @output:
     982     *   sbit ::
     983     *     A handle to a small bitmap descriptor.
     984     *
     985     *   anode ::
     986     *     Used to return the address of the corresponding cache node after
     987     *     incrementing its reference count (see note below).
     988     *
     989     * @return:
     990     *   FreeType error code.  0~means success.
     991     *
     992     * @note:
     993     *   The small bitmap descriptor and its bit buffer are owned by the cache
     994     *   and should never be freed by the application.  They might as well
     995     *   disappear from memory on the next cache lookup, so don't treat them as
     996     *   persistent data.
     997     *
     998     *   The descriptor's `buffer` field is set to~0 to indicate a missing
     999     *   glyph bitmap.
    1000     *
    1001     *   If `anode` is _not_ `NULL`, it receives the address of the cache node
    1002     *   containing the bitmap, after increasing its reference count.  This
    1003     *   ensures that the node (as well as the image) will always be kept in
    1004     *   the cache until you call @FTC_Node_Unref to 'release' it.
    1005     *
    1006     *   If `anode` is `NULL`, the cache node is left unchanged, which means
    1007     *   that the bitmap could be flushed out of the cache on the next call to
    1008     *   one of the caching sub-system APIs.  Don't assume that it is
    1009     *   persistent!
    1010     */
    1011    FT_EXPORT( FT_Error )
    1012    FTC_SBitCache_Lookup( FTC_SBitCache    cache,
    1013                          FTC_ImageType    type,
    1014                          FT_UInt          gindex,
    1015                          FTC_SBit        *sbit,
    1016                          FTC_Node        *anode );
    1017  
    1018  
    1019    /**************************************************************************
    1020     *
    1021     * @function:
    1022     *   FTC_SBitCache_LookupScaler
    1023     *
    1024     * @description:
    1025     *   A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec to
    1026     *   specify the face ID and its size.
    1027     *
    1028     * @input:
    1029     *   cache ::
    1030     *     A handle to the source sbit cache.
    1031     *
    1032     *   scaler ::
    1033     *     A pointer to the scaler descriptor.
    1034     *
    1035     *   load_flags ::
    1036     *     The corresponding load flags.
    1037     *
    1038     *   gindex ::
    1039     *     The glyph index.
    1040     *
    1041     * @output:
    1042     *   sbit ::
    1043     *     A handle to a small bitmap descriptor.
    1044     *
    1045     *   anode ::
    1046     *     Used to return the address of the corresponding cache node after
    1047     *     incrementing its reference count (see note below).
    1048     *
    1049     * @return:
    1050     *   FreeType error code.  0~means success.
    1051     *
    1052     * @note:
    1053     *   The small bitmap descriptor and its bit buffer are owned by the cache
    1054     *   and should never be freed by the application.  They might as well
    1055     *   disappear from memory on the next cache lookup, so don't treat them as
    1056     *   persistent data.
    1057     *
    1058     *   The descriptor's `buffer` field is set to~0 to indicate a missing
    1059     *   glyph bitmap.
    1060     *
    1061     *   If `anode` is _not_ `NULL`, it receives the address of the cache node
    1062     *   containing the bitmap, after increasing its reference count.  This
    1063     *   ensures that the node (as well as the image) will always be kept in
    1064     *   the cache until you call @FTC_Node_Unref to 'release' it.
    1065     *
    1066     *   If `anode` is `NULL`, the cache node is left unchanged, which means
    1067     *   that the bitmap could be flushed out of the cache on the next call to
    1068     *   one of the caching sub-system APIs.  Don't assume that it is
    1069     *   persistent!
    1070     */
    1071    FT_EXPORT( FT_Error )
    1072    FTC_SBitCache_LookupScaler( FTC_SBitCache  cache,
    1073                                FTC_Scaler     scaler,
    1074                                FT_ULong       load_flags,
    1075                                FT_UInt        gindex,
    1076                                FTC_SBit      *sbit,
    1077                                FTC_Node      *anode );
    1078  
    1079    /* */
    1080  
    1081  
    1082  FT_END_HEADER
    1083  
    1084  #endif /* FTCACHE_H_ */
    1085  
    1086  
    1087  /* END */