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