otvbase.c

Go to the documentation of this file.
00001 /***************************************************************************/
00002 /*                                                                         */
00003 /*  otvbase.c                                                              */
00004 /*                                                                         */
00005 /*    OpenType BASE table validation (body).                               */
00006 /*                                                                         */
00007 /*  Copyright 2004, 2007 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 #include "otvalid.h"
00020 #include "otvcommn.h"
00021 
00022 
00023   /*************************************************************************/
00024   /*                                                                       */
00025   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
00026   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
00027   /* messages during execution.                                            */
00028   /*                                                                       */
00029 #undef  FT_COMPONENT
00030 #define FT_COMPONENT  trace_otvbase
00031 
00032 
00033   static void
00034   otv_BaseCoord_validate( FT_Bytes       table,
00035                           OTV_Validator  valid )
00036   {
00037     FT_Bytes  p = table;
00038     FT_UInt   BaseCoordFormat;
00039 
00040 
00041     OTV_NAME_ENTER( "BaseCoord" );
00042 
00043     OTV_LIMIT_CHECK( 4 );
00044     BaseCoordFormat = FT_NEXT_USHORT( p );
00045     p += 2;     /* skip Coordinate */
00046 
00047     OTV_TRACE(( " (format %d)\n", BaseCoordFormat ));
00048 
00049     switch ( BaseCoordFormat )
00050     {
00051     case 1:     /* BaseCoordFormat1 */
00052       break;
00053 
00054     case 2:     /* BaseCoordFormat2 */
00055       OTV_LIMIT_CHECK( 4 );   /* ReferenceGlyph, BaseCoordPoint */
00056       break;
00057 
00058     case 3:     /* BaseCoordFormat3 */
00059       OTV_LIMIT_CHECK( 2 );
00060       /* DeviceTable */
00061       otv_Device_validate( table + FT_NEXT_USHORT( p ), valid );
00062       break;
00063 
00064     default:
00065       FT_INVALID_FORMAT;
00066     }
00067 
00068     OTV_EXIT;
00069   }
00070 
00071 
00072   static void
00073   otv_BaseTagList_validate( FT_Bytes       table,
00074                             OTV_Validator  valid )
00075   {
00076     FT_Bytes  p = table;
00077     FT_UInt   BaseTagCount;
00078 
00079 
00080     OTV_NAME_ENTER( "BaseTagList" );
00081 
00082     OTV_LIMIT_CHECK( 2 );
00083 
00084     BaseTagCount = FT_NEXT_USHORT( p );
00085 
00086     OTV_TRACE(( " (BaseTagCount = %d)\n", BaseTagCount ));
00087 
00088     OTV_LIMIT_CHECK( BaseTagCount * 4 );          /* BaselineTag */
00089 
00090     OTV_EXIT;
00091   }
00092 
00093 
00094   static void
00095   otv_BaseValues_validate( FT_Bytes       table,
00096                            OTV_Validator  valid )
00097   {
00098     FT_Bytes  p = table;
00099     FT_UInt   BaseCoordCount;
00100 
00101 
00102     OTV_NAME_ENTER( "BaseValues" );
00103 
00104     OTV_LIMIT_CHECK( 4 );
00105 
00106     p             += 2;                     /* skip DefaultIndex */
00107     BaseCoordCount = FT_NEXT_USHORT( p );
00108 
00109     OTV_TRACE(( " (BaseCoordCount = %d)\n", BaseCoordCount ));
00110 
00111     OTV_LIMIT_CHECK( BaseCoordCount * 2 );
00112 
00113     /* BaseCoord */
00114     for ( ; BaseCoordCount > 0; BaseCoordCount-- )
00115       otv_BaseCoord_validate( table + FT_NEXT_USHORT( p ), valid );
00116 
00117     OTV_EXIT;
00118   }
00119 
00120 
00121   static void
00122   otv_MinMax_validate( FT_Bytes       table,
00123                        OTV_Validator  valid )
00124   {
00125     FT_Bytes  p = table;
00126     FT_UInt   table_size;
00127     FT_UInt   FeatMinMaxCount;
00128 
00129     OTV_OPTIONAL_TABLE( MinCoord );
00130     OTV_OPTIONAL_TABLE( MaxCoord );
00131 
00132 
00133     OTV_NAME_ENTER( "MinMax" );
00134 
00135     OTV_LIMIT_CHECK( 6 );
00136 
00137     OTV_OPTIONAL_OFFSET( MinCoord );
00138     OTV_OPTIONAL_OFFSET( MaxCoord );
00139     FeatMinMaxCount = FT_NEXT_USHORT( p );
00140 
00141     OTV_TRACE(( " (FeatMinMaxCount = %d)\n", FeatMinMaxCount ));
00142 
00143     table_size = FeatMinMaxCount * 8 + 6;
00144 
00145     OTV_SIZE_CHECK( MinCoord );
00146     if ( MinCoord )
00147       otv_BaseCoord_validate( table + MinCoord, valid );
00148 
00149     OTV_SIZE_CHECK( MaxCoord );
00150     if ( MaxCoord )
00151       otv_BaseCoord_validate( table + MaxCoord, valid );
00152 
00153     OTV_LIMIT_CHECK( FeatMinMaxCount * 8 );
00154 
00155     /* FeatMinMaxRecord */
00156     for ( ; FeatMinMaxCount > 0; FeatMinMaxCount-- )
00157     {
00158       p += 4;                           /* skip FeatureTableTag */
00159 
00160       OTV_OPTIONAL_OFFSET( MinCoord );
00161       OTV_OPTIONAL_OFFSET( MaxCoord );
00162 
00163       OTV_SIZE_CHECK( MinCoord );
00164       if ( MinCoord )
00165         otv_BaseCoord_validate( table + MinCoord, valid );
00166 
00167       OTV_SIZE_CHECK( MaxCoord );
00168       if ( MaxCoord )
00169         otv_BaseCoord_validate( table + MaxCoord, valid );
00170     }
00171 
00172     OTV_EXIT;
00173   }
00174 
00175 
00176   static void
00177   otv_BaseScript_validate( FT_Bytes       table,
00178                            OTV_Validator  valid )
00179   {
00180     FT_Bytes  p = table;
00181     FT_UInt   table_size;
00182     FT_UInt   BaseLangSysCount;
00183 
00184     OTV_OPTIONAL_TABLE( BaseValues    );
00185     OTV_OPTIONAL_TABLE( DefaultMinMax );
00186 
00187 
00188     OTV_NAME_ENTER( "BaseScript" );
00189 
00190     OTV_LIMIT_CHECK( 6 );
00191     OTV_OPTIONAL_OFFSET( BaseValues    );
00192     OTV_OPTIONAL_OFFSET( DefaultMinMax );
00193     BaseLangSysCount = FT_NEXT_USHORT( p );
00194 
00195     OTV_TRACE(( " (BaseLangSysCount = %d)\n", BaseLangSysCount ));
00196 
00197     table_size = BaseLangSysCount * 6 + 6;
00198 
00199     OTV_SIZE_CHECK( BaseValues );
00200     if ( BaseValues )
00201       otv_BaseValues_validate( table + BaseValues, valid );
00202 
00203     OTV_SIZE_CHECK( DefaultMinMax );
00204     if ( DefaultMinMax )
00205       otv_MinMax_validate( table + DefaultMinMax, valid );
00206 
00207     OTV_LIMIT_CHECK( BaseLangSysCount * 6 );
00208 
00209     /* BaseLangSysRecord */
00210     for ( ; BaseLangSysCount > 0; BaseLangSysCount-- )
00211     {
00212       p += 4;       /* skip BaseLangSysTag */
00213 
00214       otv_MinMax_validate( table + FT_NEXT_USHORT( p ), valid );
00215     }
00216 
00217     OTV_EXIT;
00218   }
00219 
00220 
00221   static void
00222   otv_BaseScriptList_validate( FT_Bytes       table,
00223                                OTV_Validator  valid )
00224   {
00225     FT_Bytes  p = table;
00226     FT_UInt   BaseScriptCount;
00227 
00228 
00229     OTV_NAME_ENTER( "BaseScriptList" );
00230 
00231     OTV_LIMIT_CHECK( 2 );
00232     BaseScriptCount = FT_NEXT_USHORT( p );
00233 
00234     OTV_TRACE(( " (BaseScriptCount = %d)\n", BaseScriptCount ));
00235 
00236     OTV_LIMIT_CHECK( BaseScriptCount * 6 );
00237 
00238     /* BaseScriptRecord */
00239     for ( ; BaseScriptCount > 0; BaseScriptCount-- )
00240     {
00241       p += 4;       /* skip BaseScriptTag */
00242 
00243       /* BaseScript */
00244       otv_BaseScript_validate( table + FT_NEXT_USHORT( p ), valid );
00245     }
00246 
00247     OTV_EXIT;
00248   }
00249 
00250 
00251   static void
00252   otv_Axis_validate( FT_Bytes       table,
00253                      OTV_Validator  valid )
00254   {
00255     FT_Bytes  p = table;
00256     FT_UInt   table_size;
00257 
00258     OTV_OPTIONAL_TABLE( BaseTagList );
00259 
00260 
00261     OTV_NAME_ENTER( "Axis" );
00262 
00263     OTV_LIMIT_CHECK( 4 );
00264     OTV_OPTIONAL_OFFSET( BaseTagList );
00265 
00266     table_size = 4;
00267 
00268     OTV_SIZE_CHECK( BaseTagList );
00269     if ( BaseTagList )
00270       otv_BaseTagList_validate( table + BaseTagList, valid );
00271 
00272     /* BaseScriptList */
00273     otv_BaseScriptList_validate( table + FT_NEXT_USHORT( p ), valid );
00274 
00275     OTV_EXIT;
00276   }
00277 
00278 
00279   FT_LOCAL_DEF( void )
00280   otv_BASE_validate( FT_Bytes      table,
00281                      FT_Validator  ftvalid )
00282   {
00283     OTV_ValidatorRec  validrec;
00284     OTV_Validator     valid = &validrec;
00285     FT_Bytes          p     = table;
00286     FT_UInt           table_size;
00287 
00288     OTV_OPTIONAL_TABLE( HorizAxis );
00289     OTV_OPTIONAL_TABLE( VertAxis  );
00290 
00291 
00292     valid->root = ftvalid;
00293 
00294     FT_TRACE3(( "validating BASE table\n" ));
00295     OTV_INIT;
00296 
00297     OTV_LIMIT_CHECK( 6 );
00298 
00299     if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */
00300       FT_INVALID_FORMAT;
00301 
00302     table_size = 6;
00303 
00304     OTV_OPTIONAL_OFFSET( HorizAxis );
00305     OTV_SIZE_CHECK( HorizAxis );
00306     if ( HorizAxis )
00307       otv_Axis_validate( table + HorizAxis, valid );
00308 
00309     OTV_OPTIONAL_OFFSET( VertAxis );
00310     OTV_SIZE_CHECK( VertAxis );
00311     if ( VertAxis )
00312       otv_Axis_validate( table + VertAxis, valid );
00313 
00314     FT_TRACE4(( "\n" ));
00315   }
00316 
00317 
00318 /* END */

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