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