misc/libfreetype/src/otvalid/otvgdef.c
branchwebgl
changeset 9521 8054d9d775fd
parent 9282 92af50454cf2
parent 9519 b8b5c82eb61b
child 9950 2759212a27de
equal deleted inserted replaced
9282:92af50454cf2 9521:8054d9d775fd
     1 /***************************************************************************/
       
     2 /*                                                                         */
       
     3 /*  otvgdef.c                                                              */
       
     4 /*                                                                         */
       
     5 /*    OpenType GDEF table validation (body).                               */
       
     6 /*                                                                         */
       
     7 /*  Copyright 2004, 2005, 2007 by                                          */
       
     8 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
       
     9 /*                                                                         */
       
    10 /*  This file is part of the FreeType project, and may only be used,       */
       
    11 /*  modified, and distributed under the terms of the FreeType project      */
       
    12 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
       
    13 /*  this file you indicate that you have read the license and              */
       
    14 /*  understand and accept it fully.                                        */
       
    15 /*                                                                         */
       
    16 /***************************************************************************/
       
    17 
       
    18 
       
    19 #include "otvalid.h"
       
    20 #include "otvcommn.h"
       
    21 
       
    22 
       
    23   /*************************************************************************/
       
    24   /*                                                                       */
       
    25   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
       
    26   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
       
    27   /* messages during execution.                                            */
       
    28   /*                                                                       */
       
    29 #undef  FT_COMPONENT
       
    30 #define FT_COMPONENT  trace_otvgdef
       
    31 
       
    32 
       
    33   /*************************************************************************/
       
    34   /*************************************************************************/
       
    35   /*****                                                               *****/
       
    36   /*****                      UTILITY FUNCTIONS                        *****/
       
    37   /*****                                                               *****/
       
    38   /*************************************************************************/
       
    39   /*************************************************************************/
       
    40 
       
    41 #define AttachListFunc    otv_O_x_Ox
       
    42 #define LigCaretListFunc  otv_O_x_Ox
       
    43 
       
    44   /* sets valid->extra1 (0)           */
       
    45 
       
    46   static void
       
    47   otv_O_x_Ox( FT_Bytes       table,
       
    48               OTV_Validator  valid )
       
    49   {
       
    50     FT_Bytes           p = table;
       
    51     FT_Bytes           Coverage;
       
    52     FT_UInt            GlyphCount;
       
    53     OTV_Validate_Func  func;
       
    54 
       
    55 
       
    56     OTV_ENTER;
       
    57 
       
    58     OTV_LIMIT_CHECK( 4 );
       
    59     Coverage   = table + FT_NEXT_USHORT( p );
       
    60     GlyphCount = FT_NEXT_USHORT( p );
       
    61 
       
    62     OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount ));
       
    63 
       
    64     otv_Coverage_validate( Coverage, valid, GlyphCount );
       
    65     if ( GlyphCount != otv_Coverage_get_count( Coverage ) )
       
    66       FT_INVALID_DATA;
       
    67 
       
    68     OTV_LIMIT_CHECK( GlyphCount * 2 );
       
    69 
       
    70     valid->nesting_level++;
       
    71     func          = valid->func[valid->nesting_level];
       
    72     valid->extra1 = 0;
       
    73 
       
    74     for ( ; GlyphCount > 0; GlyphCount-- )
       
    75       func( table + FT_NEXT_USHORT( p ), valid );
       
    76 
       
    77     valid->nesting_level--;
       
    78 
       
    79     OTV_EXIT;
       
    80   }
       
    81 
       
    82 
       
    83   /*************************************************************************/
       
    84   /*************************************************************************/
       
    85   /*****                                                               *****/
       
    86   /*****                       LIGATURE CARETS                         *****/
       
    87   /*****                                                               *****/
       
    88   /*************************************************************************/
       
    89   /*************************************************************************/
       
    90 
       
    91 #define CaretValueFunc  otv_CaretValue_validate
       
    92 
       
    93   static void
       
    94   otv_CaretValue_validate( FT_Bytes       table,
       
    95                            OTV_Validator  valid )
       
    96   {
       
    97     FT_Bytes  p = table;
       
    98     FT_UInt   CaretValueFormat;
       
    99 
       
   100 
       
   101     OTV_ENTER;
       
   102 
       
   103     OTV_LIMIT_CHECK( 4 );
       
   104 
       
   105     CaretValueFormat = FT_NEXT_USHORT( p );
       
   106 
       
   107     OTV_TRACE(( " (format = %d)\n", CaretValueFormat ));
       
   108 
       
   109     switch ( CaretValueFormat )
       
   110     {
       
   111     case 1:     /* CaretValueFormat1 */
       
   112       /* skip Coordinate, no test */
       
   113       break;
       
   114 
       
   115     case 2:     /* CaretValueFormat2 */
       
   116       /* skip CaretValuePoint, no test */
       
   117       break;
       
   118 
       
   119     case 3:     /* CaretValueFormat3 */
       
   120       p += 2;   /* skip Coordinate */
       
   121 
       
   122       OTV_LIMIT_CHECK( 2 );
       
   123 
       
   124       /* DeviceTable */
       
   125       otv_Device_validate( table + FT_NEXT_USHORT( p ), valid );
       
   126       break;
       
   127 
       
   128     default:
       
   129       FT_INVALID_FORMAT;
       
   130     }
       
   131 
       
   132     OTV_EXIT;
       
   133   }
       
   134 
       
   135 
       
   136   /*************************************************************************/
       
   137   /*************************************************************************/
       
   138   /*****                                                               *****/
       
   139   /*****                         GDEF TABLE                            *****/
       
   140   /*****                                                               *****/
       
   141   /*************************************************************************/
       
   142   /*************************************************************************/
       
   143 
       
   144   /* sets valid->glyph_count */
       
   145 
       
   146   FT_LOCAL_DEF( void )
       
   147   otv_GDEF_validate( FT_Bytes      table,
       
   148                      FT_Bytes      gsub,
       
   149                      FT_Bytes      gpos,
       
   150                      FT_UInt       glyph_count,
       
   151                      FT_Validator  ftvalid )
       
   152   {
       
   153     OTV_ValidatorRec  validrec;
       
   154     OTV_Validator     valid = &validrec;
       
   155     FT_Bytes          p     = table;
       
   156     FT_UInt           table_size;
       
   157     FT_Bool           need_MarkAttachClassDef;
       
   158 
       
   159     OTV_OPTIONAL_TABLE( GlyphClassDef );
       
   160     OTV_OPTIONAL_TABLE( AttachListOffset );
       
   161     OTV_OPTIONAL_TABLE( LigCaretListOffset );
       
   162     OTV_OPTIONAL_TABLE( MarkAttachClassDef );
       
   163 
       
   164 
       
   165     valid->root = ftvalid;
       
   166 
       
   167     FT_TRACE3(( "validating GDEF table\n" ));
       
   168     OTV_INIT;
       
   169 
       
   170     OTV_LIMIT_CHECK( 12 );
       
   171 
       
   172     if ( FT_NEXT_ULONG( p ) != 0x10000UL )          /* Version */
       
   173       FT_INVALID_FORMAT;
       
   174 
       
   175     /* MarkAttachClassDef has been added to the OpenType */
       
   176     /* specification without increasing GDEF's version,  */
       
   177     /* so we use this ugly hack to find out whether the  */
       
   178     /* table is needed actually.                         */
       
   179 
       
   180     need_MarkAttachClassDef = FT_BOOL(
       
   181       otv_GSUBGPOS_have_MarkAttachmentType_flag( gsub ) ||
       
   182       otv_GSUBGPOS_have_MarkAttachmentType_flag( gpos ) );
       
   183 
       
   184     if ( need_MarkAttachClassDef )
       
   185       table_size = 12;              /* OpenType >= 1.2 */
       
   186     else
       
   187       table_size = 10;              /* OpenType < 1.2  */
       
   188 
       
   189     valid->glyph_count = glyph_count;
       
   190 
       
   191     OTV_OPTIONAL_OFFSET( GlyphClassDef );
       
   192     OTV_SIZE_CHECK( GlyphClassDef );
       
   193     if ( GlyphClassDef )
       
   194       otv_ClassDef_validate( table + GlyphClassDef, valid );
       
   195 
       
   196     OTV_OPTIONAL_OFFSET( AttachListOffset );
       
   197     OTV_SIZE_CHECK( AttachListOffset );
       
   198     if ( AttachListOffset )
       
   199     {
       
   200       OTV_NEST2( AttachList, AttachPoint );
       
   201       OTV_RUN( table + AttachListOffset, valid );
       
   202     }
       
   203 
       
   204     OTV_OPTIONAL_OFFSET( LigCaretListOffset );
       
   205     OTV_SIZE_CHECK( LigCaretListOffset );
       
   206     if ( LigCaretListOffset )
       
   207     {
       
   208       OTV_NEST3( LigCaretList, LigGlyph, CaretValue );
       
   209       OTV_RUN( table + LigCaretListOffset, valid );
       
   210     }
       
   211 
       
   212     if ( need_MarkAttachClassDef )
       
   213     {
       
   214       OTV_OPTIONAL_OFFSET( MarkAttachClassDef );
       
   215       OTV_SIZE_CHECK( MarkAttachClassDef );
       
   216       if ( MarkAttachClassDef )
       
   217         otv_ClassDef_validate( table + MarkAttachClassDef, valid );
       
   218     }
       
   219 
       
   220     FT_TRACE4(( "\n" ));
       
   221   }
       
   222 
       
   223 
       
   224 /* END */