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