gxvcommn.h

Go to the documentation of this file.
00001 /***************************************************************************/
00002 /*                                                                         */
00003 /*  gxvcommn.h                                                             */
00004 /*                                                                         */
00005 /*    TrueTypeGX/AAT common tables validation (specification).             */
00006 /*                                                                         */
00007 /*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
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 /*                                                                         */
00020 /* gxvalid is derived from both gxlayout module and otvalid module.        */
00021 /* Development of gxlayout is supported by the Information-technology      */
00022 /* Promotion Agency(IPA), Japan.                                           */
00023 /*                                                                         */
00024 /***************************************************************************/
00025 
00026 
00027   /*
00028    * keywords in variable naming
00029    * ---------------------------
00030    *  table: Of type FT_Bytes, pointing to the start of this table/subtable.
00031    *  limit: Of type FT_Bytes, pointing to the end of this table/subtable,
00032    *         including padding for alignment.
00033    *  offset: Of type FT_UInt, the number of octets from the start to target.
00034    *  length: Of type FT_UInt, the number of octets from the start to the
00035    *          end in this table/subtable, including padding for alignment.
00036    *
00037    *  _MIN, _MAX: Should be added to the tail of macros, as INT_MIN, etc.
00038    */
00039 
00040 
00041 #ifndef __GXVCOMMN_H__
00042 #define __GXVCOMMN_H__
00043 
00044 
00045 #include <ft2build.h>
00046 #include "gxvalid.h"
00047 #include FT_INTERNAL_DEBUG_H
00048 #include FT_SFNT_NAMES_H
00049 
00050 
00051 FT_BEGIN_HEADER
00052 
00053 
00054   /*************************************************************************/
00055   /*************************************************************************/
00056   /*****                                                               *****/
00057   /*****                         VALIDATION                            *****/
00058   /*****                                                               *****/
00059   /*************************************************************************/
00060   /*************************************************************************/
00061 
00062   typedef struct GXV_ValidatorRec_*  GXV_Validator;
00063 
00064 
00065 #define DUMMY_LIMIT 0
00066 
00067   typedef void
00068   (*GXV_Validate_Func)( FT_Bytes       table,
00069                         FT_Bytes       limit,
00070                         GXV_Validator  valid );
00071 
00072 
00073   /* ====================== LookupTable Validator ======================== */
00074 
00075   typedef union  GXV_LookupValueDesc_
00076   {
00077     FT_UShort u;
00078     FT_Short  s;
00079 
00080   } GXV_LookupValueDesc;
00081 
00082   typedef const GXV_LookupValueDesc* GXV_LookupValueCPtr;
00083 
00084   typedef enum  GXV_LookupValue_SignSpec_
00085   {
00086     GXV_LOOKUPVALUE_UNSIGNED = 0,
00087     GXV_LOOKUPVALUE_SIGNED
00088 
00089   } GXV_LookupValue_SignSpec;
00090 
00091 
00092   typedef void
00093   (*GXV_Lookup_Value_Validate_Func)( FT_UShort            glyph,
00094                                      GXV_LookupValueCPtr  value_p,
00095                                      GXV_Validator        valid );
00096 
00097   typedef GXV_LookupValueDesc
00098   (*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort            relative_gindex,
00099                                    GXV_LookupValueCPtr  base_value_p,
00100                                    FT_Bytes             lookuptbl_limit,
00101                                    GXV_Validator        valid );
00102 
00103 
00104   /* ====================== StateTable Validator ========================= */
00105 
00106   typedef enum  GXV_GlyphOffset_Format_
00107   {
00108     GXV_GLYPHOFFSET_NONE   = -1,
00109     GXV_GLYPHOFFSET_UCHAR  = 2,
00110     GXV_GLYPHOFFSET_CHAR,
00111     GXV_GLYPHOFFSET_USHORT = 4,
00112     GXV_GLYPHOFFSET_SHORT,
00113     GXV_GLYPHOFFSET_ULONG  = 8,
00114     GXV_GLYPHOFFSET_LONG
00115 
00116   } GXV_GlyphOffset_Format;
00117 
00118 
00119 #define GXV_GLYPHOFFSET_FMT( table )           \
00120         ( valid->table.entry_glyphoffset_fmt )
00121 
00122 #define GXV_GLYPHOFFSET_SIZE( table )              \
00123         ( valid->table.entry_glyphoffset_fmt / 2 )
00124 
00125 
00126   /* ----------------------- 16bit StateTable ---------------------------- */
00127 
00128   typedef union  GXV_StateTable_GlyphOffsetDesc_
00129   {
00130     FT_Byte    uc;
00131     FT_UShort  u;       /* same as GXV_LookupValueDesc */
00132     FT_ULong   ul;
00133     FT_Char    c;
00134     FT_Short   s;       /* same as GXV_LookupValueDesc */
00135     FT_Long    l;
00136 
00137   } GXV_StateTable_GlyphOffsetDesc;
00138 
00139   typedef const GXV_StateTable_GlyphOffsetDesc* GXV_StateTable_GlyphOffsetCPtr;
00140 
00141   typedef void
00142   (*GXV_StateTable_Subtable_Setup_Func)( FT_UShort      table_size,
00143                                          FT_UShort      classTable,
00144                                          FT_UShort      stateArray,
00145                                          FT_UShort      entryTable,
00146                                          FT_UShort*     classTable_length_p,
00147                                          FT_UShort*     stateArray_length_p,
00148                                          FT_UShort*     entryTable_length_p,
00149                                          GXV_Validator  valid );
00150 
00151   typedef void
00152   (*GXV_StateTable_Entry_Validate_Func)(
00153      FT_Byte                         state,
00154      FT_UShort                       flags,
00155      GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
00156      FT_Bytes                        statetable_table,
00157      FT_Bytes                        statetable_limit,
00158      GXV_Validator                   valid );
00159 
00160   typedef void
00161   (*GXV_StateTable_OptData_Load_Func)( FT_Bytes       table,
00162                                        FT_Bytes       limit,
00163                                        GXV_Validator  valid );
00164 
00165   typedef struct  GXV_StateTable_ValidatorRec_
00166   {
00167     GXV_GlyphOffset_Format              entry_glyphoffset_fmt;
00168     void*                               optdata;
00169 
00170     GXV_StateTable_Subtable_Setup_Func  subtable_setup_func;
00171     GXV_StateTable_Entry_Validate_Func  entry_validate_func;
00172     GXV_StateTable_OptData_Load_Func    optdata_load_func;
00173 
00174   } GXV_StateTable_ValidatorRec, *GXV_StateTable_ValidatorRecData;
00175 
00176 
00177   /* ---------------------- 32bit XStateTable ---------------------------- */
00178 
00179   typedef GXV_StateTable_GlyphOffsetDesc  GXV_XStateTable_GlyphOffsetDesc;
00180 
00181   typedef const GXV_XStateTable_GlyphOffsetDesc* GXV_XStateTable_GlyphOffsetCPtr;
00182 
00183   typedef void
00184   (*GXV_XStateTable_Subtable_Setup_Func)( FT_ULong       table_size,
00185                                           FT_ULong       classTable,
00186                                           FT_ULong       stateArray,
00187                                           FT_ULong       entryTable,
00188                                           FT_ULong*      classTable_length_p,
00189                                           FT_ULong*      stateArray_length_p,
00190                                           FT_ULong*      entryTable_length_p,
00191                                           GXV_Validator  valid );
00192 
00193   typedef void
00194   (*GXV_XStateTable_Entry_Validate_Func)(
00195      FT_UShort                       state,
00196      FT_UShort                       flags,
00197      GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
00198      FT_Bytes                        xstatetable_table,
00199      FT_Bytes                        xstatetable_limit,
00200      GXV_Validator                   valid );
00201 
00202 
00203   typedef GXV_StateTable_OptData_Load_Func  GXV_XStateTable_OptData_Load_Func;
00204 
00205 
00206   typedef struct  GXV_XStateTable_ValidatorRec_
00207   {
00208     int                                  entry_glyphoffset_fmt;
00209     void*                                optdata;
00210 
00211     GXV_XStateTable_Subtable_Setup_Func  subtable_setup_func;
00212     GXV_XStateTable_Entry_Validate_Func  entry_validate_func;
00213     GXV_XStateTable_OptData_Load_Func    optdata_load_func;
00214 
00215     FT_ULong                             nClasses;
00216     FT_UShort                            maxClassID;
00217 
00218   } GXV_XStateTable_ValidatorRec, *GXV_XStateTable_ValidatorRecData;
00219 
00220 
00221   /* ===================================================================== */
00222 
00223   typedef struct  GXV_ValidatorRec_
00224   {
00225     FT_Validator  root;
00226 
00227     FT_Face       face;
00228     void*         table_data;
00229 
00230     FT_ULong      subtable_length;
00231 
00232     GXV_LookupValue_SignSpec        lookupval_sign;
00233     GXV_Lookup_Value_Validate_Func  lookupval_func;
00234     GXV_Lookup_Fmt4_Transit_Func    lookupfmt4_trans;
00235     FT_Bytes                        lookuptbl_head;
00236 
00237     GXV_StateTable_ValidatorRec     statetable;
00238     GXV_XStateTable_ValidatorRec    xstatetable;
00239 
00240 #ifdef FT_DEBUG_LEVEL_TRACE
00241     FT_UInt             debug_indent;
00242     const FT_String*    debug_function_name[3];
00243 #endif
00244 
00245   } GXV_ValidatorRec;
00246 
00247 
00248 #define GXV_TABLE_DATA( tag, field )                           \
00249         ( ( (GXV_ ## tag ## _Data)valid->table_data )->field )
00250 
00251 #undef  FT_INVALID_
00252 #define FT_INVALID_( _prefix, _error )                         \
00253           ft_validator_error( valid->root, _prefix ## _error )
00254 
00255 #define GXV_LIMIT_CHECK( _count )                                     \
00256           FT_BEGIN_STMNT                                              \
00257             if ( p + _count > ( limit? limit : valid->root->limit ) ) \
00258               FT_INVALID_TOO_SHORT;                                   \
00259           FT_END_STMNT
00260 
00261 
00262 #ifdef FT_DEBUG_LEVEL_TRACE
00263 
00264 #define GXV_INIT  valid->debug_indent = 0
00265 
00266 #define GXV_NAME_ENTER( name )                             \
00267           FT_BEGIN_STMNT                                   \
00268             valid->debug_indent += 2;                      \
00269             FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
00270             FT_TRACE4(( "%s table\n", name ));             \
00271           FT_END_STMNT
00272 
00273 #define GXV_EXIT  valid->debug_indent -= 2
00274 
00275 #define GXV_TRACE( s )                                     \
00276           FT_BEGIN_STMNT                                   \
00277             FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
00278             FT_TRACE4( s );                                \
00279           FT_END_STMNT
00280 
00281 #else /* !FT_DEBUG_LEVEL_TRACE */
00282 
00283 #define GXV_INIT                do { } while ( 0 )
00284 #define GXV_NAME_ENTER( name )  do { } while ( 0 )
00285 #define GXV_EXIT                do { } while ( 0 )
00286 
00287 #define GXV_TRACE( s )          do { } while ( 0 )
00288 
00289 #endif  /* !FT_DEBUG_LEVEL_TRACE */
00290 
00291 
00292   /*************************************************************************/
00293   /*************************************************************************/
00294   /*****                                                               *****/
00295   /*****                    32bit alignment checking                   *****/
00296   /*****                                                               *****/
00297   /*************************************************************************/
00298   /*************************************************************************/
00299 
00300 #define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \
00301           FT_BEGIN_STMNT                  \
00302             {                             \
00303               if ( 0 != ( (a) % 4 ) )     \
00304                 FT_INVALID_OFFSET ;       \
00305             }                             \
00306           FT_END_STMNT
00307 
00308 
00309   /*************************************************************************/
00310   /*************************************************************************/
00311   /*****                                                               *****/
00312   /*****                    Dumping Binary Data                        *****/
00313   /*****                                                               *****/
00314   /*************************************************************************/
00315   /*************************************************************************/
00316 
00317 #define GXV_TRACE_HEXDUMP( p, len )                     \
00318           FT_BEGIN_STMNT                                \
00319             {                                           \
00320               FT_Bytes  b;                              \
00321                                                         \
00322                                                         \
00323               for ( b = p; b < (FT_Bytes)p + len; b++ ) \
00324                 FT_TRACE1(("\\x%02x", *b)) ;            \
00325             }                                           \
00326           FT_END_STMNT
00327 
00328 #define GXV_TRACE_HEXDUMP_C( p, len )                   \
00329           FT_BEGIN_STMNT                                \
00330             {                                           \
00331               FT_Bytes  b;                              \
00332                                                         \
00333                                                         \
00334               for ( b = p; b < (FT_Bytes)p + len; b++ ) \
00335                 if ( 0x40 < *b && *b < 0x7e )           \
00336                   FT_TRACE1(("%c", *b)) ;               \
00337                 else                                    \
00338                   FT_TRACE1(("\\x%02x", *b)) ;          \
00339             }                                           \
00340           FT_END_STMNT
00341 
00342 #define GXV_TRACE_HEXDUMP_SFNTNAME( n )               \
00343           GXV_TRACE_HEXDUMP( n.string, n.string_len )
00344 
00345 
00346   /*************************************************************************/
00347   /*************************************************************************/
00348   /*****                                                               *****/
00349   /*****                         LOOKUP TABLE                          *****/
00350   /*****                                                               *****/
00351   /*************************************************************************/
00352   /*************************************************************************/
00353 
00354   FT_LOCAL( void )
00355   gxv_BinSrchHeader_validate( FT_Bytes       p,
00356                               FT_Bytes       limit,
00357                               FT_UShort*     unitSize_p,
00358                               FT_UShort*     nUnits_p,
00359                               GXV_Validator  valid );
00360 
00361   FT_LOCAL( void )
00362   gxv_LookupTable_validate( FT_Bytes       table,
00363                             FT_Bytes       limit,
00364                             GXV_Validator  valid );
00365 
00366 
00367   /*************************************************************************/
00368   /*************************************************************************/
00369   /*****                                                               *****/
00370   /*****                          Glyph ID                             *****/
00371   /*****                                                               *****/
00372   /*************************************************************************/
00373   /*************************************************************************/
00374 
00375   FT_LOCAL( FT_Int )
00376   gxv_glyphid_validate( FT_UShort      gid,
00377                         GXV_Validator  valid );
00378 
00379 
00380   /*************************************************************************/
00381   /*************************************************************************/
00382   /*****                                                               *****/
00383   /*****                        CONTROL POINT                          *****/
00384   /*****                                                               *****/
00385   /*************************************************************************/
00386   /*************************************************************************/
00387 
00388   FT_LOCAL( void )
00389   gxv_ctlPoint_validate( FT_UShort      gid,
00390                          FT_Short       ctl_point,
00391                          GXV_Validator  valid );
00392 
00393 
00394   /*************************************************************************/
00395   /*************************************************************************/
00396   /*****                                                               *****/
00397   /*****                          SFNT NAME                            *****/
00398   /*****                                                               *****/
00399   /*************************************************************************/
00400   /*************************************************************************/
00401 
00402   FT_LOCAL( void )
00403   gxv_sfntName_validate( FT_UShort      name_index,
00404                          FT_UShort      min_index,
00405                          FT_UShort      max_index,
00406                          GXV_Validator  valid );
00407 
00408 
00409   /*************************************************************************/
00410   /*************************************************************************/
00411   /*****                                                               *****/
00412   /*****                          STATE TABLE                          *****/
00413   /*****                                                               *****/
00414   /*************************************************************************/
00415   /*************************************************************************/
00416 
00417   FT_LOCAL( void )
00418   gxv_StateTable_subtable_setup( FT_UShort      table_size,
00419                                  FT_UShort      classTable,
00420                                  FT_UShort      stateArray,
00421                                  FT_UShort      entryTable,
00422                                  FT_UShort*     classTable_length_p,
00423                                  FT_UShort*     stateArray_length_p,
00424                                  FT_UShort*     entryTable_length_p,
00425                                  GXV_Validator  valid );
00426 
00427   FT_LOCAL( void )
00428   gxv_XStateTable_subtable_setup( FT_ULong       table_size,
00429                                   FT_ULong       classTable,
00430                                   FT_ULong       stateArray,
00431                                   FT_ULong       entryTable,
00432                                   FT_ULong*      classTable_length_p,
00433                                   FT_ULong*      stateArray_length_p,
00434                                   FT_ULong*      entryTable_length_p,
00435                                   GXV_Validator  valid );
00436 
00437   FT_LOCAL( void )
00438   gxv_StateTable_validate( FT_Bytes       table,
00439                            FT_Bytes       limit,
00440                            GXV_Validator  valid );
00441 
00442   FT_LOCAL( void )
00443   gxv_XStateTable_validate( FT_Bytes       table,
00444                             FT_Bytes       limit,
00445                             GXV_Validator  valid );
00446 
00447 
00448   /*************************************************************************/
00449   /*************************************************************************/
00450   /*****                                                               *****/
00451   /*****                 UTILITY MACROS AND FUNCTIONS                  *****/
00452   /*****                                                               *****/
00453   /*************************************************************************/
00454   /*************************************************************************/
00455 
00456   FT_LOCAL( void )
00457   gxv_array_getlimits_byte( FT_Bytes       table,
00458                             FT_Bytes       limit,
00459                             FT_Byte*       min,
00460                             FT_Byte*       max,
00461                             GXV_Validator  valid );
00462 
00463   FT_LOCAL( void )
00464   gxv_array_getlimits_ushort( FT_Bytes       table,
00465                               FT_Bytes       limit,
00466                               FT_UShort*     min,
00467                               FT_UShort*     max,
00468                               GXV_Validator  valid );
00469 
00470   FT_LOCAL( void )
00471   gxv_set_length_by_ushort_offset( FT_UShort*     offset,
00472                                    FT_UShort**    length,
00473                                    FT_UShort*     buff,
00474                                    FT_UInt        nmemb,
00475                                    FT_UShort      limit,
00476                                    GXV_Validator  valid );
00477 
00478   FT_LOCAL( void )
00479   gxv_set_length_by_ulong_offset( FT_ULong*      offset,
00480                                   FT_ULong**     length,
00481                                   FT_ULong*      buff,
00482                                   FT_UInt        nmemb,
00483                                   FT_ULong       limit,
00484                                   GXV_Validator  valid);
00485 
00486 
00487 #define GXV_SUBTABLE_OFFSET_CHECK( _offset )          \
00488           FT_BEGIN_STMNT                              \
00489             if ( (_offset) > valid->subtable_length ) \
00490               FT_INVALID_OFFSET;                      \
00491           FT_END_STMNT
00492 
00493 #define GXV_SUBTABLE_LIMIT_CHECK( _count )                  \
00494           FT_BEGIN_STMNT                                    \
00495             if ( ( p + (_count) - valid->subtable_start ) > \
00496                    valid->subtable_length )                 \
00497               FT_INVALID_TOO_SHORT;                         \
00498           FT_END_STMNT
00499 
00500 #define GXV_USHORT_TO_SHORT( _us )                                    \
00501           ( ( 0x8000U < ( _us ) ) ? ( ( _us ) - 0x8000U ) : ( _us ) )
00502 
00503 #define GXV_STATETABLE_HEADER_SIZE  ( 2 + 2 + 2 + 2 )
00504 #define GXV_STATEHEADER_SIZE        GXV_STATETABLE_HEADER_SIZE
00505 
00506 #define GXV_XSTATETABLE_HEADER_SIZE  ( 4 + 4 + 4 + 4 )
00507 #define GXV_XSTATEHEADER_SIZE        GXV_XSTATETABLE_HEADER_SIZE
00508 
00509 
00510   /*************************************************************************/
00511   /*************************************************************************/
00512   /*****                                                               *****/
00513   /*****                        Table overlapping                      *****/
00514   /*****                                                               *****/
00515   /*************************************************************************/
00516   /*************************************************************************/
00517 
00518   typedef struct  GXV_odtect_DataRec_
00519   {
00520     FT_Bytes    start;
00521     FT_ULong    length;
00522     FT_String*  name;
00523 
00524   } GXV_odtect_DataRec,  *GXV_odtect_Data;
00525 
00526   typedef struct  GXV_odtect_RangeRec_
00527   {
00528     FT_UInt          nRanges;
00529     GXV_odtect_Data  range;
00530 
00531   } GXV_odtect_RangeRec, *GXV_odtect_Range;
00532 
00533 
00534   FT_LOCAL( void )
00535   gxv_odtect_add_range( FT_Bytes          start,
00536                         FT_ULong          length,
00537                         const FT_String*  name,
00538                         GXV_odtect_Range  odtect );
00539 
00540   FT_LOCAL( void )
00541   gxv_odtect_validate( GXV_odtect_Range  odtect,
00542                        GXV_Validator     valid );
00543 
00544 
00545 #define GXV_ODTECT( n, odtect )                              \
00546           GXV_odtect_DataRec   odtect ## _range[n];          \
00547           GXV_odtect_RangeRec  odtect ## _rec = { 0, NULL }; \
00548           GXV_odtect_Range     odtect = NULL
00549 
00550 #define GXV_ODTECT_INIT( odtect )                      \
00551           FT_BEGIN_STMNT                               \
00552             odtect ## _rec.nRanges = 0;                \
00553             odtect ## _rec.range   = odtect ## _range; \
00554             odtect                 = & odtect ## _rec; \
00555           FT_END_STMNT
00556 
00557 
00558  /* */
00559 
00560 FT_END_HEADER
00561 
00562 #endif /* __GXVCOMMN_H__ */
00563 
00564 
00565 /* END */

Generated on Tue Jul 5 14:13:47 2011 for ROOT_528-00b_version by  doxygen 1.5.1