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_Load_Locations */
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_Load_Locations( 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 /*************************************************************************/
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_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_Load_Progams */
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_Load_Programs( 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
));