1 /***************************************************************************/ 2 /* */ 3 /* otvcommn.h */ 4 /* */ 5 /* OpenType common tables validation (specification). */ 6 /* */ 7 /* Copyright 2004-2015 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 otvalid ); 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_( _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_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) > otvalid->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 ( otvalid->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 otvalid->nesting_level = 0; \ 123 otvalid->func[0] = OTV_FUNC( x ); \ 124 otvalid->debug_function_name[0] = OTV_NAME( x ); \ 125 FT_END_STMNT 126 127 #define OTV_NEST2( x, y ) \ 128 FT_BEGIN_STMNT \ 129 otvalid->nesting_level = 0; \ 130 otvalid->func[0] = OTV_FUNC( x ); \ 131 otvalid->func[1] = OTV_FUNC( y ); \ 132 otvalid->debug_function_name[0] = OTV_NAME( x ); \ 133 otvalid->debug_function_name[1] = OTV_NAME( y ); \ 134 FT_END_STMNT 135 136 #define OTV_NEST3( x, y, z ) \ 137 FT_BEGIN_STMNT \ 138 otvalid->nesting_level = 0; \ 139 otvalid->func[0] = OTV_FUNC( x ); \ 140 otvalid->func[1] = OTV_FUNC( y ); \ 141 otvalid->func[2] = OTV_FUNC( z ); \ 142 otvalid->debug_function_name[0] = OTV_NAME( x ); \ 143 otvalid->debug_function_name[1] = OTV_NAME( y ); \ 144 otvalid->debug_function_name[2] = OTV_NAME( z ); \ 145 FT_END_STMNT 146 147 #define OTV_INIT otvalid->debug_indent = 0 148 149 #define OTV_ENTER \ 150 FT_BEGIN_STMNT \ 151 otvalid->debug_indent += 2; \ 152 FT_TRACE4(( "%*.s", otvalid->debug_indent, 0 )); \ 153 FT_TRACE4(( "%s table\n", \ 154 otvalid->debug_function_name[otvalid->nesting_level] )); \ 155 FT_END_STMNT 156 157 #define OTV_NAME_ENTER( name ) \ 158 FT_BEGIN_STMNT \ 159 otvalid->debug_indent += 2; \ 160 FT_TRACE4(( "%*.s", otvalid->debug_indent, 0 )); \ 161 FT_TRACE4(( "%s table\n", name )); \ 162 FT_END_STMNT 163 164 #define OTV_EXIT otvalid->debug_indent -= 2 165 166 #define OTV_TRACE( s ) \ 167 FT_BEGIN_STMNT \ 168 FT_TRACE4(( "%*.s", otvalid->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 otvalid->nesting_level = 0; \ 177 otvalid->func[0] = OTV_FUNC( x ); \ 178 FT_END_STMNT 179 180 #define OTV_NEST2( x, y ) \ 181 FT_BEGIN_STMNT \ 182 otvalid->nesting_level = 0; \ 183 otvalid->func[0] = OTV_FUNC( x ); \ 184 otvalid->func[1] = OTV_FUNC( y ); \ 185 FT_END_STMNT 186 187 #define OTV_NEST3( x, y, z ) \ 188 FT_BEGIN_STMNT \ 189 otvalid->nesting_level = 0; \ 190 otvalid->func[0] = OTV_FUNC( x ); \ 191 otvalid->func[1] = OTV_FUNC( y ); \ 192 otvalid->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 otvalid->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 otvalid, 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 otvalid ); 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 otvalid ); 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 otvalid ); 271 272 FT_LOCAL( void ) 273 otv_LookupList_validate( FT_Bytes table, 274 OTV_Validator otvalid ); 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 otvalid ); 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 otvalid ); 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 otvalid ); 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 otvalid ); 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 otvalid ); 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 otvalid ); 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 otvalid ); 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 otvalid ); 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 otvalid ); 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 otvalid ); 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 otvalid ); 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 otvalid ); 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 otvalid ); 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 otvalid ); 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 */ 438