PageRenderTime 26ms CodeModel.GetById 13ms app.highlight 10ms RepoModel.GetById 1ms app.codeStats 0ms

/src/freetype/src/otvalid/otvbase.c

https://bitbucket.org/cabalistic/ogredeps/
C | 318 lines | 189 code | 99 blank | 30 comment | 16 complexity | c0d939234c69fb9d538941662a490eab MD5 | raw file
  1/***************************************************************************/
  2/*                                                                         */
  3/*  otvbase.c                                                              */
  4/*                                                                         */
  5/*    OpenType BASE table validation (body).                               */
  6/*                                                                         */
  7/*  Copyright 2004, 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_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_FORMAT;
 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_FORMAT;
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 */