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