1 /***************************************************************************/ 2 /* */ 3 /* ttpload.c */ 4 /* */ 5 /* TrueType glyph data/program tables loader (body). */ 6 /* */ 7 /* Copyright 1996-2001, 2002 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_INTERNAL_DEBUG_H 21 #include FT_INTERNAL_OBJECTS_H 22 #include FT_INTERNAL_STREAM_H 23 #include FT_TRUETYPE_TAGS_H 24 25 #include "ttpload.h" 26 27 #include "tterrors.h" 28 29 30 /*************************************************************************/ 31 /* */ 32 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 33 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 34 /* messages during execution. */ 35 /* */ 36 #undef FT_COMPONENT 37 #define FT_COMPONENT trace_ttpload 38 39 40 /*************************************************************************/ 41 /* */ 42 /* <Function> */ 43 /* tt_face_load_loca */ 44 /* */ 45 /* <Description> */ 46 /* Loads the locations table. */ 47 /* */ 48 /* <InOut> */ 49 /* face :: A handle to the target face object. */ 50 /* */ 51 /* <Input> */ 52 /* stream :: The input stream. */ 53 /* */ 54 /* <Return> */ 55 /* FreeType error code. 0 means success. */ 56 /* */ 57 FT_LOCAL_DEF( FT_Error ) tt_face_load_loca(TT_Face face,FT_Stream stream)58 tt_face_load_loca( TT_Face face, 59 FT_Stream stream ) 60 { 61 FT_Error error; 62 FT_Memory memory = stream->memory; 63 FT_Short LongOffsets; 64 FT_ULong table_len; 65 66 67 FT_TRACE2(( "Locations " )); 68 LongOffsets = face->header.Index_To_Loc_Format; 69 70 error = face->goto_table( face, TTAG_loca, stream, &table_len ); 71 if ( error ) 72 { 73 error = TT_Err_Locations_Missing; 74 goto Exit; 75 } 76 77 if ( LongOffsets != 0 ) 78 { 79 face->num_locations = (FT_UShort)( table_len >> 2 ); 80 81 FT_TRACE2(( "(32bit offsets): %12d ", face->num_locations )); 82 83 if ( FT_NEW_ARRAY( face->glyph_locations, face->num_locations ) ) 84 goto Exit; 85 86 if ( FT_FRAME_ENTER( face->num_locations * 4L ) ) 87 goto Exit; 88 89 { 90 FT_Long* loc = face->glyph_locations; 91 FT_Long* limit = loc + face->num_locations; 92 93 94 for ( ; loc < limit; loc++ ) 95 *loc = FT_GET_LONG(); 96 } 97 98 FT_FRAME_EXIT(); 99 } 100 else 101 { 102 face->num_locations = (FT_UShort)( table_len >> 1 ); 103 104 FT_TRACE2(( "(16bit offsets): %12d ", face->num_locations )); 105 106 if ( FT_NEW_ARRAY( face->glyph_locations, face->num_locations ) ) 107 goto Exit; 108 109 if ( FT_FRAME_ENTER( face->num_locations * 2L ) ) 110 goto Exit; 111 { 112 FT_Long* loc = face->glyph_locations; 113 FT_Long* limit = loc + face->num_locations; 114 115 116 for ( ; loc < limit; loc++ ) 117 *loc = (FT_Long)( (FT_ULong)FT_GET_USHORT() * 2 ); 118 } 119 FT_FRAME_EXIT(); 120 } 121 122 FT_TRACE2(( "loaded\n" )); 123 124 Exit: 125 return error; 126 } 127 128 129 /*************************************************************************/ 130 /* */ 131 /* <Function> */ 132 /* tt_face_load_cvt */ 133 /* */ 134 /* <Description> */ 135 /* Loads the control value table into a face object. */ 136 /* */ 137 /* <InOut> */ 138 /* face :: A handle to the target face object. */ 139 /* */ 140 /* <Input> */ 141 /* stream :: A handle to the input stream. */ 142 /* */ 143 /* <Return> */ 144 /* FreeType error code. 0 means success. */ 145 /* */ 146 FT_LOCAL_DEF( FT_Error ) tt_face_load_cvt(TT_Face face,FT_Stream stream)147 tt_face_load_cvt( TT_Face face, 148 FT_Stream stream ) 149 { 150 FT_Error error; 151 FT_Memory memory = stream->memory; 152 FT_ULong table_len; 153 154 155 FT_TRACE2(( "CVT " )); 156 157 error = face->goto_table( face, TTAG_cvt, stream, &table_len ); 158 if ( error ) 159 { 160 FT_TRACE2(( "is missing!\n" )); 161 162 face->cvt_size = 0; 163 face->cvt = NULL; 164 error = TT_Err_Ok; 165 166 goto Exit; 167 } 168 169 face->cvt_size = table_len / 2; 170 171 if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) ) 172 goto Exit; 173 174 if ( FT_FRAME_ENTER( face->cvt_size * 2L ) ) 175 goto Exit; 176 177 { 178 FT_Short* cur = face->cvt; 179 FT_Short* limit = cur + face->cvt_size; 180 181 182 for ( ; cur < limit; cur++ ) 183 *cur = FT_GET_SHORT(); 184 } 185 186 FT_FRAME_EXIT(); 187 FT_TRACE2(( "loaded\n" )); 188 189 Exit: 190 return error; 191 } 192 193 194 /*************************************************************************/ 195 /* */ 196 /* <Function> */ 197 /* tt_face_load_fpgm */ 198 /* */ 199 /* <Description> */ 200 /* Loads the font program and the cvt program. */ 201 /* */ 202 /* <InOut> */ 203 /* face :: A handle to the target face object. */ 204 /* */ 205 /* <Input> */ 206 /* stream :: A handle to the input stream. */ 207 /* */ 208 /* <Return> */ 209 /* FreeType error code. 0 means success. */ 210 /* */ 211 FT_LOCAL_DEF( FT_Error ) tt_face_load_fpgm(TT_Face face,FT_Stream stream)212 tt_face_load_fpgm( TT_Face face, 213 FT_Stream stream ) 214 { 215 FT_Error error; 216 FT_ULong table_len; 217 218 219 FT_TRACE2(( "Font program " )); 220 221 /* The font program is optional */ 222 error = face->goto_table( face, TTAG_fpgm, stream, &table_len ); 223 if ( error ) 224 { 225 face->font_program = NULL; 226 face->font_program_size = 0; 227 228 FT_TRACE2(( "is missing!\n" )); 229 } 230 else 231 { 232 face->font_program_size = table_len; 233 if ( FT_FRAME_EXTRACT( table_len, face->font_program ) ) 234 goto Exit; 235 236 FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size )); 237 } 238 239 FT_TRACE2(( "Prep program " )); 240 241 error = face->goto_table( face, TTAG_prep, stream, &table_len ); 242 if ( error ) 243 { 244 face->cvt_program = NULL; 245 face->cvt_program_size = 0; 246 error = TT_Err_Ok; 247 248 FT_TRACE2(( "is missing!\n" )); 249 } 250 else 251 { 252 face->cvt_program_size = table_len; 253 if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) ) 254 goto Exit; 255 256 FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size )); 257 } 258 259 Exit: 260 return error; 261 } 262 263 264 /* END */ 265