misc/libfreetype/src/gxvalid/gxvmort4.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 /*  gxvmort4.c                                                             */
       
     4 /*                                                                         */
       
     5 /*    TrueTypeGX/AAT mort table validation                                 */
       
     6 /*    body for type4 (Non-Contextual Glyph Substitution) subtable.         */
       
     7 /*                                                                         */
       
     8 /*  Copyright 2005 by 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 "gxvmort.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_gxvmort
       
    39 
       
    40 
       
    41   static void
       
    42   gxv_mort_subtable_type4_lookupval_validate( FT_UShort            glyph,
       
    43                                               GXV_LookupValueCPtr  value_p,
       
    44                                               GXV_Validator        valid )
       
    45   {
       
    46     FT_UNUSED( glyph );
       
    47 
       
    48     gxv_glyphid_validate( value_p->u, valid );
       
    49   }
       
    50 
       
    51   /*
       
    52     +===============+ --------+
       
    53     | lookup header |         |
       
    54     +===============+         |
       
    55     | BinSrchHeader |         |
       
    56     +===============+         |
       
    57     | lastGlyph[0]  |         |
       
    58     +---------------+         |
       
    59     | firstGlyph[0] |         |    head of lookup table
       
    60     +---------------+         |             +
       
    61     | offset[0]     |    ->   |          offset            [byte]
       
    62     +===============+         |             +
       
    63     | lastGlyph[1]  |         | (glyphID - firstGlyph) * 2 [byte]
       
    64     +---------------+         |
       
    65     | firstGlyph[1] |         |
       
    66     +---------------+         |
       
    67     | offset[1]     |         |
       
    68     +===============+         |
       
    69                               |
       
    70      ....                     |
       
    71                               |
       
    72     16bit value array         |
       
    73     +===============+         |
       
    74     |     value     | <-------+
       
    75      ....
       
    76   */
       
    77 
       
    78   static GXV_LookupValueDesc
       
    79   gxv_mort_subtable_type4_lookupfmt4_transit(
       
    80     FT_UShort            relative_gindex,
       
    81     GXV_LookupValueCPtr  base_value_p,
       
    82     FT_Bytes             lookuptbl_limit,
       
    83     GXV_Validator        valid )
       
    84   {
       
    85     FT_Bytes             p;
       
    86     FT_Bytes             limit;
       
    87     FT_UShort            offset;
       
    88     GXV_LookupValueDesc  value;
       
    89 
       
    90     /* XXX: check range? */
       
    91     offset = (FT_UShort)( base_value_p->u +
       
    92                           relative_gindex * sizeof ( FT_UShort ) );
       
    93 
       
    94     p     = valid->lookuptbl_head + offset;
       
    95     limit = lookuptbl_limit;
       
    96 
       
    97     GXV_LIMIT_CHECK( 2 );
       
    98     value.u = FT_NEXT_USHORT( p );
       
    99 
       
   100     return value;
       
   101   }
       
   102 
       
   103 
       
   104   FT_LOCAL_DEF( void )
       
   105   gxv_mort_subtable_type4_validate( FT_Bytes       table,
       
   106                                     FT_Bytes       limit,
       
   107                                     GXV_Validator  valid )
       
   108   {
       
   109     FT_Bytes  p = table;
       
   110 
       
   111 
       
   112     GXV_NAME_ENTER( "mort chain subtable type4 "
       
   113                     "(Non-Contextual Glyph Substitution)" );
       
   114 
       
   115     valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;
       
   116     valid->lookupval_func   = gxv_mort_subtable_type4_lookupval_validate;
       
   117     valid->lookupfmt4_trans = gxv_mort_subtable_type4_lookupfmt4_transit;
       
   118 
       
   119     gxv_LookupTable_validate( p, limit, valid );
       
   120 
       
   121     GXV_EXIT;
       
   122   }
       
   123 
       
   124 
       
   125 /* END */