blob: 2f143882f0482ed7724fe3f4be42531783cf4324 [file] [log] [blame]
David Turnerd2b1f351999-12-16 23:11:37 +00001/***************************************************************************/
2/* */
3/* ttpload.h */
4/* */
5/* TrueType glyph data/program tables loader (body). */
6/* */
Werner Lemberg78575dc2000-06-12 19:36:41 +00007/* Copyright 1996-2000 by */
David Turnerd2b1f351999-12-16 23:11:37 +00008/* David Turner, Robert Wilhelm, and Werner Lemberg. */
9/* */
Werner Lemberg78575dc2000-06-12 19:36:41 +000010/* This file is part of the FreeType project, and may only be used, */
11/* modified, and distributed under the terms of the FreeType project */
David Turnerd2b1f351999-12-16 23:11:37 +000012/* 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
David Turnerefce08d2000-05-11 18:23:52 +000019#include <freetype/internal/ftdebug.h>
20#include <freetype/internal/ftobjs.h>
21#include <freetype/internal/ftstream.h>
22#include <freetype/tttags.h>
David Turnerd2b1f351999-12-16 23:11:37 +000023
24#include <ttpload.h>
Werner Lemberge1d5dd72000-06-07 04:48:12 +000025#include <freetype/internal/tterrors.h>
David Turnerd2b1f351999-12-16 23:11:37 +000026
Werner Lemberg78575dc2000-06-12 19:36:41 +000027
28 /*************************************************************************/
29 /* */
30 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
31 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
32 /* messages during execution. */
33 /* */
David Turnerd2b1f351999-12-16 23:11:37 +000034#undef FT_COMPONENT
Werner Lemberg78575dc2000-06-12 19:36:41 +000035#define FT_COMPONENT trace_ttpload
36
David Turnerd2b1f351999-12-16 23:11:37 +000037
38 /*************************************************************************/
39 /* */
40 /* <Function> */
41 /* TT_Load_Locations */
42 /* */
43 /* <Description> */
44 /* Loads the locations table. */
45 /* */
Werner Lemberg78575dc2000-06-12 19:36:41 +000046 /* <InOut> */
David Turnerd2b1f351999-12-16 23:11:37 +000047 /* face :: A handle to the target face object. */
Werner Lemberg78575dc2000-06-12 19:36:41 +000048 /* */
49 /* <Input> */
David Turnerd2b1f351999-12-16 23:11:37 +000050 /* stream :: The input stream. */
51 /* */
52 /* <Return> */
53 /* TrueType error code. 0 means success. */
54 /* */
55 LOCAL_FUNC
David Turnerf9b8dec2000-06-16 19:34:52 +000056 FT_Error TT_Load_Locations( TT_Face face,
David Turnerd2b1f351999-12-16 23:11:37 +000057 FT_Stream stream )
58 {
David Turnerf9b8dec2000-06-16 19:34:52 +000059 FT_Error error;
David Turnerd2b1f351999-12-16 23:11:37 +000060 FT_Memory memory = stream->memory;
David Turnerf9b8dec2000-06-16 19:34:52 +000061 FT_Short LongOffsets;
62 FT_ULong table_len;
David Turnerd2b1f351999-12-16 23:11:37 +000063
Werner Lemberg78575dc2000-06-12 19:36:41 +000064
David Turnerd2b1f351999-12-16 23:11:37 +000065 FT_TRACE2(( "Locations " ));
66 LongOffsets = face->header.Index_To_Loc_Format;
67
68 error = face->goto_table( face, TTAG_loca, stream, &table_len );
Werner Lemberg78575dc2000-06-12 19:36:41 +000069 if ( error )
David Turnerd2b1f351999-12-16 23:11:37 +000070 {
71 error = TT_Err_Locations_Missing;
72 goto Exit;
73 }
74
75 if ( LongOffsets != 0 )
76 {
David Turnerf9b8dec2000-06-16 19:34:52 +000077 face->num_locations = (FT_UShort)( table_len >> 2 );
David Turnerd2b1f351999-12-16 23:11:37 +000078
Werner Lemberg78575dc2000-06-12 19:36:41 +000079 FT_TRACE2(( "(32bit offsets): %12d ", face->num_locations ));
David Turnerd2b1f351999-12-16 23:11:37 +000080
81 if ( ALLOC_ARRAY( face->glyph_locations,
82 face->num_locations,
David Turnerf9b8dec2000-06-16 19:34:52 +000083 FT_Long ) )
David Turnerd2b1f351999-12-16 23:11:37 +000084 goto Exit;
85
86 if ( ACCESS_Frame( face->num_locations * 4L ) )
87 goto Exit;
88
89 {
David Turnerf9b8dec2000-06-16 19:34:52 +000090 FT_Long* loc = face->glyph_locations;
91 FT_Long* limit = loc + face->num_locations;
David Turnerd2b1f351999-12-16 23:11:37 +000092
Werner Lemberg78575dc2000-06-12 19:36:41 +000093
David Turnerd2b1f351999-12-16 23:11:37 +000094 for ( ; loc < limit; loc++ )
95 *loc = GET_Long();
96 }
97
98 FORGET_Frame();
99 }
100 else
101 {
David Turnerf9b8dec2000-06-16 19:34:52 +0000102 face->num_locations = (FT_UShort)( table_len >> 1 );
David Turnerd2b1f351999-12-16 23:11:37 +0000103
Werner Lemberg78575dc2000-06-12 19:36:41 +0000104 FT_TRACE2(( "(16bit offsets): %12d ", face->num_locations ));
David Turnerd2b1f351999-12-16 23:11:37 +0000105
106 if ( ALLOC_ARRAY( face->glyph_locations,
107 face->num_locations,
David Turnerf9b8dec2000-06-16 19:34:52 +0000108 FT_Long ) )
David Turnerd2b1f351999-12-16 23:11:37 +0000109 goto Exit;
110
111 if ( ACCESS_Frame( face->num_locations * 2L ) )
112 goto Exit;
113 {
David Turnerf9b8dec2000-06-16 19:34:52 +0000114 FT_Long* loc = face->glyph_locations;
115 FT_Long* limit = loc + face->num_locations;
David Turnerd2b1f351999-12-16 23:11:37 +0000116
Werner Lemberg78575dc2000-06-12 19:36:41 +0000117
David Turnerd2b1f351999-12-16 23:11:37 +0000118 for ( ; loc < limit; loc++ )
David Turnerf9b8dec2000-06-16 19:34:52 +0000119 *loc = (FT_Long)( (FT_ULong)GET_UShort() * 2 );
David Turnerd2b1f351999-12-16 23:11:37 +0000120 }
121 FORGET_Frame();
122 }
123
124 FT_TRACE2(( "loaded\n" ));
125
126 Exit:
127 return error;
128 }
129
130
131 /*************************************************************************/
132 /* */
133 /* <Function> */
134 /* TT_Load_CVT */
135 /* */
136 /* <Description> */
137 /* Loads the control value table into a face object. */
138 /* */
Werner Lemberg78575dc2000-06-12 19:36:41 +0000139 /* <InOut> */
David Turnerd2b1f351999-12-16 23:11:37 +0000140 /* face :: A handle to the target face object. */
Werner Lemberg78575dc2000-06-12 19:36:41 +0000141 /* */
142 /* <Input> */
David Turnerd2b1f351999-12-16 23:11:37 +0000143 /* stream :: A handle to the input stream. */
144 /* */
145 /* <Return> */
146 /* TrueType error code. 0 means success. */
147 /* */
148 LOCAL_FUNC
David Turnerf9b8dec2000-06-16 19:34:52 +0000149 FT_Error TT_Load_CVT( TT_Face face,
David Turnerd2b1f351999-12-16 23:11:37 +0000150 FT_Stream stream )
151 {
David Turnerf9b8dec2000-06-16 19:34:52 +0000152 FT_Error error;
David Turnerd2b1f351999-12-16 23:11:37 +0000153 FT_Memory memory = stream->memory;
David Turnerf9b8dec2000-06-16 19:34:52 +0000154 FT_ULong table_len;
David Turnerd2b1f351999-12-16 23:11:37 +0000155
Werner Lemberg78575dc2000-06-12 19:36:41 +0000156
David Turnerd2b1f351999-12-16 23:11:37 +0000157 FT_TRACE2(( "CVT " ));
158
159 error = face->goto_table( face, TTAG_cvt, stream, &table_len );
Werner Lemberg78575dc2000-06-12 19:36:41 +0000160 if ( error )
David Turnerd2b1f351999-12-16 23:11:37 +0000161 {
162 FT_TRACE2(( "is missing!\n" ));
163
164 face->cvt_size = 0;
165 face->cvt = NULL;
166 error = TT_Err_Ok;
167
168 goto Exit;
169 }
170
171 face->cvt_size = table_len / 2;
172
173 if ( ALLOC_ARRAY( face->cvt,
174 face->cvt_size,
David Turnerf9b8dec2000-06-16 19:34:52 +0000175 FT_Short ) )
David Turnerd2b1f351999-12-16 23:11:37 +0000176 goto Exit;
177
178 if ( ACCESS_Frame( face->cvt_size * 2L ) )
179 goto Exit;
180
181 {
David Turnerf9b8dec2000-06-16 19:34:52 +0000182 FT_Short* cur = face->cvt;
183 FT_Short* limit = cur + face->cvt_size;
David Turnerd2b1f351999-12-16 23:11:37 +0000184
Werner Lemberg78575dc2000-06-12 19:36:41 +0000185
David Turnerd2b1f351999-12-16 23:11:37 +0000186 for ( ; cur < limit; cur++ )
187 *cur = GET_Short();
188 }
189
190 FORGET_Frame();
191 FT_TRACE2(( "loaded\n" ));
192
193 Exit:
194 return error;
195 }
196
197
198 /*************************************************************************/
199 /* */
200 /* <Function> */
201 /* TT_Load_Progams */
202 /* */
203 /* <Description> */
204 /* Loads the font program and the cvt program. */
205 /* */
Werner Lemberg78575dc2000-06-12 19:36:41 +0000206 /* <InOut> */
David Turnerd2b1f351999-12-16 23:11:37 +0000207 /* face :: A handle to the target face object. */
Werner Lemberg78575dc2000-06-12 19:36:41 +0000208 /* */
209 /* <Input> */
David Turnerd2b1f351999-12-16 23:11:37 +0000210 /* stream :: A handle to the input stream. */
211 /* */
212 /* <Return> */
213 /* TrueType error code. 0 means success. */
214 /* */
215 LOCAL_FUNC
David Turnerf9b8dec2000-06-16 19:34:52 +0000216 FT_Error TT_Load_Programs( TT_Face face,
David Turnerd2b1f351999-12-16 23:11:37 +0000217 FT_Stream stream )
218 {
David Turnerf9b8dec2000-06-16 19:34:52 +0000219 FT_Error error;
220 FT_ULong table_len;
David Turnerd2b1f351999-12-16 23:11:37 +0000221
Werner Lemberg78575dc2000-06-12 19:36:41 +0000222
Werner Lembergf6978662000-01-08 20:00:54 +0000223 FT_TRACE2(( "Font program " ));
David Turnerd2b1f351999-12-16 23:11:37 +0000224
225 /* The font program is optional */
226 error = face->goto_table( face, TTAG_fpgm, stream, &table_len );
Werner Lembergf6978662000-01-08 20:00:54 +0000227 if ( error )
David Turnerd2b1f351999-12-16 23:11:37 +0000228 {
229 face->font_program = NULL;
230 face->font_program_size = 0;
Werner Lemberg78575dc2000-06-12 19:36:41 +0000231
David Turnerd2b1f351999-12-16 23:11:37 +0000232 FT_TRACE2(( "is missing!\n" ));
233 }
234 else
235 {
236 face->font_program_size = table_len;
David Turner2e421312000-05-26 22:13:17 +0000237 if ( EXTRACT_Frame( table_len, face->font_program ) )
David Turnerd2b1f351999-12-16 23:11:37 +0000238 goto Exit;
239
240 FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size ));
241 }
242
243 FT_TRACE2(( "Prep program " ));
244
245 error = face->goto_table( face, TTAG_prep, stream, &table_len );
Werner Lembergf6978662000-01-08 20:00:54 +0000246 if ( error )
David Turnerd2b1f351999-12-16 23:11:37 +0000247 {
248 face->cvt_program = NULL;
249 face->cvt_program_size = 0;
Werner Lembergf6978662000-01-08 20:00:54 +0000250 error = TT_Err_Ok;
David Turnerd2b1f351999-12-16 23:11:37 +0000251
252 FT_TRACE2(( "is missing!\n" ));
253 }
254 else
255 {
256 face->cvt_program_size = table_len;
David Turner2e421312000-05-26 22:13:17 +0000257 if ( EXTRACT_Frame( table_len, face->cvt_program ) )
258 goto Exit;
Werner Lemberg78575dc2000-06-12 19:36:41 +0000259
David Turnerd2b1f351999-12-16 23:11:37 +0000260 FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size ));
261 }
262
263 Exit:
264 return error;
265 }
266
267
268/* END */