Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenotvcommn.h
Go to the documentation of this file.
00001 /***************************************************************************/ 00002 /* */ 00003 /* otvcommn.h */ 00004 /* */ 00005 /* OpenType common tables validation (specification). */ 00006 /* */ 00007 /* Copyright 2004, 2005, 2007, 2009 by */ 00008 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ 00009 /* */ 00010 /* This file is part of the FreeType project, and may only be used, */ 00011 /* modified, and distributed under the terms of the FreeType project */ 00012 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 00013 /* this file you indicate that you have read the license and */ 00014 /* understand and accept it fully. */ 00015 /* */ 00016 /***************************************************************************/ 00017 00018 00019 #ifndef __OTVCOMMN_H__ 00020 #define __OTVCOMMN_H__ 00021 00022 00023 #include <ft2build.h> 00024 #include "otvalid.h" 00025 #include FT_INTERNAL_DEBUG_H 00026 00027 00028 FT_BEGIN_HEADER 00029 00030 00031 /*************************************************************************/ 00032 /*************************************************************************/ 00033 /***** *****/ 00034 /***** VALIDATION *****/ 00035 /***** *****/ 00036 /*************************************************************************/ 00037 /*************************************************************************/ 00038 00039 typedef struct OTV_ValidatorRec_* OTV_Validator; 00040 00041 typedef void (*OTV_Validate_Func)( FT_Bytes table, 00042 OTV_Validator valid ); 00043 00044 typedef struct OTV_ValidatorRec_ 00045 { 00046 FT_Validator root; 00047 FT_UInt type_count; 00048 OTV_Validate_Func* type_funcs; 00049 00050 FT_UInt lookup_count; 00051 FT_UInt glyph_count; 00052 00053 FT_UInt nesting_level; 00054 00055 OTV_Validate_Func func[3]; 00056 00057 FT_UInt extra1; /* for passing parameters */ 00058 FT_UInt extra2; 00059 FT_Bytes extra3; 00060 00061 #ifdef FT_DEBUG_LEVEL_TRACE 00062 FT_UInt debug_indent; 00063 const FT_String* debug_function_name[3]; 00064 #endif 00065 00066 } OTV_ValidatorRec; 00067 00068 00069 #undef FT_INVALID_ 00070 #define FT_INVALID_( _prefix, _error ) \ 00071 ft_validator_error( valid->root, _prefix ## _error ) 00072 00073 #define OTV_OPTIONAL_TABLE( _table ) FT_UShort _table; \ 00074 FT_Bytes _table ## _p 00075 00076 #define OTV_OPTIONAL_OFFSET( _offset ) \ 00077 FT_BEGIN_STMNT \ 00078 _offset ## _p = p; \ 00079 _offset = FT_NEXT_USHORT( p ); \ 00080 FT_END_STMNT 00081 00082 #define OTV_LIMIT_CHECK( _count ) \ 00083 FT_BEGIN_STMNT \ 00084 if ( p + (_count) > valid->root->limit ) \ 00085 FT_INVALID_TOO_SHORT; \ 00086 FT_END_STMNT 00087 00088 #define OTV_SIZE_CHECK( _size ) \ 00089 FT_BEGIN_STMNT \ 00090 if ( _size > 0 && _size < table_size ) \ 00091 { \ 00092 if ( valid->root->level == FT_VALIDATE_PARANOID ) \ 00093 FT_INVALID_OFFSET; \ 00094 else \ 00095 { \ 00096 /* strip off `const' */ \ 00097 FT_Byte* pp = (FT_Byte*)_size ## _p; \ 00098 \ 00099 \ 00100 FT_TRACE3(( "\n" \ 00101 "Invalid offset to optional table `%s'" \ 00102 " set to zero.\n" \ 00103 "\n", #_size )); \ 00104 \ 00105 /* always assume 16bit entities */ \ 00106 _size = pp[0] = pp[1] = 0; \ 00107 } \ 00108 } \ 00109 FT_END_STMNT 00110 00111 00112 #define OTV_NAME_(x) #x 00113 #define OTV_NAME(x) OTV_NAME_(x) 00114 00115 #define OTV_FUNC_(x) x##Func 00116 #define OTV_FUNC(x) OTV_FUNC_(x) 00117 00118 #ifdef FT_DEBUG_LEVEL_TRACE 00119 00120 #define OTV_NEST1( x ) \ 00121 FT_BEGIN_STMNT \ 00122 valid->nesting_level = 0; \ 00123 valid->func[0] = OTV_FUNC( x ); \ 00124 valid->debug_function_name[0] = OTV_NAME( x ); \ 00125 FT_END_STMNT 00126 00127 #define OTV_NEST2( x, y ) \ 00128 FT_BEGIN_STMNT \ 00129 valid->nesting_level = 0; \ 00130 valid->func[0] = OTV_FUNC( x ); \ 00131 valid->func[1] = OTV_FUNC( y ); \ 00132 valid->debug_function_name[0] = OTV_NAME( x ); \ 00133 valid->debug_function_name[1] = OTV_NAME( y ); \ 00134 FT_END_STMNT 00135 00136 #define OTV_NEST3( x, y, z ) \ 00137 FT_BEGIN_STMNT \ 00138 valid->nesting_level = 0; \ 00139 valid->func[0] = OTV_FUNC( x ); \ 00140 valid->func[1] = OTV_FUNC( y ); \ 00141 valid->func[2] = OTV_FUNC( z ); \ 00142 valid->debug_function_name[0] = OTV_NAME( x ); \ 00143 valid->debug_function_name[1] = OTV_NAME( y ); \ 00144 valid->debug_function_name[2] = OTV_NAME( z ); \ 00145 FT_END_STMNT 00146 00147 #define OTV_INIT valid->debug_indent = 0 00148 00149 #define OTV_ENTER \ 00150 FT_BEGIN_STMNT \ 00151 valid->debug_indent += 2; \ 00152 FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ 00153 FT_TRACE4(( "%s table\n", \ 00154 valid->debug_function_name[valid->nesting_level] )); \ 00155 FT_END_STMNT 00156 00157 #define OTV_NAME_ENTER( name ) \ 00158 FT_BEGIN_STMNT \ 00159 valid->debug_indent += 2; \ 00160 FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ 00161 FT_TRACE4(( "%s table\n", name )); \ 00162 FT_END_STMNT 00163 00164 #define OTV_EXIT valid->debug_indent -= 2 00165 00166 #define OTV_TRACE( s ) \ 00167 FT_BEGIN_STMNT \ 00168 FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ 00169 FT_TRACE4( s ); \ 00170 FT_END_STMNT 00171 00172 #else /* !FT_DEBUG_LEVEL_TRACE */ 00173 00174 #define OTV_NEST1( x ) \ 00175 FT_BEGIN_STMNT \ 00176 valid->nesting_level = 0; \ 00177 valid->func[0] = OTV_FUNC( x ); \ 00178 FT_END_STMNT 00179 00180 #define OTV_NEST2( x, y ) \ 00181 FT_BEGIN_STMNT \ 00182 valid->nesting_level = 0; \ 00183 valid->func[0] = OTV_FUNC( x ); \ 00184 valid->func[1] = OTV_FUNC( y ); \ 00185 FT_END_STMNT 00186 00187 #define OTV_NEST3( x, y, z ) \ 00188 FT_BEGIN_STMNT \ 00189 valid->nesting_level = 0; \ 00190 valid->func[0] = OTV_FUNC( x ); \ 00191 valid->func[1] = OTV_FUNC( y ); \ 00192 valid->func[2] = OTV_FUNC( z ); \ 00193 FT_END_STMNT 00194 00195 #define OTV_INIT do { } while ( 0 ) 00196 #define OTV_ENTER do { } while ( 0 ) 00197 #define OTV_NAME_ENTER( name ) do { } while ( 0 ) 00198 #define OTV_EXIT do { } while ( 0 ) 00199 00200 #define OTV_TRACE( s ) do { } while ( 0 ) 00201 00202 #endif /* !FT_DEBUG_LEVEL_TRACE */ 00203 00204 00205 #define OTV_RUN valid->func[0] 00206 00207 00208 /*************************************************************************/ 00209 /*************************************************************************/ 00210 /***** *****/ 00211 /***** COVERAGE TABLE *****/ 00212 /***** *****/ 00213 /*************************************************************************/ 00214 /*************************************************************************/ 00215 00216 FT_LOCAL( void ) 00217 otv_Coverage_validate( FT_Bytes table, 00218 OTV_Validator valid, 00219 FT_Int expected_count ); 00220 00221 /* return first covered glyph */ 00222 FT_LOCAL( FT_UInt ) 00223 otv_Coverage_get_first( FT_Bytes table ); 00224 00225 /* return last covered glyph */ 00226 FT_LOCAL( FT_UInt ) 00227 otv_Coverage_get_last( FT_Bytes table ); 00228 00229 /* return number of covered glyphs */ 00230 FT_LOCAL( FT_UInt ) 00231 otv_Coverage_get_count( FT_Bytes table ); 00232 00233 00234 /*************************************************************************/ 00235 /*************************************************************************/ 00236 /***** *****/ 00237 /***** CLASS DEFINITION TABLE *****/ 00238 /***** *****/ 00239 /*************************************************************************/ 00240 /*************************************************************************/ 00241 00242 FT_LOCAL( void ) 00243 otv_ClassDef_validate( FT_Bytes table, 00244 OTV_Validator valid ); 00245 00246 00247 /*************************************************************************/ 00248 /*************************************************************************/ 00249 /***** *****/ 00250 /***** DEVICE TABLE *****/ 00251 /***** *****/ 00252 /*************************************************************************/ 00253 /*************************************************************************/ 00254 00255 FT_LOCAL( void ) 00256 otv_Device_validate( FT_Bytes table, 00257 OTV_Validator valid ); 00258 00259 00260 /*************************************************************************/ 00261 /*************************************************************************/ 00262 /***** *****/ 00263 /***** LOOKUPS *****/ 00264 /***** *****/ 00265 /*************************************************************************/ 00266 /*************************************************************************/ 00267 00268 FT_LOCAL( void ) 00269 otv_Lookup_validate( FT_Bytes table, 00270 OTV_Validator valid ); 00271 00272 FT_LOCAL( void ) 00273 otv_LookupList_validate( FT_Bytes table, 00274 OTV_Validator valid ); 00275 00276 00277 /*************************************************************************/ 00278 /*************************************************************************/ 00279 /***** *****/ 00280 /***** FEATURES *****/ 00281 /***** *****/ 00282 /*************************************************************************/ 00283 /*************************************************************************/ 00284 00285 FT_LOCAL( void ) 00286 otv_Feature_validate( FT_Bytes table, 00287 OTV_Validator valid ); 00288 00289 /* lookups must already be validated */ 00290 FT_LOCAL( void ) 00291 otv_FeatureList_validate( FT_Bytes table, 00292 FT_Bytes lookups, 00293 OTV_Validator valid ); 00294 00295 00296 /*************************************************************************/ 00297 /*************************************************************************/ 00298 /***** *****/ 00299 /***** LANGUAGE SYSTEM *****/ 00300 /***** *****/ 00301 /*************************************************************************/ 00302 /*************************************************************************/ 00303 00304 FT_LOCAL( void ) 00305 otv_LangSys_validate( FT_Bytes table, 00306 OTV_Validator valid ); 00307 00308 00309 /*************************************************************************/ 00310 /*************************************************************************/ 00311 /***** *****/ 00312 /***** SCRIPTS *****/ 00313 /***** *****/ 00314 /*************************************************************************/ 00315 /*************************************************************************/ 00316 00317 FT_LOCAL( void ) 00318 otv_Script_validate( FT_Bytes table, 00319 OTV_Validator valid ); 00320 00321 /* features must already be validated */ 00322 FT_LOCAL( void ) 00323 otv_ScriptList_validate( FT_Bytes table, 00324 FT_Bytes features, 00325 OTV_Validator valid ); 00326 00327 00328 /*************************************************************************/ 00329 /*************************************************************************/ 00330 /***** *****/ 00331 /***** UTILITY FUNCTIONS *****/ 00332 /***** *****/ 00333 /*************************************************************************/ 00334 /*************************************************************************/ 00335 00336 #define ChainPosClassSetFunc otv_x_Ox 00337 #define ChainPosRuleSetFunc otv_x_Ox 00338 #define ChainSubClassSetFunc otv_x_Ox 00339 #define ChainSubRuleSetFunc otv_x_Ox 00340 #define JstfLangSysFunc otv_x_Ox 00341 #define JstfMaxFunc otv_x_Ox 00342 #define LigGlyphFunc otv_x_Ox 00343 #define LigatureArrayFunc otv_x_Ox 00344 #define LigatureSetFunc otv_x_Ox 00345 #define PosClassSetFunc otv_x_Ox 00346 #define PosRuleSetFunc otv_x_Ox 00347 #define SubClassSetFunc otv_x_Ox 00348 #define SubRuleSetFunc otv_x_Ox 00349 00350 FT_LOCAL( void ) 00351 otv_x_Ox ( FT_Bytes table, 00352 OTV_Validator valid ); 00353 00354 #define AlternateSubstFormat1Func otv_u_C_x_Ox 00355 #define ChainContextPosFormat1Func otv_u_C_x_Ox 00356 #define ChainContextSubstFormat1Func otv_u_C_x_Ox 00357 #define ContextPosFormat1Func otv_u_C_x_Ox 00358 #define ContextSubstFormat1Func otv_u_C_x_Ox 00359 #define LigatureSubstFormat1Func otv_u_C_x_Ox 00360 #define MultipleSubstFormat1Func otv_u_C_x_Ox 00361 00362 FT_LOCAL( void ) 00363 otv_u_C_x_Ox( FT_Bytes table, 00364 OTV_Validator valid ); 00365 00366 #define AlternateSetFunc otv_x_ux 00367 #define AttachPointFunc otv_x_ux 00368 #define ExtenderGlyphFunc otv_x_ux 00369 #define JstfGPOSModListFunc otv_x_ux 00370 #define JstfGSUBModListFunc otv_x_ux 00371 #define SequenceFunc otv_x_ux 00372 00373 FT_LOCAL( void ) 00374 otv_x_ux( FT_Bytes table, 00375 OTV_Validator valid ); 00376 00377 #define PosClassRuleFunc otv_x_y_ux_sy 00378 #define PosRuleFunc otv_x_y_ux_sy 00379 #define SubClassRuleFunc otv_x_y_ux_sy 00380 #define SubRuleFunc otv_x_y_ux_sy 00381 00382 FT_LOCAL( void ) 00383 otv_x_y_ux_sy( FT_Bytes table, 00384 OTV_Validator valid ); 00385 00386 #define ChainPosClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp 00387 #define ChainPosRuleFunc otv_x_ux_y_uy_z_uz_p_sp 00388 #define ChainSubClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp 00389 #define ChainSubRuleFunc otv_x_ux_y_uy_z_uz_p_sp 00390 00391 FT_LOCAL( void ) 00392 otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table, 00393 OTV_Validator valid ); 00394 00395 #define ContextPosFormat2Func otv_u_O_O_x_Onx 00396 #define ContextSubstFormat2Func otv_u_O_O_x_Onx 00397 00398 FT_LOCAL( void ) 00399 otv_u_O_O_x_Onx( FT_Bytes table, 00400 OTV_Validator valid ); 00401 00402 #define ContextPosFormat3Func otv_u_x_y_Ox_sy 00403 #define ContextSubstFormat3Func otv_u_x_y_Ox_sy 00404 00405 FT_LOCAL( void ) 00406 otv_u_x_y_Ox_sy( FT_Bytes table, 00407 OTV_Validator valid ); 00408 00409 #define ChainContextPosFormat2Func otv_u_O_O_O_O_x_Onx 00410 #define ChainContextSubstFormat2Func otv_u_O_O_O_O_x_Onx 00411 00412 FT_LOCAL( void ) 00413 otv_u_O_O_O_O_x_Onx( FT_Bytes table, 00414 OTV_Validator valid ); 00415 00416 #define ChainContextPosFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp 00417 #define ChainContextSubstFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp 00418 00419 FT_LOCAL( void ) 00420 otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table, 00421 OTV_Validator valid ); 00422 00423 00424 FT_LOCAL( FT_UInt ) 00425 otv_GSUBGPOS_get_Lookup_count( FT_Bytes table ); 00426 00427 FT_LOCAL( FT_UInt ) 00428 otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table ); 00429 00430 /* */ 00431 00432 FT_END_HEADER 00433 00434 #endif /* __OTVCOMMN_H__ */ 00435 00436 00437 /* END */ Generated on Sat May 26 2012 04:32:45 for ReactOS by
1.7.6.1
|