source: trunk/poppler/freetype-2.1.10/src/otvalid/otvbase.c @ 2

Last change on this file since 2 was 2, checked in by Eugene Romanenko, 15 years ago

First import

File size: 8.0 KB
Line 
1/***************************************************************************/
2/*                                                                         */
3/*  otvbase.c                                                              */
4/*                                                                         */
5/*    OpenType BASE table validation (body).                               */
6/*                                                                         */
7/*  Copyright 2004 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_otvbase
31
32
33  static void
34  otv_BaseCoord_validate( FT_Bytes       table,
35                          OTV_Validator  valid )
36  {
37    FT_Bytes  p = table;
38    FT_UInt   BaseCoordFormat;
39
40
41    OTV_NAME_ENTER( "BaseCoord" );
42
43    OTV_LIMIT_CHECK( 4 );
44    BaseCoordFormat = FT_NEXT_USHORT( p );
45    p += 2;     /* skip Coordinate */
46
47    OTV_TRACE(( " (format %d)\n", BaseCoordFormat ));
48
49    switch ( BaseCoordFormat )
50    {
51    case 1:     /* BaseCoordFormat1 */
52      break;
53
54    case 2:     /* BaseCoordFormat2 */
55      OTV_LIMIT_CHECK( 4 );   /* ReferenceGlyph, BaseCoordPoint */
56      break;
57
58    case 3:     /* BaseCoordFormat3 */
59      OTV_LIMIT_CHECK( 2 );
60      /* DeviceTable */
61      otv_Device_validate( table + FT_NEXT_USHORT( p ), valid );
62      break;
63
64    default:
65      FT_INVALID_DATA;
66    }
67
68    OTV_EXIT;
69  }
70
71
72  static void
73  otv_BaseTagList_validate( FT_Bytes       table,
74                            OTV_Validator  valid )
75  {
76    FT_Bytes  p = table;
77    FT_UInt   BaseTagCount;
78
79
80    OTV_NAME_ENTER( "BaseTagList" );
81
82    OTV_LIMIT_CHECK( 2 );
83
84    BaseTagCount = FT_NEXT_USHORT( p );
85
86    OTV_TRACE(( " (BaseTagCount = %d)\n", BaseTagCount ));
87
88    OTV_LIMIT_CHECK( BaseTagCount * 4 );          /* BaselineTag */
89
90    OTV_EXIT;
91  }
92
93
94  static void
95  otv_BaseValues_validate( FT_Bytes       table,
96                           OTV_Validator  valid )
97  {
98    FT_Bytes  p = table;
99    FT_UInt   BaseCoordCount;
100
101
102    OTV_NAME_ENTER( "BaseValues" );
103
104    OTV_LIMIT_CHECK( 4 );
105
106    p             += 2;                     /* skip DefaultIndex */
107    BaseCoordCount = FT_NEXT_USHORT( p );
108
109    OTV_TRACE(( " (BaseCoordCount = %d)\n", BaseCoordCount ));
110
111    OTV_LIMIT_CHECK( BaseCoordCount * 2 );
112
113    /* BaseCoord */
114    for ( ; BaseCoordCount > 0; BaseCoordCount-- )
115      otv_BaseCoord_validate( table + FT_NEXT_USHORT( p ), valid );
116
117    OTV_EXIT;
118  }
119
120
121  static void
122  otv_MinMax_validate( FT_Bytes       table,
123                       OTV_Validator  valid )
124  {
125    FT_Bytes  p = table;
126    FT_UInt   table_size;
127    FT_UInt   FeatMinMaxCount;
128
129    OTV_OPTIONAL_TABLE( MinCoord );
130    OTV_OPTIONAL_TABLE( MaxCoord );
131
132
133    OTV_NAME_ENTER( "MinMax" );
134
135    OTV_LIMIT_CHECK( 6 );
136
137    OTV_OPTIONAL_OFFSET( MinCoord );
138    OTV_OPTIONAL_OFFSET( MaxCoord );
139    FeatMinMaxCount = FT_NEXT_USHORT( p );
140
141    OTV_TRACE(( " (FeatMinMaxCount = %d)\n", FeatMinMaxCount ));
142
143    table_size = FeatMinMaxCount * 8 + 6;
144
145    OTV_SIZE_CHECK( MinCoord );
146    if ( MinCoord )
147      otv_BaseCoord_validate( table + MinCoord, valid );
148
149    OTV_SIZE_CHECK( MaxCoord );
150    if ( MaxCoord )
151      otv_BaseCoord_validate( table + MaxCoord, valid );
152
153    OTV_LIMIT_CHECK( FeatMinMaxCount * 8 );
154
155    /* FeatMinMaxRecord */
156    for ( ; FeatMinMaxCount > 0; FeatMinMaxCount-- )
157    {
158      p += 4;                           /* skip FeatureTableTag */
159
160      OTV_OPTIONAL_OFFSET( MinCoord );
161      OTV_OPTIONAL_OFFSET( MaxCoord );
162
163      OTV_SIZE_CHECK( MinCoord );
164      if ( MinCoord )
165        otv_BaseCoord_validate( table + MinCoord, valid );
166
167      OTV_SIZE_CHECK( MaxCoord );
168      if ( MaxCoord )
169        otv_BaseCoord_validate( table + MaxCoord, valid );
170    }
171
172    OTV_EXIT;
173  }
174
175
176  static void
177  otv_BaseScript_validate( FT_Bytes       table,
178                           OTV_Validator  valid )
179  {
180    FT_Bytes  p = table;
181    FT_UInt   table_size;
182    FT_UInt   BaseLangSysCount;
183
184    OTV_OPTIONAL_TABLE( BaseValues    );
185    OTV_OPTIONAL_TABLE( DefaultMinMax );
186
187
188    OTV_NAME_ENTER( "BaseScript" );
189
190    OTV_LIMIT_CHECK( 6 );
191    OTV_OPTIONAL_OFFSET( BaseValues    );
192    OTV_OPTIONAL_OFFSET( DefaultMinMax );
193    BaseLangSysCount = FT_NEXT_USHORT( p );
194
195    OTV_TRACE(( " (BaseLangSysCount = %d)\n", BaseLangSysCount ));
196
197    table_size = BaseLangSysCount * 6 + 6;
198
199    OTV_SIZE_CHECK( BaseValues );
200    if ( BaseValues )
201      otv_BaseValues_validate( table + BaseValues, valid );
202
203    OTV_SIZE_CHECK( DefaultMinMax );
204    if ( DefaultMinMax )
205      otv_MinMax_validate( table + DefaultMinMax, valid );
206
207    OTV_LIMIT_CHECK( BaseLangSysCount * 6 );
208
209    /* BaseLangSysRecord */
210    for ( ; BaseLangSysCount > 0; BaseLangSysCount-- )
211    {
212      p += 4;       /* skip BaseLangSysTag */
213
214      otv_MinMax_validate( table + FT_NEXT_USHORT( p ), valid );
215    }
216
217    OTV_EXIT;
218  }
219
220
221  static void
222  otv_BaseScriptList_validate( FT_Bytes       table,
223                               OTV_Validator  valid )
224  {
225    FT_Bytes  p = table;
226    FT_UInt   BaseScriptCount;
227
228
229    OTV_NAME_ENTER( "BaseScriptList" );
230
231    OTV_LIMIT_CHECK( 2 );
232    BaseScriptCount = FT_NEXT_USHORT( p );
233
234    OTV_TRACE(( " (BaseScriptCount = %d)\n", BaseScriptCount ));
235
236    OTV_LIMIT_CHECK( BaseScriptCount * 6 );
237
238    /* BaseScriptRecord */
239    for ( ; BaseScriptCount > 0; BaseScriptCount-- )
240    {
241      p += 4;       /* skip BaseScriptTag */
242
243      /* BaseScript */
244      otv_BaseScript_validate( table + FT_NEXT_USHORT( p ), valid );
245    }
246
247    OTV_EXIT;
248  }
249
250
251  static void
252  otv_Axis_validate( FT_Bytes       table,
253                     OTV_Validator  valid )
254  {
255    FT_Bytes  p = table;
256    FT_UInt   table_size;
257
258    OTV_OPTIONAL_TABLE( BaseTagList );
259
260
261    OTV_NAME_ENTER( "Axis" );
262
263    OTV_LIMIT_CHECK( 4 );
264    OTV_OPTIONAL_OFFSET( BaseTagList );
265
266    table_size = 4;
267
268    OTV_SIZE_CHECK( BaseTagList );
269    if ( BaseTagList )
270      otv_BaseTagList_validate( table + BaseTagList, valid );
271
272    /* BaseScriptList */
273    otv_BaseScriptList_validate( table + FT_NEXT_USHORT( p ), valid );
274
275    OTV_EXIT;
276  }
277
278
279  FT_LOCAL_DEF( void )
280  otv_BASE_validate( FT_Bytes      table,
281                     FT_Validator  ftvalid )
282  {
283    OTV_ValidatorRec  validrec;
284    OTV_Validator     valid = &validrec;
285    FT_Bytes          p     = table;
286    FT_UInt           table_size;
287
288    OTV_OPTIONAL_TABLE( HorizAxis );
289    OTV_OPTIONAL_TABLE( VertAxis  );
290
291
292    valid->root = ftvalid;
293
294    FT_TRACE3(( "validating BASE table\n" ));
295    OTV_INIT;
296
297    OTV_LIMIT_CHECK( 6 );
298
299    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */
300      FT_INVALID_DATA;
301
302    table_size = 6;
303
304    OTV_OPTIONAL_OFFSET( HorizAxis );
305    OTV_SIZE_CHECK( HorizAxis );
306    if ( HorizAxis )
307      otv_Axis_validate( table + HorizAxis, valid );
308
309    OTV_OPTIONAL_OFFSET( VertAxis );
310    OTV_SIZE_CHECK( VertAxis );
311    if ( VertAxis )
312      otv_Axis_validate( table + VertAxis, valid );
313
314    FT_TRACE4(( "\n" ));
315  }
316
317
318/* END */
Note: See TracBrowser for help on using the repository browser.