xref: /inferno-os/include/freetype/cache/ftcglyph.h (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth /***************************************************************************/
2*37da2899SCharles.Forsyth /*                                                                         */
3*37da2899SCharles.Forsyth /*  ftcglyph.h                                                             */
4*37da2899SCharles.Forsyth /*                                                                         */
5*37da2899SCharles.Forsyth /*    FreeType abstract glyph cache (specification).                       */
6*37da2899SCharles.Forsyth /*                                                                         */
7*37da2899SCharles.Forsyth /*  Copyright 2000-2001 by                                                 */
8*37da2899SCharles.Forsyth /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9*37da2899SCharles.Forsyth /*                                                                         */
10*37da2899SCharles.Forsyth /*  This file is part of the FreeType project, and may only be used,       */
11*37da2899SCharles.Forsyth /*  modified, and distributed under the terms of the FreeType project      */
12*37da2899SCharles.Forsyth /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13*37da2899SCharles.Forsyth /*  this file you indicate that you have read the license and              */
14*37da2899SCharles.Forsyth /*  understand and accept it fully.                                        */
15*37da2899SCharles.Forsyth /*                                                                         */
16*37da2899SCharles.Forsyth /***************************************************************************/
17*37da2899SCharles.Forsyth 
18*37da2899SCharles.Forsyth 
19*37da2899SCharles.Forsyth   /*************************************************************************/
20*37da2899SCharles.Forsyth   /*                                                                       */
21*37da2899SCharles.Forsyth   /* Important: The functions defined in this file are only used to        */
22*37da2899SCharles.Forsyth   /*            implement an abstract glyph cache class.  You need to      */
23*37da2899SCharles.Forsyth   /*            provide additional logic to implement a complete cache.    */
24*37da2899SCharles.Forsyth   /*            For example, see `ftcimage.h' and `ftcimage.c' which       */
25*37da2899SCharles.Forsyth   /*            implement a FT_Glyph cache based on this code.             */
26*37da2899SCharles.Forsyth   /*                                                                       */
27*37da2899SCharles.Forsyth   /*************************************************************************/
28*37da2899SCharles.Forsyth 
29*37da2899SCharles.Forsyth 
30*37da2899SCharles.Forsyth   /*************************************************************************/
31*37da2899SCharles.Forsyth   /*************************************************************************/
32*37da2899SCharles.Forsyth   /*************************************************************************/
33*37da2899SCharles.Forsyth   /*************************************************************************/
34*37da2899SCharles.Forsyth   /*************************************************************************/
35*37da2899SCharles.Forsyth   /*********                                                       *********/
36*37da2899SCharles.Forsyth   /*********             WARNING, THIS IS BETA CODE.               *********/
37*37da2899SCharles.Forsyth   /*********                                                       *********/
38*37da2899SCharles.Forsyth   /*************************************************************************/
39*37da2899SCharles.Forsyth   /*************************************************************************/
40*37da2899SCharles.Forsyth   /*************************************************************************/
41*37da2899SCharles.Forsyth   /*************************************************************************/
42*37da2899SCharles.Forsyth   /*************************************************************************/
43*37da2899SCharles.Forsyth 
44*37da2899SCharles.Forsyth 
45*37da2899SCharles.Forsyth #ifndef __FTCGLYPH_H__
46*37da2899SCharles.Forsyth #define __FTCGLYPH_H__
47*37da2899SCharles.Forsyth 
48*37da2899SCharles.Forsyth 
49*37da2899SCharles.Forsyth #include <ft2build.h>
50*37da2899SCharles.Forsyth #include FT_CACHE_H
51*37da2899SCharles.Forsyth #include FT_CACHE_MANAGER_H
52*37da2899SCharles.Forsyth 
53*37da2899SCharles.Forsyth #include <stddef.h>
54*37da2899SCharles.Forsyth 
55*37da2899SCharles.Forsyth 
56*37da2899SCharles.Forsyth FT_BEGIN_HEADER
57*37da2899SCharles.Forsyth 
58*37da2899SCharles.Forsyth 
59*37da2899SCharles.Forsyth   /* each glyph set is characterized by a "glyph set type" which must be */
60*37da2899SCharles.Forsyth   /* defined by sub-classes                                              */
61*37da2899SCharles.Forsyth   typedef struct FTC_GlyphFamilyRec_*  FTC_GlyphFamily;
62*37da2899SCharles.Forsyth 
63*37da2899SCharles.Forsyth   /* handle to a glyph cache node */
64*37da2899SCharles.Forsyth   typedef struct FTC_GlyphNodeRec_*  FTC_GlyphNode;
65*37da2899SCharles.Forsyth 
66*37da2899SCharles.Forsyth 
67*37da2899SCharles.Forsyth   /* size should be 24 + chunk size on 32-bit machines;                 */
68*37da2899SCharles.Forsyth   /* note that the node's hash is ((gfam->hash << 16) | glyph_index) -- */
69*37da2899SCharles.Forsyth   /* this _must_ be set properly by the glyph node initializer          */
70*37da2899SCharles.Forsyth   /*                                                                    */
71*37da2899SCharles.Forsyth   typedef struct  FTC_GlyphNodeRec_
72*37da2899SCharles.Forsyth   {
73*37da2899SCharles.Forsyth     FTC_NodeRec   node;
74*37da2899SCharles.Forsyth     FT_UShort     item_count;
75*37da2899SCharles.Forsyth     FT_UShort     item_start;
76*37da2899SCharles.Forsyth 
77*37da2899SCharles.Forsyth   } FTC_GlyphNodeRec;
78*37da2899SCharles.Forsyth 
79*37da2899SCharles.Forsyth 
80*37da2899SCharles.Forsyth #define FTC_GLYPH_NODE( x )    ( (FTC_GlyphNode)(x) )
81*37da2899SCharles.Forsyth #define FTC_GLYPH_NODE_P( x )  ( (FTC_GlyphNode*)(x) )
82*37da2899SCharles.Forsyth 
83*37da2899SCharles.Forsyth 
84*37da2899SCharles.Forsyth   typedef struct  FTC_GlyphQueryRec_
85*37da2899SCharles.Forsyth   {
86*37da2899SCharles.Forsyth     FTC_QueryRec  query;
87*37da2899SCharles.Forsyth     FT_UInt       gindex;
88*37da2899SCharles.Forsyth 
89*37da2899SCharles.Forsyth   } FTC_GlyphQueryRec, *FTC_GlyphQuery;
90*37da2899SCharles.Forsyth 
91*37da2899SCharles.Forsyth 
92*37da2899SCharles.Forsyth #define FTC_GLYPH_QUERY( x )  ( (FTC_GlyphQuery)(x) )
93*37da2899SCharles.Forsyth 
94*37da2899SCharles.Forsyth 
95*37da2899SCharles.Forsyth   /* a glyph set is used to categorize glyphs of a given type */
96*37da2899SCharles.Forsyth   typedef struct  FTC_GlyphFamilyRec_
97*37da2899SCharles.Forsyth   {
98*37da2899SCharles.Forsyth     FTC_FamilyRec  family;
99*37da2899SCharles.Forsyth     FT_UInt32      hash;
100*37da2899SCharles.Forsyth     FT_UInt        item_total;   /* total number of glyphs in family */
101*37da2899SCharles.Forsyth     FT_UInt        item_count;   /* number of glyph items per node   */
102*37da2899SCharles.Forsyth 
103*37da2899SCharles.Forsyth   } FTC_GlyphFamilyRec;
104*37da2899SCharles.Forsyth 
105*37da2899SCharles.Forsyth 
106*37da2899SCharles.Forsyth #define FTC_GLYPH_FAMILY( x )         ( (FTC_GlyphFamily)(x) )
107*37da2899SCharles.Forsyth #define FTC_GLYPH_FAMILY_P( x )       ( (FTC_GlyphFamily*)(x) )
108*37da2899SCharles.Forsyth 
109*37da2899SCharles.Forsyth #define FTC_GLYPH_FAMILY_MEMORY( x )  FTC_FAMILY(x)->cache->memory
110*37da2899SCharles.Forsyth 
111*37da2899SCharles.Forsyth 
112*37da2899SCharles.Forsyth   /* each glyph node contains a 'chunk' of glyph items; */
113*37da2899SCharles.Forsyth   /* translate a glyph index into a chunk index         */
114*37da2899SCharles.Forsyth #define FTC_GLYPH_FAMILY_CHUNK( gfam, gindex )                  \
115*37da2899SCharles.Forsyth           ( ( gindex ) / FTC_GLYPH_FAMILY( gfam )->item_count )
116*37da2899SCharles.Forsyth 
117*37da2899SCharles.Forsyth   /* find a glyph index's chunk, and return its start index */
118*37da2899SCharles.Forsyth #define FTC_GLYPH_FAMILY_START( gfam, gindex )       \
119*37da2899SCharles.Forsyth           ( FTC_GLYPH_FAMILY_CHUNK( gfam, gindex ) * \
120*37da2899SCharles.Forsyth             FTC_GLYPH_FAMILY( gfam )->item_count )
121*37da2899SCharles.Forsyth 
122*37da2899SCharles.Forsyth   /* compute a glyph request's hash value */
123*37da2899SCharles.Forsyth #define FTC_GLYPH_FAMILY_HASH( gfam, gindex )                         \
124*37da2899SCharles.Forsyth           ( (FT_UFast)(                                               \
125*37da2899SCharles.Forsyth               ( FTC_GLYPH_FAMILY( gfam )->hash << 16 ) |              \
126*37da2899SCharles.Forsyth               ( FTC_GLYPH_FAMILY_CHUNK( gfam, gindex ) & 0xFFFF ) ) )
127*37da2899SCharles.Forsyth 
128*37da2899SCharles.Forsyth   /* must be called in an FTC_Family_CompareFunc to update the query */
129*37da2899SCharles.Forsyth   /* whenever a glyph set is matched in the lookup, or when it       */
130*37da2899SCharles.Forsyth   /* is created                                                      */
131*37da2899SCharles.Forsyth #define FTC_GLYPH_FAMILY_FOUND( gfam, gquery )                            \
132*37da2899SCharles.Forsyth           do                                                              \
133*37da2899SCharles.Forsyth           {                                                               \
134*37da2899SCharles.Forsyth             FTC_QUERY( gquery )->family = FTC_FAMILY( gfam );             \
135*37da2899SCharles.Forsyth             FTC_QUERY( gquery )->hash =                                   \
136*37da2899SCharles.Forsyth               FTC_GLYPH_FAMILY_HASH( gfam,                                \
137*37da2899SCharles.Forsyth                                      FTC_GLYPH_QUERY( gquery )->gindex ); \
138*37da2899SCharles.Forsyth           } while ( 0 )
139*37da2899SCharles.Forsyth 
140*37da2899SCharles.Forsyth   /* retrieve glyph index of glyph node */
141*37da2899SCharles.Forsyth #define FTC_GLYPH_NODE_GINDEX( x )                                 \
142*37da2899SCharles.Forsyth           ( (FT_UInt)( FTC_GLYPH_NODE( x )->node.hash & 0xFFFF ) )
143*37da2899SCharles.Forsyth 
144*37da2899SCharles.Forsyth 
145*37da2899SCharles.Forsyth   /*************************************************************************/
146*37da2899SCharles.Forsyth   /*                                                                       */
147*37da2899SCharles.Forsyth   /* These functions are exported so that they can be called from          */
148*37da2899SCharles.Forsyth   /* user-provided cache classes; otherwise, they are really part of the   */
149*37da2899SCharles.Forsyth   /* cache sub-system internals.                                           */
150*37da2899SCharles.Forsyth   /*                                                                       */
151*37da2899SCharles.Forsyth 
152*37da2899SCharles.Forsyth   /* must be called by derived FTC_Node_InitFunc routines */
153*37da2899SCharles.Forsyth   FT_EXPORT( void )
154*37da2899SCharles.Forsyth   ftc_glyph_node_init( FTC_GlyphNode    node,
155*37da2899SCharles.Forsyth                        FT_UInt          gindex,  /* glyph index for node */
156*37da2899SCharles.Forsyth                        FTC_GlyphFamily  gfam );
157*37da2899SCharles.Forsyth 
158*37da2899SCharles.Forsyth   /* returns TRUE iff the query's glyph index correspond to the node;  */
159*37da2899SCharles.Forsyth   /* this assumes that the "family" and "hash" fields of the query are */
160*37da2899SCharles.Forsyth   /* already correctly set                                             */
161*37da2899SCharles.Forsyth   FT_EXPORT( FT_Bool )
162*37da2899SCharles.Forsyth   ftc_glyph_node_compare( FTC_GlyphNode   gnode,
163*37da2899SCharles.Forsyth                           FTC_GlyphQuery  gquery );
164*37da2899SCharles.Forsyth 
165*37da2899SCharles.Forsyth   /* must be called by derived FTC_Node_DoneFunc routines */
166*37da2899SCharles.Forsyth   FT_EXPORT( void )
167*37da2899SCharles.Forsyth   ftc_glyph_node_done( FTC_GlyphNode  node,
168*37da2899SCharles.Forsyth                        FTC_Cache      cache );
169*37da2899SCharles.Forsyth 
170*37da2899SCharles.Forsyth 
171*37da2899SCharles.Forsyth   /* must be called by derived FTC_Family_InitFunc; */
172*37da2899SCharles.Forsyth   /* calls "ftc_family_init"                        */
173*37da2899SCharles.Forsyth   FT_EXPORT( FT_Error )
174*37da2899SCharles.Forsyth   ftc_glyph_family_init( FTC_GlyphFamily  gfam,
175*37da2899SCharles.Forsyth                          FT_UInt32        hash,
176*37da2899SCharles.Forsyth                          FT_UInt          item_count,
177*37da2899SCharles.Forsyth                          FT_UInt          item_total,
178*37da2899SCharles.Forsyth                          FTC_GlyphQuery   gquery,
179*37da2899SCharles.Forsyth                          FTC_Cache        cache );
180*37da2899SCharles.Forsyth 
181*37da2899SCharles.Forsyth   FT_EXPORT( void )
182*37da2899SCharles.Forsyth   ftc_glyph_family_done( FTC_GlyphFamily  gfam );
183*37da2899SCharles.Forsyth 
184*37da2899SCharles.Forsyth 
185*37da2899SCharles.Forsyth   /* */
186*37da2899SCharles.Forsyth 
187*37da2899SCharles.Forsyth FT_END_HEADER
188*37da2899SCharles.Forsyth 
189*37da2899SCharles.Forsyth 
190*37da2899SCharles.Forsyth #endif /* __FTCGLYPH_H__ */
191*37da2899SCharles.Forsyth 
192*37da2899SCharles.Forsyth 
193*37da2899SCharles.Forsyth /* END */
194