PageRenderTime 61ms CodeModel.GetById 42ms app.highlight 15ms RepoModel.GetById 1ms app.codeStats 0ms

/src/freetype/src/gxvalid/gxvcommn.h

https://bitbucket.org/cabalistic/ogredeps/
C++ Header | 582 lines | 327 code | 141 blank | 114 comment | 14 complexity | 4a945465f605e5a2d236d560ab021e6b MD5 | raw file
  1/***************************************************************************/
  2/*                                                                         */
  3/*  gxvcommn.h                                                             */
  4/*                                                                         */
  5/*    TrueTypeGX/AAT common tables validation (specification).             */
  6/*                                                                         */
  7/*  Copyright 2004, 2005, 2012                                             */
  8/*  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  /*
 29   * keywords in variable naming
 30   * ---------------------------
 31   *  table: Of type FT_Bytes, pointing to the start of this table/subtable.
 32   *  limit: Of type FT_Bytes, pointing to the end of this table/subtable,
 33   *         including padding for alignment.
 34   *  offset: Of type FT_UInt, the number of octets from the start to target.
 35   *  length: Of type FT_UInt, the number of octets from the start to the
 36   *          end in this table/subtable, including padding for alignment.
 37   *
 38   *  _MIN, _MAX: Should be added to the tail of macros, as INT_MIN, etc.
 39   */
 40
 41
 42#ifndef __GXVCOMMN_H__
 43#define __GXVCOMMN_H__
 44
 45
 46#include <ft2build.h>
 47#include "gxvalid.h"
 48#include FT_INTERNAL_DEBUG_H
 49#include FT_SFNT_NAMES_H
 50
 51
 52FT_BEGIN_HEADER
 53
 54
 55  /* some variables are not evaluated or only used in trace */
 56
 57#ifdef  FT_DEBUG_LEVEL_TRACE
 58#define GXV_LOAD_TRACE_VARS
 59#else
 60#undef  GXV_LOAD_TRACE_VARS
 61#endif
 62
 63#undef GXV_LOAD_UNUSED_VARS /* debug purpose */
 64
 65#define IS_PARANOID_VALIDATION          ( valid->root->level >= FT_VALIDATE_PARANOID )
 66#define GXV_SET_ERR_IF_PARANOID( err )  { if ( IS_PARANOID_VALIDATION ) ( err ); }
 67
 68  /*************************************************************************/
 69  /*************************************************************************/
 70  /*****                                                               *****/
 71  /*****                         VALIDATION                            *****/
 72  /*****                                                               *****/
 73  /*************************************************************************/
 74  /*************************************************************************/
 75
 76  typedef struct GXV_ValidatorRec_*  GXV_Validator;
 77
 78
 79#define DUMMY_LIMIT 0
 80
 81  typedef void
 82  (*GXV_Validate_Func)( FT_Bytes       table,
 83                        FT_Bytes       limit,
 84                        GXV_Validator  valid );
 85
 86
 87  /* ====================== LookupTable Validator ======================== */
 88
 89  typedef union  GXV_LookupValueDesc_
 90  {
 91    FT_UShort u;
 92    FT_Short  s;
 93
 94  } GXV_LookupValueDesc;
 95
 96  typedef const GXV_LookupValueDesc* GXV_LookupValueCPtr;
 97
 98  typedef enum  GXV_LookupValue_SignSpec_
 99  {
100    GXV_LOOKUPVALUE_UNSIGNED = 0,
101    GXV_LOOKUPVALUE_SIGNED
102
103  } GXV_LookupValue_SignSpec;
104
105
106  typedef void
107  (*GXV_Lookup_Value_Validate_Func)( FT_UShort            glyph,
108                                     GXV_LookupValueCPtr  value_p,
109                                     GXV_Validator        valid );
110
111  typedef GXV_LookupValueDesc
112  (*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort            relative_gindex,
113                                   GXV_LookupValueCPtr  base_value_p,
114                                   FT_Bytes             lookuptbl_limit,
115                                   GXV_Validator        valid );
116
117
118  /* ====================== StateTable Validator ========================= */
119
120  typedef enum  GXV_GlyphOffset_Format_
121  {
122    GXV_GLYPHOFFSET_NONE   = -1,
123    GXV_GLYPHOFFSET_UCHAR  = 2,
124    GXV_GLYPHOFFSET_CHAR,
125    GXV_GLYPHOFFSET_USHORT = 4,
126    GXV_GLYPHOFFSET_SHORT,
127    GXV_GLYPHOFFSET_ULONG  = 8,
128    GXV_GLYPHOFFSET_LONG
129
130  } GXV_GlyphOffset_Format;
131
132
133#define GXV_GLYPHOFFSET_FMT( table )           \
134        ( valid->table.entry_glyphoffset_fmt )
135
136#define GXV_GLYPHOFFSET_SIZE( table )              \
137        ( valid->table.entry_glyphoffset_fmt / 2 )
138
139
140  /* ----------------------- 16bit StateTable ---------------------------- */
141
142  typedef union  GXV_StateTable_GlyphOffsetDesc_
143  {
144    FT_Byte    uc;
145    FT_UShort  u;       /* same as GXV_LookupValueDesc */
146    FT_ULong   ul;
147    FT_Char    c;
148    FT_Short   s;       /* same as GXV_LookupValueDesc */
149    FT_Long    l;
150
151  } GXV_StateTable_GlyphOffsetDesc;
152
153  typedef const GXV_StateTable_GlyphOffsetDesc* GXV_StateTable_GlyphOffsetCPtr;
154
155  typedef void
156  (*GXV_StateTable_Subtable_Setup_Func)( FT_UShort      table_size,
157                                         FT_UShort      classTable,
158                                         FT_UShort      stateArray,
159                                         FT_UShort      entryTable,
160                                         FT_UShort*     classTable_length_p,
161                                         FT_UShort*     stateArray_length_p,
162                                         FT_UShort*     entryTable_length_p,
163                                         GXV_Validator  valid );
164
165  typedef void
166  (*GXV_StateTable_Entry_Validate_Func)(
167     FT_Byte                         state,
168     FT_UShort                       flags,
169     GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
170     FT_Bytes                        statetable_table,
171     FT_Bytes                        statetable_limit,
172     GXV_Validator                   valid );
173
174  typedef void
175  (*GXV_StateTable_OptData_Load_Func)( FT_Bytes       table,
176                                       FT_Bytes       limit,
177                                       GXV_Validator  valid );
178
179  typedef struct  GXV_StateTable_ValidatorRec_
180  {
181    GXV_GlyphOffset_Format              entry_glyphoffset_fmt;
182    void*                               optdata;
183
184    GXV_StateTable_Subtable_Setup_Func  subtable_setup_func;
185    GXV_StateTable_Entry_Validate_Func  entry_validate_func;
186    GXV_StateTable_OptData_Load_Func    optdata_load_func;
187
188  } GXV_StateTable_ValidatorRec, *GXV_StateTable_ValidatorRecData;
189
190
191  /* ---------------------- 32bit XStateTable ---------------------------- */
192
193  typedef GXV_StateTable_GlyphOffsetDesc  GXV_XStateTable_GlyphOffsetDesc;
194
195  typedef const GXV_XStateTable_GlyphOffsetDesc* GXV_XStateTable_GlyphOffsetCPtr;
196
197  typedef void
198  (*GXV_XStateTable_Subtable_Setup_Func)( FT_ULong       table_size,
199                                          FT_ULong       classTable,
200                                          FT_ULong       stateArray,
201                                          FT_ULong       entryTable,
202                                          FT_ULong*      classTable_length_p,
203                                          FT_ULong*      stateArray_length_p,
204                                          FT_ULong*      entryTable_length_p,
205                                          GXV_Validator  valid );
206
207  typedef void
208  (*GXV_XStateTable_Entry_Validate_Func)(
209     FT_UShort                       state,
210     FT_UShort                       flags,
211     GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
212     FT_Bytes                        xstatetable_table,
213     FT_Bytes                        xstatetable_limit,
214     GXV_Validator                   valid );
215
216
217  typedef GXV_StateTable_OptData_Load_Func  GXV_XStateTable_OptData_Load_Func;
218
219
220  typedef struct  GXV_XStateTable_ValidatorRec_
221  {
222    int                                  entry_glyphoffset_fmt;
223    void*                                optdata;
224
225    GXV_XStateTable_Subtable_Setup_Func  subtable_setup_func;
226    GXV_XStateTable_Entry_Validate_Func  entry_validate_func;
227    GXV_XStateTable_OptData_Load_Func    optdata_load_func;
228
229    FT_ULong                             nClasses;
230    FT_UShort                            maxClassID;
231
232  } GXV_XStateTable_ValidatorRec, *GXV_XStateTable_ValidatorRecData;
233
234
235  /* ===================================================================== */
236
237  typedef struct  GXV_ValidatorRec_
238  {
239    FT_Validator  root;
240
241    FT_Face       face;
242    void*         table_data;
243
244    FT_ULong      subtable_length;
245
246    GXV_LookupValue_SignSpec        lookupval_sign;
247    GXV_Lookup_Value_Validate_Func  lookupval_func;
248    GXV_Lookup_Fmt4_Transit_Func    lookupfmt4_trans;
249    FT_Bytes                        lookuptbl_head;
250
251    FT_UShort  min_gid;
252    FT_UShort  max_gid;
253
254    GXV_StateTable_ValidatorRec     statetable;
255    GXV_XStateTable_ValidatorRec    xstatetable;
256
257#ifdef FT_DEBUG_LEVEL_TRACE
258    FT_UInt             debug_indent;
259    const FT_String*    debug_function_name[3];
260#endif
261
262  } GXV_ValidatorRec;
263
264
265#define GXV_TABLE_DATA( tag, field )                           \
266        ( ( (GXV_ ## tag ## _Data)valid->table_data )->field )
267
268#undef  FT_INVALID_
269#define FT_INVALID_( _prefix, _error )                         \
270          ft_validator_error( valid->root, _prefix ## _error )
271
272#define GXV_LIMIT_CHECK( _count )                                     \
273          FT_BEGIN_STMNT                                              \
274            if ( p + _count > ( limit? limit : valid->root->limit ) ) \
275              FT_INVALID_TOO_SHORT;                                   \
276          FT_END_STMNT
277
278
279#ifdef FT_DEBUG_LEVEL_TRACE
280
281#define GXV_INIT  valid->debug_indent = 0
282
283#define GXV_NAME_ENTER( name )                             \
284          FT_BEGIN_STMNT                                   \
285            valid->debug_indent += 2;                      \
286            FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
287            FT_TRACE4(( "%s table\n", name ));             \
288          FT_END_STMNT
289
290#define GXV_EXIT  valid->debug_indent -= 2
291
292#define GXV_TRACE( s )                                     \
293          FT_BEGIN_STMNT                                   \
294            FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
295            FT_TRACE4( s );                                \
296          FT_END_STMNT
297
298#else /* !FT_DEBUG_LEVEL_TRACE */
299
300#define GXV_INIT                do { } while ( 0 )
301#define GXV_NAME_ENTER( name )  do { } while ( 0 )
302#define GXV_EXIT                do { } while ( 0 )
303
304#define GXV_TRACE( s )          do { } while ( 0 )
305
306#endif  /* !FT_DEBUG_LEVEL_TRACE */
307
308
309  /*************************************************************************/
310  /*************************************************************************/
311  /*****                                                               *****/
312  /*****                    32bit alignment checking                   *****/
313  /*****                                                               *****/
314  /*************************************************************************/
315  /*************************************************************************/
316
317#define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \
318          FT_BEGIN_STMNT                  \
319            {                             \
320              if ( (a) & 3 )              \
321                FT_INVALID_OFFSET ;       \
322            }                             \
323          FT_END_STMNT
324
325
326  /*************************************************************************/
327  /*************************************************************************/
328  /*****                                                               *****/
329  /*****                    Dumping Binary Data                        *****/
330  /*****                                                               *****/
331  /*************************************************************************/
332  /*************************************************************************/
333
334#define GXV_TRACE_HEXDUMP( p, len )                     \
335          FT_BEGIN_STMNT                                \
336            {                                           \
337              FT_Bytes  b;                              \
338                                                        \
339                                                        \
340              for ( b = p; b < (FT_Bytes)p + len; b++ ) \
341                FT_TRACE1(("\\x%02x", *b)) ;            \
342            }                                           \
343          FT_END_STMNT
344
345#define GXV_TRACE_HEXDUMP_C( p, len )                   \
346          FT_BEGIN_STMNT                                \
347            {                                           \
348              FT_Bytes  b;                              \
349                                                        \
350                                                        \
351              for ( b = p; b < (FT_Bytes)p + len; b++ ) \
352                if ( 0x40 < *b && *b < 0x7e )           \
353                  FT_TRACE1(("%c", *b)) ;               \
354                else                                    \
355                  FT_TRACE1(("\\x%02x", *b)) ;          \
356            }                                           \
357          FT_END_STMNT
358
359#define GXV_TRACE_HEXDUMP_SFNTNAME( n )               \
360          GXV_TRACE_HEXDUMP( n.string, n.string_len )
361
362
363  /*************************************************************************/
364  /*************************************************************************/
365  /*****                                                               *****/
366  /*****                         LOOKUP TABLE                          *****/
367  /*****                                                               *****/
368  /*************************************************************************/
369  /*************************************************************************/
370
371  FT_LOCAL( void )
372  gxv_BinSrchHeader_validate( FT_Bytes       p,
373                              FT_Bytes       limit,
374                              FT_UShort*     unitSize_p,
375                              FT_UShort*     nUnits_p,
376                              GXV_Validator  valid );
377
378  FT_LOCAL( void )
379  gxv_LookupTable_validate( FT_Bytes       table,
380                            FT_Bytes       limit,
381                            GXV_Validator  valid );
382
383
384  /*************************************************************************/
385  /*************************************************************************/
386  /*****                                                               *****/
387  /*****                          Glyph ID                             *****/
388  /*****                                                               *****/
389  /*************************************************************************/
390  /*************************************************************************/
391
392  FT_LOCAL( FT_Int )
393  gxv_glyphid_validate( FT_UShort      gid,
394                        GXV_Validator  valid );
395
396
397  /*************************************************************************/
398  /*************************************************************************/
399  /*****                                                               *****/
400  /*****                        CONTROL POINT                          *****/
401  /*****                                                               *****/
402  /*************************************************************************/
403  /*************************************************************************/
404
405  FT_LOCAL( void )
406  gxv_ctlPoint_validate( FT_UShort      gid,
407                         FT_Short       ctl_point,
408                         GXV_Validator  valid );
409
410
411  /*************************************************************************/
412  /*************************************************************************/
413  /*****                                                               *****/
414  /*****                          SFNT NAME                            *****/
415  /*****                                                               *****/
416  /*************************************************************************/
417  /*************************************************************************/
418
419  FT_LOCAL( void )
420  gxv_sfntName_validate( FT_UShort      name_index,
421                         FT_UShort      min_index,
422                         FT_UShort      max_index,
423                         GXV_Validator  valid );
424
425
426  /*************************************************************************/
427  /*************************************************************************/
428  /*****                                                               *****/
429  /*****                          STATE TABLE                          *****/
430  /*****                                                               *****/
431  /*************************************************************************/
432  /*************************************************************************/
433
434  FT_LOCAL( void )
435  gxv_StateTable_subtable_setup( FT_UShort      table_size,
436                                 FT_UShort      classTable,
437                                 FT_UShort      stateArray,
438                                 FT_UShort      entryTable,
439                                 FT_UShort*     classTable_length_p,
440                                 FT_UShort*     stateArray_length_p,
441                                 FT_UShort*     entryTable_length_p,
442                                 GXV_Validator  valid );
443
444  FT_LOCAL( void )
445  gxv_XStateTable_subtable_setup( FT_ULong       table_size,
446                                  FT_ULong       classTable,
447                                  FT_ULong       stateArray,
448                                  FT_ULong       entryTable,
449                                  FT_ULong*      classTable_length_p,
450                                  FT_ULong*      stateArray_length_p,
451                                  FT_ULong*      entryTable_length_p,
452                                  GXV_Validator  valid );
453
454  FT_LOCAL( void )
455  gxv_StateTable_validate( FT_Bytes       table,
456                           FT_Bytes       limit,
457                           GXV_Validator  valid );
458
459  FT_LOCAL( void )
460  gxv_XStateTable_validate( FT_Bytes       table,
461                            FT_Bytes       limit,
462                            GXV_Validator  valid );
463
464
465  /*************************************************************************/
466  /*************************************************************************/
467  /*****                                                               *****/
468  /*****                 UTILITY MACROS AND FUNCTIONS                  *****/
469  /*****                                                               *****/
470  /*************************************************************************/
471  /*************************************************************************/
472
473  FT_LOCAL( void )
474  gxv_array_getlimits_byte( FT_Bytes       table,
475                            FT_Bytes       limit,
476                            FT_Byte*       min,
477                            FT_Byte*       max,
478                            GXV_Validator  valid );
479
480  FT_LOCAL( void )
481  gxv_array_getlimits_ushort( FT_Bytes       table,
482                              FT_Bytes       limit,
483                              FT_UShort*     min,
484                              FT_UShort*     max,
485                              GXV_Validator  valid );
486
487  FT_LOCAL( void )
488  gxv_set_length_by_ushort_offset( FT_UShort*     offset,
489                                   FT_UShort**    length,
490                                   FT_UShort*     buff,
491                                   FT_UInt        nmemb,
492                                   FT_UShort      limit,
493                                   GXV_Validator  valid );
494
495  FT_LOCAL( void )
496  gxv_set_length_by_ulong_offset( FT_ULong*      offset,
497                                  FT_ULong**     length,
498                                  FT_ULong*      buff,
499                                  FT_UInt        nmemb,
500                                  FT_ULong       limit,
501                                  GXV_Validator  valid);
502
503
504#define GXV_SUBTABLE_OFFSET_CHECK( _offset )          \
505          FT_BEGIN_STMNT                              \
506            if ( (_offset) > valid->subtable_length ) \
507              FT_INVALID_OFFSET;                      \
508          FT_END_STMNT
509
510#define GXV_SUBTABLE_LIMIT_CHECK( _count )                  \
511          FT_BEGIN_STMNT                                    \
512            if ( ( p + (_count) - valid->subtable_start ) > \
513                   valid->subtable_length )                 \
514              FT_INVALID_TOO_SHORT;                         \
515          FT_END_STMNT
516
517#define GXV_USHORT_TO_SHORT( _us )                                    \
518          ( ( 0x8000U < ( _us ) ) ? ( ( _us ) - 0x8000U ) : ( _us ) )
519
520#define GXV_STATETABLE_HEADER_SIZE  ( 2 + 2 + 2 + 2 )
521#define GXV_STATEHEADER_SIZE        GXV_STATETABLE_HEADER_SIZE
522
523#define GXV_XSTATETABLE_HEADER_SIZE  ( 4 + 4 + 4 + 4 )
524#define GXV_XSTATEHEADER_SIZE        GXV_XSTATETABLE_HEADER_SIZE
525
526
527  /*************************************************************************/
528  /*************************************************************************/
529  /*****                                                               *****/
530  /*****                        Table overlapping                      *****/
531  /*****                                                               *****/
532  /*************************************************************************/
533  /*************************************************************************/
534
535  typedef struct  GXV_odtect_DataRec_
536  {
537    FT_Bytes    start;
538    FT_ULong    length;
539    FT_String*  name;
540
541  } GXV_odtect_DataRec,  *GXV_odtect_Data;
542
543  typedef struct  GXV_odtect_RangeRec_
544  {
545    FT_UInt          nRanges;
546    GXV_odtect_Data  range;
547
548  } GXV_odtect_RangeRec, *GXV_odtect_Range;
549
550
551  FT_LOCAL( void )
552  gxv_odtect_add_range( FT_Bytes          start,
553                        FT_ULong          length,
554                        const FT_String*  name,
555                        GXV_odtect_Range  odtect );
556
557  FT_LOCAL( void )
558  gxv_odtect_validate( GXV_odtect_Range  odtect,
559                       GXV_Validator     valid );
560
561
562#define GXV_ODTECT( n, odtect )                              \
563          GXV_odtect_DataRec   odtect ## _range[n];          \
564          GXV_odtect_RangeRec  odtect ## _rec = { 0, NULL }; \
565          GXV_odtect_Range     odtect = NULL
566
567#define GXV_ODTECT_INIT( odtect )                      \
568          FT_BEGIN_STMNT                               \
569            odtect ## _rec.nRanges = 0;                \
570            odtect ## _rec.range   = odtect ## _range; \
571            odtect                 = & odtect ## _rec; \
572          FT_END_STMNT
573
574
575 /* */
576
577FT_END_HEADER
578
579#endif /* __GXVCOMMN_H__ */
580
581
582/* END */