~ubuntu-branches/ubuntu/vivid/emscripten/vivid

« back to all changes in this revision

Viewing changes to tests/freetype/src/gxvalid/gxvopbd.c

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2013-05-02 13:11:51 UTC
  • Revision ID: package-import@ubuntu.com-20130502131151-q8dvteqr1ef2x7xz
Tags: upstream-1.4.1~20130504~adb56cb
ImportĀ upstreamĀ versionĀ 1.4.1~20130504~adb56cb

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***************************************************************************/
 
2
/*                                                                         */
 
3
/*  gxvopbd.c                                                              */
 
4
/*                                                                         */
 
5
/*    TrueTypeGX/AAT opbd table validation (body).                         */
 
6
/*                                                                         */
 
7
/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
 
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
/*                                                                         */
 
20
/* gxvalid is derived from both gxlayout module and otvalid module.        */
 
21
/* Development of gxlayout is supported by the Information-technology      */
 
22
/* Promotion Agency(IPA), Japan.                                           */
 
23
/*                                                                         */
 
24
/***************************************************************************/
 
25
 
 
26
 
 
27
#include "gxvalid.h"
 
28
#include "gxvcommn.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_gxvopbd
 
39
 
 
40
 
 
41
  /*************************************************************************/
 
42
  /*************************************************************************/
 
43
  /*****                                                               *****/
 
44
  /*****                      Data and Types                           *****/
 
45
  /*****                                                               *****/
 
46
  /*************************************************************************/
 
47
  /*************************************************************************/
 
48
 
 
49
  typedef struct  GXV_opbd_DataRec_
 
50
  {
 
51
    FT_UShort  format;
 
52
    FT_UShort  valueOffset_min;
 
53
 
 
54
  } GXV_opbd_DataRec, *GXV_opbd_Data;
 
55
 
 
56
 
 
57
#define GXV_OPBD_DATA( FIELD )  GXV_TABLE_DATA( opbd, FIELD )
 
58
 
 
59
 
 
60
  /*************************************************************************/
 
61
  /*************************************************************************/
 
62
  /*****                                                               *****/
 
63
  /*****                      UTILITY FUNCTIONS                        *****/
 
64
  /*****                                                               *****/
 
65
  /*************************************************************************/
 
66
  /*************************************************************************/
 
67
 
 
68
  static void
 
69
  gxv_opbd_LookupValue_validate( FT_UShort            glyph,
 
70
                                 GXV_LookupValueCPtr  value_p,
 
71
                                 GXV_Validator        valid )
 
72
  {
 
73
    /* offset in LookupTable is measured from the head of opbd table */
 
74
    FT_Bytes   p     = valid->root->base + value_p->u;
 
75
    FT_Bytes   limit = valid->root->limit;
 
76
    FT_Short   delta_value;
 
77
    int        i;
 
78
 
 
79
 
 
80
    if ( value_p->u < GXV_OPBD_DATA( valueOffset_min ) )
 
81
      GXV_OPBD_DATA( valueOffset_min ) = value_p->u;
 
82
 
 
83
    for ( i = 0; i < 4; i++ )
 
84
    {
 
85
      GXV_LIMIT_CHECK( 2 );
 
86
      delta_value = FT_NEXT_SHORT( p );
 
87
 
 
88
      if ( GXV_OPBD_DATA( format ) )    /* format 1, value is ctrl pt. */
 
89
      {
 
90
        if ( delta_value == -1 )
 
91
          continue;
 
92
 
 
93
        gxv_ctlPoint_validate( glyph, delta_value, valid );
 
94
      }
 
95
      else                              /* format 0, value is distance */
 
96
        continue;
 
97
    }
 
98
  }
 
99
 
 
100
 
 
101
  /*
 
102
    opbd ---------------------+
 
103
                              |
 
104
    +===============+         |
 
105
    | lookup header |         |
 
106
    +===============+         |
 
107
    | BinSrchHeader |         |
 
108
    +===============+         |
 
109
    | lastGlyph[0]  |         |
 
110
    +---------------+         |
 
111
    | firstGlyph[0] |         |  head of opbd sfnt table
 
112
    +---------------+         |             +
 
113
    | offset[0]     |    ->   |          offset            [byte]
 
114
    +===============+         |             +
 
115
    | lastGlyph[1]  |         | (glyphID - firstGlyph) * 4 * sizeof(FT_Short) [byte]
 
116
    +---------------+         |
 
117
    | firstGlyph[1] |         |
 
118
    +---------------+         |
 
119
    | offset[1]     |         |
 
120
    +===============+         |
 
121
                              |
 
122
     ....                     |
 
123
                              |
 
124
    48bit value array         |
 
125
    +===============+         |
 
126
    |     value     | <-------+
 
127
    |               |
 
128
    |               |
 
129
    |               |
 
130
    +---------------+
 
131
    .... */
 
132
 
 
133
  static GXV_LookupValueDesc
 
134
  gxv_opbd_LookupFmt4_transit( FT_UShort            relative_gindex,
 
135
                               GXV_LookupValueCPtr  base_value_p,
 
136
                               FT_Bytes             lookuptbl_limit,
 
137
                               GXV_Validator        valid )
 
138
  {
 
139
    GXV_LookupValueDesc  value;
 
140
 
 
141
    FT_UNUSED( lookuptbl_limit );
 
142
    FT_UNUSED( valid );
 
143
 
 
144
    /* XXX: check range? */
 
145
    value.u = (FT_UShort)( base_value_p->u +
 
146
                           relative_gindex * 4 * sizeof ( FT_Short ) );
 
147
 
 
148
    return value;
 
149
  }
 
150
 
 
151
 
 
152
  /*************************************************************************/
 
153
  /*************************************************************************/
 
154
  /*****                                                               *****/
 
155
  /*****                         opbd TABLE                            *****/
 
156
  /*****                                                               *****/
 
157
  /*************************************************************************/
 
158
  /*************************************************************************/
 
159
 
 
160
  FT_LOCAL_DEF( void )
 
161
  gxv_opbd_validate( FT_Bytes      table,
 
162
                     FT_Face       face,
 
163
                     FT_Validator  ftvalid )
 
164
  {
 
165
    GXV_ValidatorRec  validrec;
 
166
    GXV_Validator     valid = &validrec;
 
167
    GXV_opbd_DataRec  opbdrec;
 
168
    GXV_opbd_Data     opbd  = &opbdrec;
 
169
    FT_Bytes          p     = table;
 
170
    FT_Bytes          limit = 0;
 
171
 
 
172
    FT_ULong  version;
 
173
 
 
174
 
 
175
    valid->root       = ftvalid;
 
176
    valid->table_data = opbd;
 
177
    valid->face       = face;
 
178
 
 
179
    FT_TRACE3(( "validating `opbd' table\n" ));
 
180
    GXV_INIT;
 
181
    GXV_OPBD_DATA( valueOffset_min ) = 0xFFFFU;
 
182
 
 
183
 
 
184
    GXV_LIMIT_CHECK( 4 + 2 );
 
185
    version                 = FT_NEXT_ULONG( p );
 
186
    GXV_OPBD_DATA( format ) = FT_NEXT_USHORT( p );
 
187
 
 
188
 
 
189
    /* only 0x00010000 is defined (1996) */
 
190
    GXV_TRACE(( "(version=0x%08x)\n", version ));
 
191
    if ( 0x00010000UL != version )
 
192
      FT_INVALID_FORMAT;
 
193
 
 
194
    /* only values 0 and 1 are defined (1996) */
 
195
    GXV_TRACE(( "(format=0x%04x)\n", GXV_OPBD_DATA( format ) ));
 
196
    if ( 0x0001 < GXV_OPBD_DATA( format ) )
 
197
      FT_INVALID_FORMAT;
 
198
 
 
199
    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;
 
200
    valid->lookupval_func   = gxv_opbd_LookupValue_validate;
 
201
    valid->lookupfmt4_trans = gxv_opbd_LookupFmt4_transit;
 
202
 
 
203
    gxv_LookupTable_validate( p, limit, valid );
 
204
    p += valid->subtable_length;
 
205
 
 
206
    if ( p > table + GXV_OPBD_DATA( valueOffset_min ) )
 
207
    {
 
208
      GXV_TRACE((
 
209
        "found overlap between LookupTable and opbd_value array\n" ));
 
210
      FT_INVALID_OFFSET;
 
211
    }
 
212
 
 
213
    FT_TRACE4(( "\n" ));
 
214
  }
 
215
 
 
216
 
 
217
/* END */