1 /***************************************************************************/
5 /* TrueType glyph data/program tables loader (body). */
7 /* Copyright 1996-2001, 2002 by */
8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
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. */
16 /***************************************************************************/
20 #include FT_INTERNAL_DEBUG_H
21 #include FT_INTERNAL_OBJECTS_H
22 #include FT_INTERNAL_STREAM_H
23 #include FT_TRUETYPE_TAGS_H
30 /*************************************************************************/
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. */
37 #define FT_COMPONENT trace_ttpload
40 /*************************************************************************/
43 /* tt_face_load_loca */
46 /* Loads the locations table. */
49 /* face :: A handle to the target face object. */
52 /* stream :: The input stream. */
55 /* FreeType error code. 0 means success. */
57 FT_LOCAL_DEF( FT_Error )
58 tt_face_load_loca( TT_Face face,
62 FT_Memory memory = stream->memory;
67 FT_TRACE2(( "Locations " ));
68 LongOffsets = face->header.Index_To_Loc_Format;
70 error = face->goto_table( face, TTAG_loca, stream, &table_len );
73 error = TT_Err_Locations_Missing;
77 if ( LongOffsets != 0 )
79 face->num_locations = (FT_UShort)( table_len >> 2 );
81 FT_TRACE2(( "(32bit offsets): %12d ", face->num_locations ));
83 if ( FT_NEW_ARRAY( face->glyph_locations, face->num_locations ) )
86 if ( FT_FRAME_ENTER( face->num_locations * 4L ) )
90 FT_Long* loc = face->glyph_locations;
91 FT_Long* limit = loc + face->num_locations;
94 for ( ; loc < limit; loc++ )
102 face->num_locations = (FT_UShort)( table_len >> 1 );
104 FT_TRACE2(( "(16bit offsets): %12d ", face->num_locations ));
106 if ( FT_NEW_ARRAY( face->glyph_locations, face->num_locations ) )
109 if ( FT_FRAME_ENTER( face->num_locations * 2L ) )
112 FT_Long* loc = face->glyph_locations;
113 FT_Long* limit = loc + face->num_locations;
116 for ( ; loc < limit; loc++ )
117 *loc = (FT_Long)( (FT_ULong)FT_GET_USHORT() * 2 );
122 FT_TRACE2(( "loaded\n" ));
129 /*************************************************************************/
132 /* tt_face_load_cvt */
135 /* Loads the control value table into a face object. */
138 /* face :: A handle to the target face object. */
141 /* stream :: A handle to the input stream. */
144 /* FreeType error code. 0 means success. */
146 FT_LOCAL_DEF( FT_Error )
147 tt_face_load_cvt( TT_Face face,
151 FT_Memory memory = stream->memory;
155 FT_TRACE2(( "CVT " ));
157 error = face->goto_table( face, TTAG_cvt, stream, &table_len );
160 FT_TRACE2(( "is missing!\n" ));
169 face->cvt_size = table_len / 2;
171 if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) )
174 if ( FT_FRAME_ENTER( face->cvt_size * 2L ) )
178 FT_Short* cur = face->cvt;
179 FT_Short* limit = cur + face->cvt_size;
182 for ( ; cur < limit; cur++ )
183 *cur = FT_GET_SHORT();
187 FT_TRACE2(( "loaded\n" ));
194 /*************************************************************************/
197 /* tt_face_load_fpgm */
200 /* Loads the font program and the cvt program. */
203 /* face :: A handle to the target face object. */
206 /* stream :: A handle to the input stream. */
209 /* FreeType error code. 0 means success. */
211 FT_LOCAL_DEF( FT_Error )
212 tt_face_load_fpgm( TT_Face face,
219 FT_TRACE2(( "Font program " ));
221 /* The font program is optional */
222 error = face->goto_table( face, TTAG_fpgm, stream, &table_len );
225 face->font_program = NULL;
226 face->font_program_size = 0;
228 FT_TRACE2(( "is missing!\n" ));
232 face->font_program_size = table_len;
233 if ( FT_FRAME_EXTRACT( table_len, face->font_program ) )
236 FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size ));
239 FT_TRACE2(( "Prep program " ));
241 error = face->goto_table( face, TTAG_prep, stream, &table_len );
244 face->cvt_program = NULL;
245 face->cvt_program_size = 0;
248 FT_TRACE2(( "is missing!\n" ));
252 face->cvt_program_size = table_len;
253 if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) )
256 FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size ));