misc/libfreetype/src/gxvalid/gxvmorx.c
changeset 9431 0f5961910e27
parent 9357 a501f5ec7b34
parent 9429 7a97a554ac80
child 9433 f0a8ac191839
equal deleted inserted replaced
9357:a501f5ec7b34 9431:0f5961910e27
     1 /***************************************************************************/
       
     2 /*                                                                         */
       
     3 /*  gxvmorx.c                                                              */
       
     4 /*                                                                         */
       
     5 /*    TrueTypeGX/AAT morx table validation (body).                         */
       
     6 /*                                                                         */
       
     7 /*  Copyright 2005, 2008 by                                                */
       
     8 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
       
     9 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
       
    10 /*                                                                         */
       
    11 /*  This file is part of the FreeType project, and may only be used,       */
       
    12 /*  modified, and distributed under the terms of the FreeType project      */
       
    13 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
       
    14 /*  this file you indicate that you have read the license and              */
       
    15 /*  understand and accept it fully.                                        */
       
    16 /*                                                                         */
       
    17 /***************************************************************************/
       
    18 
       
    19 /***************************************************************************/
       
    20 /*                                                                         */
       
    21 /* gxvalid is derived from both gxlayout module and otvalid module.        */
       
    22 /* Development of gxlayout is supported by the Information-technology      */
       
    23 /* Promotion Agency(IPA), Japan.                                           */
       
    24 /*                                                                         */
       
    25 /***************************************************************************/
       
    26 
       
    27 
       
    28 #include "gxvmorx.h"
       
    29 
       
    30 
       
    31   /*************************************************************************/
       
    32   /*                                                                       */
       
    33   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
       
    34   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
       
    35   /* messages during execution.                                            */
       
    36   /*                                                                       */
       
    37 #undef  FT_COMPONENT
       
    38 #define FT_COMPONENT  trace_gxvmorx
       
    39 
       
    40 
       
    41   static void
       
    42   gxv_morx_subtables_validate( FT_Bytes       table,
       
    43                                FT_Bytes       limit,
       
    44                                FT_UShort      nSubtables,
       
    45                                GXV_Validator  valid )
       
    46   {
       
    47     FT_Bytes  p = table;
       
    48 
       
    49     GXV_Validate_Func fmt_funcs_table[] =
       
    50     {
       
    51       gxv_morx_subtable_type0_validate, /* 0 */
       
    52       gxv_morx_subtable_type1_validate, /* 1 */
       
    53       gxv_morx_subtable_type2_validate, /* 2 */
       
    54       NULL,                             /* 3 */
       
    55       gxv_morx_subtable_type4_validate, /* 4 */
       
    56       gxv_morx_subtable_type5_validate, /* 5 */
       
    57 
       
    58     };
       
    59 
       
    60     GXV_Validate_Func  func;
       
    61 
       
    62     FT_UShort  i;
       
    63 
       
    64 
       
    65     GXV_NAME_ENTER( "subtables in a chain" );
       
    66 
       
    67     for ( i = 0; i < nSubtables; i++ )
       
    68     {
       
    69       FT_ULong  length;
       
    70       FT_ULong  coverage;
       
    71       FT_ULong  subFeatureFlags;
       
    72       FT_ULong  type;
       
    73       FT_ULong  rest;
       
    74 
       
    75 
       
    76       GXV_LIMIT_CHECK( 4 + 4 + 4 );
       
    77       length          = FT_NEXT_ULONG( p );
       
    78       coverage        = FT_NEXT_ULONG( p );
       
    79       subFeatureFlags = FT_NEXT_ULONG( p );
       
    80 
       
    81       GXV_TRACE(( "validating chain subtable %d/%d (%d bytes)\n",
       
    82                   i + 1, nSubtables, length ));
       
    83 
       
    84       type = coverage & 0x0007;
       
    85       rest = length - ( 4 + 4 + 4 );
       
    86       GXV_LIMIT_CHECK( rest );
       
    87 
       
    88       /* morx coverage consists of mort_coverage & 16bit padding */
       
    89       gxv_mort_coverage_validate( (FT_UShort)( ( coverage >> 16 ) | coverage ),
       
    90                                   valid );
       
    91       if ( type > 5 )
       
    92         FT_INVALID_FORMAT;
       
    93 
       
    94       func = fmt_funcs_table[type];
       
    95       if ( func == NULL )
       
    96         GXV_TRACE(( "morx type %d is reserved\n", type ));
       
    97 
       
    98       func( p, p + rest, valid );
       
    99 
       
   100       p += rest;
       
   101     }
       
   102 
       
   103     valid->subtable_length = p - table;
       
   104 
       
   105     GXV_EXIT;
       
   106   }
       
   107 
       
   108 
       
   109   static void
       
   110   gxv_morx_chain_validate( FT_Bytes       table,
       
   111                            FT_Bytes       limit,
       
   112                            GXV_Validator  valid )
       
   113   {
       
   114     FT_Bytes  p = table;
       
   115     FT_ULong  defaultFlags;
       
   116     FT_ULong  chainLength;
       
   117     FT_ULong  nFeatureFlags;
       
   118     FT_ULong  nSubtables;
       
   119 
       
   120 
       
   121     GXV_NAME_ENTER( "morx chain header" );
       
   122 
       
   123     GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 );
       
   124     defaultFlags  = FT_NEXT_ULONG( p );
       
   125     chainLength   = FT_NEXT_ULONG( p );
       
   126     nFeatureFlags = FT_NEXT_ULONG( p );
       
   127     nSubtables    = FT_NEXT_ULONG( p );
       
   128 
       
   129     /* feature-array of morx is same with that of mort */
       
   130     gxv_mort_featurearray_validate( p, limit, nFeatureFlags, valid );
       
   131     p += valid->subtable_length;
       
   132 
       
   133     if ( nSubtables >= 0x10000L )
       
   134       FT_INVALID_DATA;
       
   135 
       
   136     gxv_morx_subtables_validate( p, table + chainLength,
       
   137                                  (FT_UShort)nSubtables, valid );
       
   138 
       
   139     valid->subtable_length = chainLength;
       
   140 
       
   141     GXV_EXIT;
       
   142   }
       
   143 
       
   144 
       
   145   FT_LOCAL_DEF( void )
       
   146   gxv_morx_validate( FT_Bytes      table,
       
   147                      FT_Face       face,
       
   148                      FT_Validator  ftvalid )
       
   149   {
       
   150     GXV_ValidatorRec  validrec;
       
   151     GXV_Validator     valid = &validrec;
       
   152     FT_Bytes          p     = table;
       
   153     FT_Bytes          limit = 0;
       
   154     FT_ULong          version;
       
   155     FT_ULong          nChains;
       
   156     FT_ULong          i;
       
   157 
       
   158 
       
   159     valid->root = ftvalid;
       
   160     valid->face = face;
       
   161 
       
   162     FT_TRACE3(( "validating `morx' table\n" ));
       
   163     GXV_INIT;
       
   164 
       
   165     GXV_LIMIT_CHECK( 4 + 4 );
       
   166     version = FT_NEXT_ULONG( p );
       
   167     nChains = FT_NEXT_ULONG( p );
       
   168 
       
   169     if ( version != 0x00020000UL )
       
   170       FT_INVALID_FORMAT;
       
   171 
       
   172     for ( i = 0; i < nChains; i++ )
       
   173     {
       
   174       GXV_TRACE(( "validating chain %d/%d\n", i + 1, nChains ));
       
   175       GXV_32BIT_ALIGNMENT_VALIDATE( p - table );
       
   176       gxv_morx_chain_validate( p, limit, valid );
       
   177       p += valid->subtable_length;
       
   178     }
       
   179 
       
   180     FT_TRACE4(( "\n" ));
       
   181   }
       
   182 
       
   183 
       
   184 /* END */