source: trunk/poppler/freetype2/src/gxvalid/gxvcommn.h @ 262

Last change on this file since 262 was 262, checked in by Eugene Romanenko, 12 years ago

PDF plugin: freetype library updated to version 2.3.8

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