Sync trunk.
[reactos.git] / lib / 3rdparty / freetype / src / otvalid / otvcommn.h
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 */