|
1 /***************************************************************************/ |
|
2 /* */ |
|
3 /* otvcommn.h */ |
|
4 /* */ |
|
5 /* OpenType common tables validation (specification). */ |
|
6 /* */ |
|
7 /* Copyright 2004, 2005, 2007, 2009 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 #ifndef __OTVCOMMN_H__ |
|
20 #define __OTVCOMMN_H__ |
|
21 |
|
22 |
|
23 #include <ft2build.h> |
|
24 #include "otvalid.h" |
|
25 #include FT_INTERNAL_DEBUG_H |
|
26 |
|
27 |
|
28 FT_BEGIN_HEADER |
|
29 |
|
30 |
|
31 /*************************************************************************/ |
|
32 /*************************************************************************/ |
|
33 /***** *****/ |
|
34 /***** VALIDATION *****/ |
|
35 /***** *****/ |
|
36 /*************************************************************************/ |
|
37 /*************************************************************************/ |
|
38 |
|
39 typedef struct OTV_ValidatorRec_* OTV_Validator; |
|
40 |
|
41 typedef void (*OTV_Validate_Func)( FT_Bytes table, |
|
42 OTV_Validator valid ); |
|
43 |
|
44 typedef struct OTV_ValidatorRec_ |
|
45 { |
|
46 FT_Validator root; |
|
47 FT_UInt type_count; |
|
48 OTV_Validate_Func* type_funcs; |
|
49 |
|
50 FT_UInt lookup_count; |
|
51 FT_UInt glyph_count; |
|
52 |
|
53 FT_UInt nesting_level; |
|
54 |
|
55 OTV_Validate_Func func[3]; |
|
56 |
|
57 FT_UInt extra1; /* for passing parameters */ |
|
58 FT_UInt extra2; |
|
59 FT_Bytes extra3; |
|
60 |
|
61 #ifdef FT_DEBUG_LEVEL_TRACE |
|
62 FT_UInt debug_indent; |
|
63 const FT_String* debug_function_name[3]; |
|
64 #endif |
|
65 |
|
66 } OTV_ValidatorRec; |
|
67 |
|
68 |
|
69 #undef FT_INVALID_ |
|
70 #define FT_INVALID_( _prefix, _error ) \ |
|
71 ft_validator_error( valid->root, _prefix ## _error ) |
|
72 |
|
73 #define OTV_OPTIONAL_TABLE( _table ) FT_UShort _table; \ |
|
74 FT_Bytes _table ## _p |
|
75 |
|
76 #define OTV_OPTIONAL_OFFSET( _offset ) \ |
|
77 FT_BEGIN_STMNT \ |
|
78 _offset ## _p = p; \ |
|
79 _offset = FT_NEXT_USHORT( p ); \ |
|
80 FT_END_STMNT |
|
81 |
|
82 #define OTV_LIMIT_CHECK( _count ) \ |
|
83 FT_BEGIN_STMNT \ |
|
84 if ( p + (_count) > valid->root->limit ) \ |
|
85 FT_INVALID_TOO_SHORT; \ |
|
86 FT_END_STMNT |
|
87 |
|
88 #define OTV_SIZE_CHECK( _size ) \ |
|
89 FT_BEGIN_STMNT \ |
|
90 if ( _size > 0 && _size < table_size ) \ |
|
91 { \ |
|
92 if ( valid->root->level == FT_VALIDATE_PARANOID ) \ |
|
93 FT_INVALID_OFFSET; \ |
|
94 else \ |
|
95 { \ |
|
96 /* strip off `const' */ \ |
|
97 FT_Byte* pp = (FT_Byte*)_size ## _p; \ |
|
98 \ |
|
99 \ |
|
100 FT_TRACE3(( "\n" \ |
|
101 "Invalid offset to optional table `%s'" \ |
|
102 " set to zero.\n" \ |
|
103 "\n", #_size )); \ |
|
104 \ |
|
105 /* always assume 16bit entities */ \ |
|
106 _size = pp[0] = pp[1] = 0; \ |
|
107 } \ |
|
108 } \ |
|
109 FT_END_STMNT |
|
110 |
|
111 |
|
112 #define OTV_NAME_(x) #x |
|
113 #define OTV_NAME(x) OTV_NAME_(x) |
|
114 |
|
115 #define OTV_FUNC_(x) x##Func |
|
116 #define OTV_FUNC(x) OTV_FUNC_(x) |
|
117 |
|
118 #ifdef FT_DEBUG_LEVEL_TRACE |
|
119 |
|
120 #define OTV_NEST1( x ) \ |
|
121 FT_BEGIN_STMNT \ |
|
122 valid->nesting_level = 0; \ |
|
123 valid->func[0] = OTV_FUNC( x ); \ |
|
124 valid->debug_function_name[0] = OTV_NAME( x ); \ |
|
125 FT_END_STMNT |
|
126 |
|
127 #define OTV_NEST2( x, y ) \ |
|
128 FT_BEGIN_STMNT \ |
|
129 valid->nesting_level = 0; \ |
|
130 valid->func[0] = OTV_FUNC( x ); \ |
|
131 valid->func[1] = OTV_FUNC( y ); \ |
|
132 valid->debug_function_name[0] = OTV_NAME( x ); \ |
|
133 valid->debug_function_name[1] = OTV_NAME( y ); \ |
|
134 FT_END_STMNT |
|
135 |
|
136 #define OTV_NEST3( x, y, z ) \ |
|
137 FT_BEGIN_STMNT \ |
|
138 valid->nesting_level = 0; \ |
|
139 valid->func[0] = OTV_FUNC( x ); \ |
|
140 valid->func[1] = OTV_FUNC( y ); \ |
|
141 valid->func[2] = OTV_FUNC( z ); \ |
|
142 valid->debug_function_name[0] = OTV_NAME( x ); \ |
|
143 valid->debug_function_name[1] = OTV_NAME( y ); \ |
|
144 valid->debug_function_name[2] = OTV_NAME( z ); \ |
|
145 FT_END_STMNT |
|
146 |
|
147 #define OTV_INIT valid->debug_indent = 0 |
|
148 |
|
149 #define OTV_ENTER \ |
|
150 FT_BEGIN_STMNT \ |
|
151 valid->debug_indent += 2; \ |
|
152 FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ |
|
153 FT_TRACE4(( "%s table\n", \ |
|
154 valid->debug_function_name[valid->nesting_level] )); \ |
|
155 FT_END_STMNT |
|
156 |
|
157 #define OTV_NAME_ENTER( name ) \ |
|
158 FT_BEGIN_STMNT \ |
|
159 valid->debug_indent += 2; \ |
|
160 FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ |
|
161 FT_TRACE4(( "%s table\n", name )); \ |
|
162 FT_END_STMNT |
|
163 |
|
164 #define OTV_EXIT valid->debug_indent -= 2 |
|
165 |
|
166 #define OTV_TRACE( s ) \ |
|
167 FT_BEGIN_STMNT \ |
|
168 FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ |
|
169 FT_TRACE4( s ); \ |
|
170 FT_END_STMNT |
|
171 |
|
172 #else /* !FT_DEBUG_LEVEL_TRACE */ |
|
173 |
|
174 #define OTV_NEST1( x ) \ |
|
175 FT_BEGIN_STMNT \ |
|
176 valid->nesting_level = 0; \ |
|
177 valid->func[0] = OTV_FUNC( x ); \ |
|
178 FT_END_STMNT |
|
179 |
|
180 #define OTV_NEST2( x, y ) \ |
|
181 FT_BEGIN_STMNT \ |
|
182 valid->nesting_level = 0; \ |
|
183 valid->func[0] = OTV_FUNC( x ); \ |
|
184 valid->func[1] = OTV_FUNC( y ); \ |
|
185 FT_END_STMNT |
|
186 |
|
187 #define OTV_NEST3( x, y, z ) \ |
|
188 FT_BEGIN_STMNT \ |
|
189 valid->nesting_level = 0; \ |
|
190 valid->func[0] = OTV_FUNC( x ); \ |
|
191 valid->func[1] = OTV_FUNC( y ); \ |
|
192 valid->func[2] = OTV_FUNC( z ); \ |
|
193 FT_END_STMNT |
|
194 |
|
195 #define OTV_INIT do { } while ( 0 ) |
|
196 #define OTV_ENTER do { } while ( 0 ) |
|
197 #define OTV_NAME_ENTER( name ) do { } while ( 0 ) |
|
198 #define OTV_EXIT do { } while ( 0 ) |
|
199 |
|
200 #define OTV_TRACE( s ) do { } while ( 0 ) |
|
201 |
|
202 #endif /* !FT_DEBUG_LEVEL_TRACE */ |
|
203 |
|
204 |
|
205 #define OTV_RUN valid->func[0] |
|
206 |
|
207 |
|
208 /*************************************************************************/ |
|
209 /*************************************************************************/ |
|
210 /***** *****/ |
|
211 /***** COVERAGE TABLE *****/ |
|
212 /***** *****/ |
|
213 /*************************************************************************/ |
|
214 /*************************************************************************/ |
|
215 |
|
216 FT_LOCAL( void ) |
|
217 otv_Coverage_validate( FT_Bytes table, |
|
218 OTV_Validator valid, |
|
219 FT_Int expected_count ); |
|
220 |
|
221 /* return first covered glyph */ |
|
222 FT_LOCAL( FT_UInt ) |
|
223 otv_Coverage_get_first( FT_Bytes table ); |
|
224 |
|
225 /* return last covered glyph */ |
|
226 FT_LOCAL( FT_UInt ) |
|
227 otv_Coverage_get_last( FT_Bytes table ); |
|
228 |
|
229 /* return number of covered glyphs */ |
|
230 FT_LOCAL( FT_UInt ) |
|
231 otv_Coverage_get_count( FT_Bytes table ); |
|
232 |
|
233 |
|
234 /*************************************************************************/ |
|
235 /*************************************************************************/ |
|
236 /***** *****/ |
|
237 /***** CLASS DEFINITION TABLE *****/ |
|
238 /***** *****/ |
|
239 /*************************************************************************/ |
|
240 /*************************************************************************/ |
|
241 |
|
242 FT_LOCAL( void ) |
|
243 otv_ClassDef_validate( FT_Bytes table, |
|
244 OTV_Validator valid ); |
|
245 |
|
246 |
|
247 /*************************************************************************/ |
|
248 /*************************************************************************/ |
|
249 /***** *****/ |
|
250 /***** DEVICE TABLE *****/ |
|
251 /***** *****/ |
|
252 /*************************************************************************/ |
|
253 /*************************************************************************/ |
|
254 |
|
255 FT_LOCAL( void ) |
|
256 otv_Device_validate( FT_Bytes table, |
|
257 OTV_Validator valid ); |
|
258 |
|
259 |
|
260 /*************************************************************************/ |
|
261 /*************************************************************************/ |
|
262 /***** *****/ |
|
263 /***** LOOKUPS *****/ |
|
264 /***** *****/ |
|
265 /*************************************************************************/ |
|
266 /*************************************************************************/ |
|
267 |
|
268 FT_LOCAL( void ) |
|
269 otv_Lookup_validate( FT_Bytes table, |
|
270 OTV_Validator valid ); |
|
271 |
|
272 FT_LOCAL( void ) |
|
273 otv_LookupList_validate( FT_Bytes table, |
|
274 OTV_Validator valid ); |
|
275 |
|
276 |
|
277 /*************************************************************************/ |
|
278 /*************************************************************************/ |
|
279 /***** *****/ |
|
280 /***** FEATURES *****/ |
|
281 /***** *****/ |
|
282 /*************************************************************************/ |
|
283 /*************************************************************************/ |
|
284 |
|
285 FT_LOCAL( void ) |
|
286 otv_Feature_validate( FT_Bytes table, |
|
287 OTV_Validator valid ); |
|
288 |
|
289 /* lookups must already be validated */ |
|
290 FT_LOCAL( void ) |
|
291 otv_FeatureList_validate( FT_Bytes table, |
|
292 FT_Bytes lookups, |
|
293 OTV_Validator valid ); |
|
294 |
|
295 |
|
296 /*************************************************************************/ |
|
297 /*************************************************************************/ |
|
298 /***** *****/ |
|
299 /***** LANGUAGE SYSTEM *****/ |
|
300 /***** *****/ |
|
301 /*************************************************************************/ |
|
302 /*************************************************************************/ |
|
303 |
|
304 FT_LOCAL( void ) |
|
305 otv_LangSys_validate( FT_Bytes table, |
|
306 OTV_Validator valid ); |
|
307 |
|
308 |
|
309 /*************************************************************************/ |
|
310 /*************************************************************************/ |
|
311 /***** *****/ |
|
312 /***** SCRIPTS *****/ |
|
313 /***** *****/ |
|
314 /*************************************************************************/ |
|
315 /*************************************************************************/ |
|
316 |
|
317 FT_LOCAL( void ) |
|
318 otv_Script_validate( FT_Bytes table, |
|
319 OTV_Validator valid ); |
|
320 |
|
321 /* features must already be validated */ |
|
322 FT_LOCAL( void ) |
|
323 otv_ScriptList_validate( FT_Bytes table, |
|
324 FT_Bytes features, |
|
325 OTV_Validator valid ); |
|
326 |
|
327 |
|
328 /*************************************************************************/ |
|
329 /*************************************************************************/ |
|
330 /***** *****/ |
|
331 /***** UTILITY FUNCTIONS *****/ |
|
332 /***** *****/ |
|
333 /*************************************************************************/ |
|
334 /*************************************************************************/ |
|
335 |
|
336 #define ChainPosClassSetFunc otv_x_Ox |
|
337 #define ChainPosRuleSetFunc otv_x_Ox |
|
338 #define ChainSubClassSetFunc otv_x_Ox |
|
339 #define ChainSubRuleSetFunc otv_x_Ox |
|
340 #define JstfLangSysFunc otv_x_Ox |
|
341 #define JstfMaxFunc otv_x_Ox |
|
342 #define LigGlyphFunc otv_x_Ox |
|
343 #define LigatureArrayFunc otv_x_Ox |
|
344 #define LigatureSetFunc otv_x_Ox |
|
345 #define PosClassSetFunc otv_x_Ox |
|
346 #define PosRuleSetFunc otv_x_Ox |
|
347 #define SubClassSetFunc otv_x_Ox |
|
348 #define SubRuleSetFunc otv_x_Ox |
|
349 |
|
350 FT_LOCAL( void ) |
|
351 otv_x_Ox ( FT_Bytes table, |
|
352 OTV_Validator valid ); |
|
353 |
|
354 #define AlternateSubstFormat1Func otv_u_C_x_Ox |
|
355 #define ChainContextPosFormat1Func otv_u_C_x_Ox |
|
356 #define ChainContextSubstFormat1Func otv_u_C_x_Ox |
|
357 #define ContextPosFormat1Func otv_u_C_x_Ox |
|
358 #define ContextSubstFormat1Func otv_u_C_x_Ox |
|
359 #define LigatureSubstFormat1Func otv_u_C_x_Ox |
|
360 #define MultipleSubstFormat1Func otv_u_C_x_Ox |
|
361 |
|
362 FT_LOCAL( void ) |
|
363 otv_u_C_x_Ox( FT_Bytes table, |
|
364 OTV_Validator valid ); |
|
365 |
|
366 #define AlternateSetFunc otv_x_ux |
|
367 #define AttachPointFunc otv_x_ux |
|
368 #define ExtenderGlyphFunc otv_x_ux |
|
369 #define JstfGPOSModListFunc otv_x_ux |
|
370 #define JstfGSUBModListFunc otv_x_ux |
|
371 #define SequenceFunc otv_x_ux |
|
372 |
|
373 FT_LOCAL( void ) |
|
374 otv_x_ux( FT_Bytes table, |
|
375 OTV_Validator valid ); |
|
376 |
|
377 #define PosClassRuleFunc otv_x_y_ux_sy |
|
378 #define PosRuleFunc otv_x_y_ux_sy |
|
379 #define SubClassRuleFunc otv_x_y_ux_sy |
|
380 #define SubRuleFunc otv_x_y_ux_sy |
|
381 |
|
382 FT_LOCAL( void ) |
|
383 otv_x_y_ux_sy( FT_Bytes table, |
|
384 OTV_Validator valid ); |
|
385 |
|
386 #define ChainPosClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp |
|
387 #define ChainPosRuleFunc otv_x_ux_y_uy_z_uz_p_sp |
|
388 #define ChainSubClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp |
|
389 #define ChainSubRuleFunc otv_x_ux_y_uy_z_uz_p_sp |
|
390 |
|
391 FT_LOCAL( void ) |
|
392 otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table, |
|
393 OTV_Validator valid ); |
|
394 |
|
395 #define ContextPosFormat2Func otv_u_O_O_x_Onx |
|
396 #define ContextSubstFormat2Func otv_u_O_O_x_Onx |
|
397 |
|
398 FT_LOCAL( void ) |
|
399 otv_u_O_O_x_Onx( FT_Bytes table, |
|
400 OTV_Validator valid ); |
|
401 |
|
402 #define ContextPosFormat3Func otv_u_x_y_Ox_sy |
|
403 #define ContextSubstFormat3Func otv_u_x_y_Ox_sy |
|
404 |
|
405 FT_LOCAL( void ) |
|
406 otv_u_x_y_Ox_sy( FT_Bytes table, |
|
407 OTV_Validator valid ); |
|
408 |
|
409 #define ChainContextPosFormat2Func otv_u_O_O_O_O_x_Onx |
|
410 #define ChainContextSubstFormat2Func otv_u_O_O_O_O_x_Onx |
|
411 |
|
412 FT_LOCAL( void ) |
|
413 otv_u_O_O_O_O_x_Onx( FT_Bytes table, |
|
414 OTV_Validator valid ); |
|
415 |
|
416 #define ChainContextPosFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp |
|
417 #define ChainContextSubstFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp |
|
418 |
|
419 FT_LOCAL( void ) |
|
420 otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table, |
|
421 OTV_Validator valid ); |
|
422 |
|
423 |
|
424 FT_LOCAL( FT_UInt ) |
|
425 otv_GSUBGPOS_get_Lookup_count( FT_Bytes table ); |
|
426 |
|
427 FT_LOCAL( FT_UInt ) |
|
428 otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table ); |
|
429 |
|
430 /* */ |
|
431 |
|
432 FT_END_HEADER |
|
433 |
|
434 #endif /* __OTVCOMMN_H__ */ |
|
435 |
|
436 |
|
437 /* END */ |