1/****************************************************************************
2 *
3 * ftcimage.c
4 *
5 * FreeType Image cache (body).
6 *
7 * Copyright (C) 2000-2023 by
8 * David Turner, Robert Wilhelm, and Werner Lemberg.
9 *
10 * This file is part of the FreeType project, and may only be used,
11 * modified, and distributed under the terms of the FreeType project
12 * license, LICENSE.TXT. By continuing to use, modify, or distribute
13 * this file you indicate that you have read the license and
14 * understand and accept it fully.
15 *
16 */
17
18
19#include <freetype/ftcache.h>
20#include "ftcimage.h"
21#include <freetype/internal/ftmemory.h>
22#include <freetype/internal/ftobjs.h>
23
24#include "ftccback.h"
25#include "ftcerror.h"
26
27
28 /* finalize a given glyph image node */
29 FT_LOCAL_DEF( void )
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 )
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 )
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;
64 FTC_INode inode = NULL;
65
66
67 if ( !FT_QNEW( 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 inode->glyph = NULL;
78
79 /* we will now load the glyph image */
80 error = clazz->family_load_glyph( family, gindex, cache,
81 &inode->glyph );
82 if ( error )
83 {
84 FTC_INode_Free( inode, cache );
85 inode = NULL;
86 }
87 }
88
89 *pinode = inode;
90 return error;
91 }
92
93
94 FT_LOCAL_DEF( FT_Error )
95 ftc_inode_new( FTC_Node *ftcpinode,
96 FT_Pointer ftcgquery,
97 FTC_Cache cache )
98 {
99 FTC_INode *pinode = (FTC_INode*)ftcpinode;
100 FTC_GQuery gquery = (FTC_GQuery)ftcgquery;
101
102
103 return FTC_INode_New( pinode, gquery, cache );
104 }
105
106
107 FT_LOCAL_DEF( FT_Offset )
108 ftc_inode_weight( FTC_Node ftcinode,
109 FTC_Cache ftccache )
110 {
111 FTC_INode inode = (FTC_INode)ftcinode;
112 FT_Offset size = 0;
113 FT_Glyph glyph = inode->glyph;
114
115 FT_UNUSED( ftccache );
116
117
118 switch ( glyph->format )
119 {
120 case FT_GLYPH_FORMAT_BITMAP:
121 {
122 FT_BitmapGlyph bitg;
123
124
125 bitg = (FT_BitmapGlyph)glyph;
126 size = bitg->bitmap.rows * (FT_Offset)FT_ABS( bitg->bitmap.pitch ) +
127 sizeof ( *bitg );
128 }
129 break;
130
131 case FT_GLYPH_FORMAT_OUTLINE:
132 {
133 FT_OutlineGlyph outg;
134
135
136 outg = (FT_OutlineGlyph)glyph;
137 size = (FT_Offset)outg->outline.n_points *
138 ( sizeof ( FT_Vector ) + sizeof ( FT_Byte ) ) +
139 (FT_Offset)outg->outline.n_contours * sizeof ( FT_Short ) +
140 sizeof ( *outg );
141 }
142 break;
143
144 default:
145 ;
146 }
147
148 size += sizeof ( *inode );
149 return size;
150 }
151
152
153#if 0
154
155 FT_LOCAL_DEF( FT_Offset )
156 FTC_INode_Weight( FTC_INode inode )
157 {
158 return ftc_inode_weight( FTC_NODE( inode ), NULL );
159 }
160
161#endif /* 0 */
162
163
164/* END */
165