Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4680 | right-hear | 1 | /******************************************************************* |
2 | * |
||
3 | * ttfile.h 1.3 |
||
4 | * |
||
5 | * File I/O Component (specification). |
||
6 | * |
||
7 | * Copyright 1996-1999 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 | * Changes between 1.3 and 1.2: |
||
17 | * |
||
18 | * - all functions report error values now |
||
19 | * |
||
20 | * - the stream semantics have also changed |
||
21 | * |
||
22 | * Changes between 1.2 and 1.1: |
||
23 | * |
||
24 | * - added macros to support re-entrant builds |
||
25 | * |
||
26 | * - added the TT_Duplicate_File function to duplicate streams |
||
27 | * (re-entrant builds only) |
||
28 | * |
||
29 | ******************************************************************/ |
||
30 | |||
31 | #ifndef TTFILE_H |
||
32 | #define TTFILE_H |
||
33 | |||
34 | #include "ttconfig.h" |
||
35 | #include "freetype.h" |
||
36 | #include "ttengine.h" |
||
37 | #include "ttdebug.h" |
||
38 | |||
39 | #ifdef __cplusplus |
||
40 | extern "C" { |
||
41 | #endif |
||
42 | |||
43 | /* Initialize file component */ |
||
44 | LOCAL_DEF |
||
45 | TT_Error TTFile_Init( PEngine_Instance engine ); |
||
46 | |||
47 | /* Done with file component */ |
||
48 | LOCAL_DEF |
||
49 | TT_Error TTFile_Done( PEngine_Instance engine ); |
||
50 | |||
51 | |||
52 | /**********************************************************************/ |
||
53 | /* */ |
||
54 | /* Stream functions. */ |
||
55 | /* */ |
||
56 | /**********************************************************************/ |
||
57 | |||
58 | /* Open a file and return a stream handle for it. */ |
||
59 | /* Should only be used for a new face object's main stream. */ |
||
60 | |||
61 | LOCAL_DEF |
||
62 | TT_Error TT_Open_Stream( const TT_Text* name, |
||
63 | TT_Stream* stream ); |
||
64 | |||
65 | |||
66 | /* Closes, then discards, a stream when it's no longer needed. */ |
||
67 | /* Should only be used for a stream opend with TT_Open_Stream(). */ |
||
68 | |||
69 | LOCAL_DEF |
||
70 | TT_Error TT_Close_Stream( TT_Stream* stream ); |
||
71 | |||
72 | |||
73 | /* Informs the component that we're going to use the file */ |
||
74 | /* opened in 'org_stream', and report errors to the 'error' */ |
||
75 | /* variable. */ |
||
76 | |||
77 | /* in non re-entrant builds, 'org_stream' is simply copied */ |
||
78 | /* to 'stream'. Otherwise, the latter is a duplicate handle */ |
||
79 | /* for the file opened with 'org_stream' */ |
||
80 | |||
81 | EXPORT_DEF |
||
82 | TT_Error TT_Use_Stream( TT_Stream org_stream, |
||
83 | TT_Stream* stream ); |
||
84 | |||
85 | /* Informs the component that we don't need to perform file */ |
||
86 | /* operations on the stream 'stream' anymore. This must be */ |
||
87 | /* used with streams "opened" with TT_Use_Stream() only! */ |
||
88 | |||
89 | /* in re-entrant builds, this will really discard the stream */ |
||
90 | |||
91 | EXPORT_DEF |
||
92 | TT_Error TT_Done_Stream( TT_Stream* stream ); |
||
93 | |||
94 | /* Closes the stream's file handle to release system resources */ |
||
95 | /* The function TT_Use_Stream automatically re-activates a */ |
||
96 | /* flushed stream when it uses one */ |
||
97 | |||
98 | EXPORT_DEF |
||
99 | TT_Error TT_Flush_Stream( TT_Stream* stream ); |
||
100 | |||
101 | /* The macros STREAM_ARGS and STREAM_ARG let us build a thread-safe */ |
||
102 | /* or re-entrant implementation depending on a single configuration */ |
||
103 | /*define. */ |
||
104 | |||
105 | #ifdef TT_CONFIG_OPTION_THREAD_SAFE |
||
106 | |||
107 | #define STREAM_ARGS TT_Stream stream, |
||
108 | #define STREAM_ARG TT_Stream stream |
||
109 | |||
110 | #else |
||
111 | |||
112 | #define STREAM_ARGS /* void */ |
||
113 | #define STREAM_ARG void |
||
114 | |||
115 | #endif /* TT_CONFIG_OPTION_THREAD_SAFE */ |
||
116 | |||
117 | |||
118 | /****************************************************************/ |
||
119 | /* */ |
||
120 | /* File Functions. */ |
||
121 | /* */ |
||
122 | /* The following functions perform file operations on the */ |
||
123 | /* currently 'used' stream. In thread-safe builds, only one */ |
||
124 | /* stream can be used at a time. Synchronisation is performed */ |
||
125 | /* through the Use_Stream()/Done_Stream() functions. */ |
||
126 | /* */ |
||
127 | /****************************************************************/ |
||
128 | |||
129 | /* Read 'count' bytes from file into 'buffer' */ |
||
130 | |||
131 | EXPORT_DEF |
||
132 | TT_Error TT_Read_File( STREAM_ARGS void* buffer, |
||
133 | Long count ); |
||
134 | |||
135 | |||
136 | /* Seek file cursor to a given position */ |
||
137 | |||
138 | EXPORT_DEF |
||
139 | TT_Error TT_Seek_File( STREAM_ARGS Long position ); |
||
140 | |||
141 | |||
142 | /* Skip the next 'distance' bytes in file */ |
||
143 | |||
144 | EXPORT_DEF |
||
145 | TT_Error TT_Skip_File( STREAM_ARGS Long distance ); |
||
146 | |||
147 | |||
148 | /* Read the 'count' bytes at 'position' into 'buffer' */ |
||
149 | |||
150 | EXPORT_DEF |
||
151 | TT_Error TT_Read_At_File( STREAM_ARGS Long position, |
||
152 | void* buffer, |
||
153 | Long count ); |
||
154 | |||
155 | /* Return current file position */ |
||
156 | |||
157 | EXPORT_DEF |
||
158 | Long TT_File_Pos( STREAM_ARG ); |
||
159 | |||
160 | /* Return length of a given stream, even if it is flushed */ |
||
161 | |||
162 | EXPORT_DEF |
||
163 | Long TT_Stream_Size( TT_Stream stream ); |
||
164 | |||
165 | |||
166 | /********************************************************************/ |
||
167 | /* */ |
||
168 | /* Frame operations. */ |
||
169 | /* */ |
||
170 | /* For a comprehensive explanation of frames, please refer to the */ |
||
171 | /* documentation files. */ |
||
172 | /* */ |
||
173 | /********************************************************************/ |
||
174 | |||
175 | /* Frame type declaration.*/ |
||
176 | |||
177 | struct TFileFrame_ |
||
178 | { |
||
179 | Byte* address; /* frame buffer */ |
||
180 | Byte* cursor; /* current cursor position in frame */ |
||
181 | Long size; /* frame size */ |
||
182 | }; |
||
183 | |||
184 | typedef struct TFileFrame_ TFileFrame; |
||
185 | |||
186 | EXPORT_DEF |
||
187 | const TFileFrame TT_Null_FileFrame; |
||
188 | |||
189 | |||
190 | /* The macro ZERO_Frame is used to define and init a frame. */ |
||
191 | /* It is important to have a default frame of { NULL, NULL, 0 } */ |
||
192 | /* before a call to TT_Access_Frame(). Otherwise, the call will */ |
||
193 | /* fail with a TT_Err_Nested_Frame_Accesses error. */ |
||
194 | |||
195 | #define ZERO_Frame( frame ) \ |
||
196 | { \ |
||
197 | (frame).address = NULL; \ |
||
198 | (frame).cursor = NULL; \ |
||
199 | (frame).size = 0; \ |
||
200 | } |
||
201 | |||
202 | |||
203 | /* The macros FRAME_ARGS and FRAME_ARG let us build a thread-safe */ |
||
204 | /* or re-entrant implementation depending on a single configuration */ |
||
205 | /* define */ |
||
206 | |||
207 | #ifdef TT_CONFIG_OPTION_THREAD_SAFE |
||
208 | |||
209 | #define FRAME_ARGS TFileFrame* frame, |
||
210 | #define FRAME_ARG TFileFrame* frame |
||
211 | |||
212 | #else |
||
213 | |||
214 | #define FRAME_ARGS /* void */ |
||
215 | #define FRAME_ARG void |
||
216 | |||
217 | #endif /* TT_CONFIG_OPTION_THREAD_SAFE */ |
||
218 | |||
219 | |||
220 | /* Access the next 'size' bytes from current position. */ |
||
221 | /* Fails if all bytes cannot be read/accessed. */ |
||
222 | |||
223 | EXPORT_DEF |
||
224 | TT_Error TT_Access_Frame( STREAM_ARGS FRAME_ARGS Long size ); |
||
225 | |||
226 | |||
227 | /* Access the bytes located in the next 'size' bytes of the file. */ |
||
228 | /* Doesn't fail if less than 'size' bytes are accessible (like */ |
||
229 | /* at the end of the file). */ |
||
230 | |||
231 | EXPORT_DEF |
||
232 | TT_Error TT_Check_And_Access_Frame( STREAM_ARGS FRAME_ARGS Long size ); |
||
233 | |||
234 | /* Forget frame */ |
||
235 | |||
236 | EXPORT_DEF |
||
237 | TT_Error TT_Forget_Frame( FRAME_ARG ); |
||
238 | |||
239 | |||
240 | /* primitive routines for data accessing */ |
||
241 | |||
242 | EXPORT_DEF |
||
243 | Char TT_Get_Char ( FRAME_ARG ); |
||
244 | EXPORT_DEF |
||
245 | Short TT_Get_Short( FRAME_ARG ); |
||
246 | EXPORT_DEF |
||
247 | Long TT_Get_Long ( FRAME_ARG ); |
||
248 | |||
249 | #ifdef TT_CONFIG_OPTION_THREAD_SAFE |
||
250 | |||
251 | #define TT_Get_Byte( frame ) ( (Byte )TT_Get_Char ( frame ) ) |
||
252 | #define TT_Get_UShort( frame ) ( (UShort)TT_Get_Short( frame ) ) |
||
253 | #define TT_Get_ULong( frame ) ( (ULong )TT_Get_Long ( frame ) ) |
||
254 | |||
255 | #else |
||
256 | |||
257 | #define TT_Get_Byte() ( (Byte )TT_Get_Char () ) |
||
258 | #define TT_Get_UShort() ( (UShort)TT_Get_Short() ) |
||
259 | #define TT_Get_ULong() ( (ULong )TT_Get_Long () ) |
||
260 | |||
261 | #endif /* TT_CONFIG_OPTION_THREAD_SAFE */ |
||
262 | |||
263 | |||
264 | #ifdef __cplusplus |
||
265 | } |
||
266 | #endif |
||
267 | |||
268 | #endif /* TTFILE_H */ |
||
269 | |||
270 | |||
271 | /* END */ |