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 ) 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; 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 ) ftc_inode_new(FTC_Node * ftcpinode,FT_Pointer ftcgquery,FTC_Cache cache)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 ) ftc_inode_weight(FTC_Node ftcinode,FTC_Cache ftccache)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