1 /**************************************************************************** 2 * 3 * ftcimage.c 4 * 5 * FreeType Image cache (body). 6 * 7 * Copyright (C) 2000-2020 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_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_Offset)FT_ABS( 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 = (FT_Offset)outg->outline.n_points * 137 ( sizeof ( FT_Vector ) + sizeof ( FT_Byte ) ) + 138 (FT_Offset)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