blob: be6ac69c28471542d69a7802dccc63c1bffcc1ae [file] [log] [blame]
Werner Lembergee95b6f2004-09-10 14:39:00 +00001/***************************************************************************/
2/* */
3/* otvcommn.h */
4/* */
5/* OpenType common tables validation (specification). */
6/* */
Werner Lemberg49f4d342005-06-16 19:07:08 +00007/* Copyright 2004, 2005 by */
Werner Lembergee95b6f2004-09-10 14:39:00 +00008/* 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
28FT_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_
Werner Lemberg133eee02004-12-12 06:55:40 +000070#define FT_INVALID_( _prefix, _error ) \
Werner Lembergee95b6f2004-09-10 14:39:00 +000071 ft_validator_error( valid->root, _prefix ## _error )
72
Werner Lemberg49f4d342005-06-16 19:07:08 +000073#define OTV_OPTIONAL_TABLE( _table ) FT_UShort _table; \
74 FT_Bytes _table ## _p
Werner Lembergee95b6f2004-09-10 14:39:00 +000075
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'!\n" \
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
David Turnerc5621622005-06-30 11:46:46 +0000112#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
Werner Lembergee95b6f2004-09-10 14:39:00 +0000118#ifdef FT_DEBUG_LEVEL_TRACE
119
David Turnerc5621622005-06-30 11:46:46 +0000120#define OTV_NEST1( x ) \
121 FT_BEGIN_STMNT \
122 valid->nesting_level = 0; \
Werner Lemberg8e3fc5e2005-08-03 21:17:53 +0000123 valid->func[0] = OTV_FUNC( x ); \
124 valid->debug_function_name[0] = OTV_NAME( x ); \
Werner Lembergee95b6f2004-09-10 14:39:00 +0000125 FT_END_STMNT
126
Werner Lemberg8e3fc5e2005-08-03 21:17:53 +0000127#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 ); \
Werner Lembergee95b6f2004-09-10 14:39:00 +0000134 FT_END_STMNT
135
Werner Lemberg8e3fc5e2005-08-03 21:17:53 +0000136#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 ); \
Werner Lembergee95b6f2004-09-10 14:39:00 +0000145 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
Werner Lemberg8e3fc5e2005-08-03 21:17:53 +0000174#define OTV_NEST1( x ) \
175 FT_BEGIN_STMNT \
176 valid->nesting_level = 0; \
177 valid->func[0] = OTV_FUNC( x ); \
Werner Lembergee95b6f2004-09-10 14:39:00 +0000178 FT_END_STMNT
179
Werner Lemberg8e3fc5e2005-08-03 21:17:53 +0000180#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 ); \
Werner Lembergee95b6f2004-09-10 14:39:00 +0000185 FT_END_STMNT
186
Werner Lemberg8e3fc5e2005-08-03 21:17:53 +0000187#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 ); \
Werner Lembergee95b6f2004-09-10 14:39:00 +0000193 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
220 /* return first covered glyph */
221 FT_LOCAL( FT_UInt )
222 otv_Coverage_get_first( FT_Bytes table );
223
224 /* return last covered glyph */
225 FT_LOCAL( FT_UInt )
226 otv_Coverage_get_last( FT_Bytes table );
227
228 /* return number of covered glyphs */
229 FT_LOCAL( FT_UInt )
230 otv_Coverage_get_count( FT_Bytes table );
231
232
233 /*************************************************************************/
234 /*************************************************************************/
235 /***** *****/
236 /***** CLASS DEFINITION TABLE *****/
237 /***** *****/
238 /*************************************************************************/
239 /*************************************************************************/
240
241 FT_LOCAL( void )
242 otv_ClassDef_validate( FT_Bytes table,
243 OTV_Validator valid );
244
245
246 /*************************************************************************/
247 /*************************************************************************/
248 /***** *****/
249 /***** DEVICE TABLE *****/
250 /***** *****/
251 /*************************************************************************/
252 /*************************************************************************/
253
254 FT_LOCAL( void )
255 otv_Device_validate( FT_Bytes table,
256 OTV_Validator valid );
257
258
259 /*************************************************************************/
260 /*************************************************************************/
261 /***** *****/
262 /***** LOOKUPS *****/
263 /***** *****/
264 /*************************************************************************/
265 /*************************************************************************/
266
267 FT_LOCAL( void )
268 otv_Lookup_validate( FT_Bytes table,
269 OTV_Validator valid );
270
271 FT_LOCAL( void )
272 otv_LookupList_validate( FT_Bytes table,
273 OTV_Validator valid );
274
275
276 /*************************************************************************/
277 /*************************************************************************/
278 /***** *****/
279 /***** FEATURES *****/
280 /***** *****/
281 /*************************************************************************/
282 /*************************************************************************/
283
284 FT_LOCAL( void )
285 otv_Feature_validate( FT_Bytes table,
286 OTV_Validator valid );
287
288 /* lookups must already be validated */
289 FT_LOCAL( void )
290 otv_FeatureList_validate( FT_Bytes table,
291 FT_Bytes lookups,
292 OTV_Validator valid );
293
294
295 /*************************************************************************/
296 /*************************************************************************/
297 /***** *****/
298 /***** LANGUAGE SYSTEM *****/
299 /***** *****/
300 /*************************************************************************/
301 /*************************************************************************/
302
303 FT_LOCAL( void )
304 otv_LangSys_validate( FT_Bytes table,
305 OTV_Validator valid );
306
307
308 /*************************************************************************/
309 /*************************************************************************/
310 /***** *****/
311 /***** SCRIPTS *****/
312 /***** *****/
313 /*************************************************************************/
314 /*************************************************************************/
315
316 FT_LOCAL( void )
317 otv_Script_validate( FT_Bytes table,
318 OTV_Validator valid );
319
320 /* features must already be validated */
321 FT_LOCAL( void )
322 otv_ScriptList_validate( FT_Bytes table,
323 FT_Bytes features,
324 OTV_Validator valid );
325
326
327 /*************************************************************************/
328 /*************************************************************************/
329 /***** *****/
330 /***** UTILITY FUNCTIONS *****/
331 /***** *****/
332 /*************************************************************************/
333 /*************************************************************************/
334
David Turnerc5621622005-06-30 11:46:46 +0000335#define ChainPosClassSetFunc otv_x_Ox
336#define ChainPosRuleSetFunc otv_x_Ox
337#define ChainSubClassSetFunc otv_x_Ox
338#define ChainSubRuleSetFunc otv_x_Ox
339#define JstfLangSysFunc otv_x_Ox
340#define JstfMaxFunc otv_x_Ox
341#define LigGlyphFunc otv_x_Ox
342#define LigatureArrayFunc otv_x_Ox
343#define LigatureSetFunc otv_x_Ox
344#define PosClassSetFunc otv_x_Ox
345#define PosRuleSetFunc otv_x_Ox
346#define SubClassSetFunc otv_x_Ox
347#define SubRuleSetFunc otv_x_Ox
Werner Lembergee95b6f2004-09-10 14:39:00 +0000348
349 FT_LOCAL( void )
350 otv_x_Ox ( FT_Bytes table,
351 OTV_Validator valid );
352
David Turnerc5621622005-06-30 11:46:46 +0000353#define AlternateSubstFormat1Func otv_u_C_x_Ox
354#define ChainContextPosFormat1Func otv_u_C_x_Ox
355#define ChainContextSubstFormat1Func otv_u_C_x_Ox
356#define ContextPosFormat1Func otv_u_C_x_Ox
357#define ContextSubstFormat1Func otv_u_C_x_Ox
358#define LigatureSubstFormat1Func otv_u_C_x_Ox
359#define MultipleSubstFormat1Func otv_u_C_x_Ox
360
Werner Lembergee95b6f2004-09-10 14:39:00 +0000361 FT_LOCAL( void )
362 otv_u_C_x_Ox( FT_Bytes table,
363 OTV_Validator valid );
364
David Turnerc5621622005-06-30 11:46:46 +0000365#define AlternateSetFunc otv_x_ux
366#define AttachPointFunc otv_x_ux
367#define ExtenderGlyphFunc otv_x_ux
368#define JstfGPOSModListFunc otv_x_ux
369#define JstfGSUBModListFunc otv_x_ux
370#define SequenceFunc otv_x_ux
Werner Lembergee95b6f2004-09-10 14:39:00 +0000371
372 FT_LOCAL( void )
373 otv_x_ux( FT_Bytes table,
374 OTV_Validator valid );
375
David Turnerc5621622005-06-30 11:46:46 +0000376#define PosClassRuleFunc otv_x_y_ux_sy
377#define PosRuleFunc otv_x_y_ux_sy
378#define SubClassRuleFunc otv_x_y_ux_sy
379#define SubRuleFunc otv_x_y_ux_sy
Werner Lembergee95b6f2004-09-10 14:39:00 +0000380
381 FT_LOCAL( void )
382 otv_x_y_ux_sy( FT_Bytes table,
383 OTV_Validator valid );
384
David Turnerc5621622005-06-30 11:46:46 +0000385#define ChainPosClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp
386#define ChainPosRuleFunc otv_x_ux_y_uy_z_uz_p_sp
387#define ChainSubClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp
388#define ChainSubRuleFunc otv_x_ux_y_uy_z_uz_p_sp
Werner Lembergee95b6f2004-09-10 14:39:00 +0000389
390 FT_LOCAL( void )
391 otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table,
392 OTV_Validator valid );
393
David Turnerc5621622005-06-30 11:46:46 +0000394#define ContextPosFormat2Func otv_u_O_O_x_Onx
395#define ContextSubstFormat2Func otv_u_O_O_x_Onx
Werner Lembergee95b6f2004-09-10 14:39:00 +0000396
397 FT_LOCAL( void )
398 otv_u_O_O_x_Onx( FT_Bytes table,
399 OTV_Validator valid );
400
David Turnerc5621622005-06-30 11:46:46 +0000401#define ContextPosFormat3Func otv_u_x_y_Ox_sy
402#define ContextSubstFormat3Func otv_u_x_y_Ox_sy
Werner Lembergee95b6f2004-09-10 14:39:00 +0000403
404 FT_LOCAL( void )
405 otv_u_x_y_Ox_sy( FT_Bytes table,
406 OTV_Validator valid );
407
David Turnerc5621622005-06-30 11:46:46 +0000408#define ChainContextPosFormat2Func otv_u_O_O_O_O_x_Onx
409#define ChainContextSubstFormat2Func otv_u_O_O_O_O_x_Onx
Werner Lembergee95b6f2004-09-10 14:39:00 +0000410
411 FT_LOCAL( void )
412 otv_u_O_O_O_O_x_Onx( FT_Bytes table,
413 OTV_Validator valid );
414
David Turnerc5621622005-06-30 11:46:46 +0000415#define ChainContextPosFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp
416#define ChainContextSubstFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp
Werner Lembergee95b6f2004-09-10 14:39:00 +0000417
418 FT_LOCAL( void )
419 otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table,
420 OTV_Validator valid );
421
422
423 FT_LOCAL( FT_UInt )
424 otv_GSUBGPOS_get_Lookup_count( FT_Bytes table );
425
426 FT_LOCAL( FT_UInt )
427 otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table );
428
429 /* */
430
431FT_END_HEADER
432
433#endif /* __OTVCOMMN_H__ */
434
435
436/* END */