otvcommn.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 Tue Jul 5 14:13:48 2011 for ROOT_528-00b_version by  doxygen 1.5.1