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