ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

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 Sat May 26 2012 04:32:41 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.