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

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 Sun May 27 2012 04:33:52 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.