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