The BIG graph update
[rrdtool.git] / libraries / freetype-2.0.5 / cidparse.c
1 /***************************************************************************/
2 /*                                                                         */
3 /*  cidparse.c                                                             */
4 /*                                                                         */
5 /*    CID-keyed Type1 parser (body).                                       */
6 /*                                                                         */
7 /*  Copyright 1996-2001 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_CALC_H
22 #include FT_INTERNAL_OBJECTS_H
23 #include FT_INTERNAL_STREAM_H
24
25 #include "cidparse.h"
26
27 #include "ciderrs.h"
28
29 #include <string.h>     /* for strncmp() */
30
31
32   /*************************************************************************/
33   /*                                                                       */
34   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
35   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
36   /* messages during execution.                                            */
37   /*                                                                       */
38 #undef  FT_COMPONENT
39 #define FT_COMPONENT  trace_cidparse
40
41
42   /*************************************************************************/
43   /*************************************************************************/
44   /*************************************************************************/
45   /*****                                                               *****/
46   /*****                    INPUT STREAM PARSER                        *****/
47   /*****                                                               *****/
48   /*************************************************************************/
49   /*************************************************************************/
50   /*************************************************************************/
51
52
53   FT_LOCAL_DEF FT_Error
54   CID_New_Parser( CID_Parser*       parser,
55                   FT_Stream         stream,
56                   FT_Memory         memory,
57                   PSAux_Interface*  psaux )
58   {
59     FT_Error  error;
60     FT_ULong  base_offset, offset, ps_len;
61     FT_Byte   buffer[256 + 10];
62     FT_Int    buff_len;
63
64
65     MEM_Set( parser, 0, sizeof ( *parser ) );
66     psaux->t1_parser_funcs->init( &parser->root, 0, 0, memory );
67
68     parser->stream = stream;
69
70     base_offset = FILE_Pos();
71
72     /* first of all, check the font format in the  header */
73     if ( ACCESS_Frame( 31 ) )
74       goto Exit;
75
76     if ( strncmp( (char *)stream->cursor,
77                   "%!PS-Adobe-3.0 Resource-CIDFont", 31 ) )
78     {
79       FT_TRACE2(( "[not a valid CID-keyed font]\n" ));
80       error = CID_Err_Unknown_File_Format;
81     }
82
83     FORGET_Frame();
84     if ( error )
85       goto Exit;
86
87     /* now, read the rest of the file, until we find a `StartData' */
88     buff_len = 256;
89     for (;;)
90     {
91       FT_Byte   *p, *limit = buffer + 256;
92       FT_ULong  top_position;
93
94
95       /* fill input buffer */
96       buff_len -= 256;
97       if ( buff_len > 0 )
98         MEM_Move( buffer, limit, buff_len );
99
100       p = buffer + buff_len;
101
102       if ( FILE_Read( p, 256 + 10 - buff_len ) )
103         goto Exit;
104
105       top_position = FILE_Pos() - buff_len;
106       buff_len = 256 + 10;
107
108       /* look for `StartData' */
109       for ( p = buffer; p < limit; p++ )
110       {
111         if ( p[0] == 'S' && strncmp( (char*)p, "StartData", 9 ) == 0 )
112         {
113           /* save offset of binary data after `StartData' */
114           offset = (FT_ULong)( top_position - ( limit - p ) + 10 );
115           goto Found;
116         }
117       }
118     }
119
120   Found:
121     /* we have found the start of the binary data.  We will now        */
122     /* rewind and extract the frame of corresponding to the Postscript */
123     /* section                                                         */
124
125     ps_len = offset - base_offset;
126     if ( FILE_Seek( base_offset )                    ||
127          EXTRACT_Frame( ps_len, parser->postscript ) )
128       goto Exit;
129
130     parser->data_offset    = offset;
131     parser->postscript_len = ps_len;
132     parser->root.base      = parser->postscript;
133     parser->root.cursor    = parser->postscript;
134     parser->root.limit     = parser->root.cursor + ps_len;
135     parser->num_dict       = -1;
136
137   Exit:
138     return error;
139   }
140
141
142   FT_LOCAL_DEF void
143   CID_Done_Parser( CID_Parser*  parser )
144   {
145     /* always free the private dictionary */
146     if ( parser->postscript )
147     {
148       FT_Stream  stream = parser->stream;
149
150
151       RELEASE_Frame( parser->postscript );
152     }
153     parser->root.funcs.done( &parser->root );
154   }
155
156
157 /* END */