1 /***************************************************************************/
2 /*                                                                         */
3 /*  ftcimage.c                                                             */
4 /*                                                                         */
5 /*    FreeType Image cache (body).                                         */
6 /*                                                                         */
7 /*  Copyright 2000-2001, 2003, 2004, 2006, 2010 by                         */
8 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9 /*                                                                         */
10 /*  This file is part of the FreeType project, and may only be used,       */
11 /*  modified, and distributed under the terms of the FreeType project      */
12 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13 /*  this file you indicate that you have read the license and              */
14 /*  understand and accept it fully.                                        */
15 /*                                                                         */
16 /***************************************************************************/
17 
18 
19 #include <ft2build.h>
20 #include FT_CACHE_H
21 #include "ftcimage.h"
22 #include FT_INTERNAL_MEMORY_H
23 
24 #include "ftccback.h"
25 #include "ftcerror.h"
26 
27 
28   /* finalize a given glyph image node */
29   FT_LOCAL_DEF( void )
ftc_inode_free(FTC_Node ftcinode,FTC_Cache cache)30   ftc_inode_free( FTC_Node   ftcinode,
31                   FTC_Cache  cache )
32   {
33     FTC_INode  inode = (FTC_INode)ftcinode;
34     FT_Memory  memory = cache->memory;
35 
36 
37     if ( inode->glyph )
38     {
39       FT_Done_Glyph( inode->glyph );
40       inode->glyph = NULL;
41     }
42 
43     FTC_GNode_Done( FTC_GNODE( inode ), cache );
44     FT_FREE( inode );
45   }
46 
47 
48   FT_LOCAL_DEF( void )
FTC_INode_Free(FTC_INode inode,FTC_Cache cache)49   FTC_INode_Free( FTC_INode  inode,
50                   FTC_Cache  cache )
51   {
52     ftc_inode_free( FTC_NODE( inode ), cache );
53   }
54 
55 
56   /* initialize a new glyph image node */
57   FT_LOCAL_DEF( FT_Error )
FTC_INode_New(FTC_INode * pinode,FTC_GQuery gquery,FTC_Cache cache)58   FTC_INode_New( FTC_INode   *pinode,
59                  FTC_GQuery   gquery,
60                  FTC_Cache    cache )
61   {
62     FT_Memory  memory = cache->memory;
63     FT_Error   error = FT_Err_Ok;
64     FTC_INode  inode  = NULL;
65 
66 
67     if ( !FT_NEW( inode ) )
68     {
69       FTC_GNode         gnode  = FTC_GNODE( inode );
70       FTC_Family        family = gquery->family;
71       FT_UInt           gindex = gquery->gindex;
72       FTC_IFamilyClass  clazz  = FTC_CACHE__IFAMILY_CLASS( cache );
73 
74 
75       /* initialize its inner fields */
76       FTC_GNode_Init( gnode, gindex, family );
77 
78       /* we will now load the glyph image */
79       error = clazz->family_load_glyph( family, gindex, cache,
80                                         &inode->glyph );
81       if ( error )
82       {
83         FTC_INode_Free( inode, cache );
84         inode = NULL;
85       }
86     }
87 
88     *pinode = inode;
89     return error;
90   }
91 
92 
93   FT_LOCAL_DEF( FT_Error )
ftc_inode_new(FTC_Node * ftcpinode,FT_Pointer ftcgquery,FTC_Cache cache)94   ftc_inode_new( FTC_Node   *ftcpinode,
95                  FT_Pointer  ftcgquery,
96                  FTC_Cache   cache )
97   {
98     FTC_INode  *pinode = (FTC_INode*)ftcpinode;
99     FTC_GQuery  gquery = (FTC_GQuery)ftcgquery;
100 
101 
102     return FTC_INode_New( pinode, gquery, cache );
103   }
104 
105 
106   FT_LOCAL_DEF( FT_Offset )
ftc_inode_weight(FTC_Node ftcinode,FTC_Cache ftccache)107   ftc_inode_weight( FTC_Node   ftcinode,
108                     FTC_Cache  ftccache )
109   {
110     FTC_INode  inode = (FTC_INode)ftcinode;
111     FT_Offset  size  = 0;
112     FT_Glyph   glyph = inode->glyph;
113 
114     FT_UNUSED( ftccache );
115 
116 
117     switch ( glyph->format )
118     {
119     case FT_GLYPH_FORMAT_BITMAP:
120       {
121         FT_BitmapGlyph  bitg;
122 
123 
124         bitg = (FT_BitmapGlyph)glyph;
125         size = bitg->bitmap.rows * ft_labs( bitg->bitmap.pitch ) +
126                sizeof ( *bitg );
127       }
128       break;
129 
130     case FT_GLYPH_FORMAT_OUTLINE:
131       {
132         FT_OutlineGlyph  outg;
133 
134 
135         outg = (FT_OutlineGlyph)glyph;
136         size = outg->outline.n_points *
137                  ( sizeof ( FT_Vector ) + sizeof ( FT_Byte ) ) +
138                outg->outline.n_contours * sizeof ( FT_Short ) +
139                sizeof ( *outg );
140       }
141       break;
142 
143     default:
144       ;
145     }
146 
147     size += sizeof ( *inode );
148     return size;
149   }
150 
151 
152 #if 0
153 
154   FT_LOCAL_DEF( FT_Offset )
155   FTC_INode_Weight( FTC_INode  inode )
156   {
157     return ftc_inode_weight( FTC_NODE( inode ), NULL );
158   }
159 
160 #endif /* 0 */
161 
162 
163 /* END */
164