xref: /inferno-os/libfreetype/ttpload.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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