source: trunk/poppler/freetype-2.1.10/src/otvalid/otvcommn.h @ 2

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

First import

File size: 18.8 KB
Line 
1/***************************************************************************/
2/*                                                                         */
3/*  otvcommn.h                                                             */
4/*                                                                         */
5/*    OpenType common tables validation (specification).                   */
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#ifndef __OTVCOMMN_H__
20#define __OTVCOMMN_H__
21
22
23#include <ft2build.h>
24#include "otvalid.h"
25#include FT_INTERNAL_DEBUG_H
26
27
28FT_BEGIN_HEADER
29
30
31  /*************************************************************************/
32  /*************************************************************************/
33  /*****                                                               *****/
34  /*****                         VALIDATION                            *****/
35  /*****                                                               *****/
36  /*************************************************************************/
37  /*************************************************************************/
38
39  typedef struct OTV_ValidatorRec_*  OTV_Validator;
40
41  typedef void  (*OTV_Validate_Func)( FT_Bytes       table,
42                                      OTV_Validator  valid );
43
44  typedef struct  OTV_ValidatorRec_
45  {
46    FT_Validator        root;
47    FT_UInt             type_count;
48    OTV_Validate_Func*  type_funcs;
49
50    FT_UInt             lookup_count;
51    FT_UInt             glyph_count;
52
53    FT_UInt             nesting_level;
54
55    OTV_Validate_Func   func[3];
56
57    FT_UInt             extra1;     /* for passing parameters */
58    FT_UInt             extra2;
59    FT_Bytes            extra3;
60
61#ifdef FT_DEBUG_LEVEL_TRACE
62    FT_UInt             debug_indent;
63    const FT_String*    debug_function_name[3];
64#endif
65
66  } OTV_ValidatorRec;
67
68
69#undef  FT_INVALID_
70#define FT_INVALID_( _prefix, _error )                         \
71          ft_validator_error( valid->root, _prefix ## _error )
72
73#define OTV_OPTIONAL_TABLE( _table )  FT_UInt   _table;      \
74                                      FT_Bytes  _table ## _p
75
76#define OTV_OPTIONAL_OFFSET( _offset )           \
77          FT_BEGIN_STMNT                         \
78            _offset ## _p = p;                   \
79            _offset       = FT_NEXT_USHORT( p ); \
80          FT_END_STMNT
81
82#define OTV_LIMIT_CHECK( _count )                    \
83          FT_BEGIN_STMNT                             \
84            if ( p + (_count) > valid->root->limit ) \
85              FT_INVALID_TOO_SHORT;                  \
86          FT_END_STMNT
87
88#define OTV_SIZE_CHECK( _size )                                        \
89          FT_BEGIN_STMNT                                               \
90            if ( _size > 0 && _size < table_size )                     \
91            {                                                          \
92              if ( valid->root->level == FT_VALIDATE_PARANOID )        \
93                FT_INVALID_OFFSET;                                     \
94              else                                                     \
95              {                                                        \
96                /* strip off `const' */                                \
97                FT_Byte*  pp = (FT_Byte*)_size ## _p;                  \
98                                                                       \
99                                                                       \
100                FT_TRACE3(( "\n"                                       \
101                            "Invalid offset to optional table `%s'!\n" \
102                            "Set to zero.\n"                           \
103                            "\n", #_size ));                           \
104                                                                       \
105                /* always assume 16bit entities */                     \
106                _size = pp[0] = pp[1] = 0;                             \
107              }                                                        \
108            }                                                          \
109          FT_END_STMNT
110
111
112#ifdef FT_DEBUG_LEVEL_TRACE
113
114  /* use preprocessor's argument prescan to expand one argument into two */
115#define OTV_NEST1( x )  OTV_NEST1_( x )
116#define OTV_NEST1_( func0, name0 )                 \
117          FT_BEGIN_STMNT                           \
118            valid->nesting_level          = 0;     \
119            valid->func[0]                = func0; \
120            valid->debug_function_name[0] = name0; \
121          FT_END_STMNT
122
123  /* use preprocessor's argument prescan to expand two arguments into four */
124#define OTV_NEST2( x, y )  OTV_NEST2_( x, y )
125#define OTV_NEST2_( func0, name0, func1, name1 )   \
126          FT_BEGIN_STMNT                           \
127            valid->nesting_level          = 0;     \
128            valid->func[0]                = func0; \
129            valid->func[1]                = func1; \
130            valid->debug_function_name[0] = name0; \
131            valid->debug_function_name[1] = name1; \
132          FT_END_STMNT
133
134  /* use preprocessor's argument prescan to expand three arguments into six */
135#define OTV_NEST3( x, y, z )  OTV_NEST3_( x, y, z )
136#define OTV_NEST3_( func0, name0, func1, name1, func2, name2 ) \
137          FT_BEGIN_STMNT                                       \
138            valid->nesting_level          = 0;                 \
139            valid->func[0]                = func0;             \
140            valid->func[1]                = func1;             \
141            valid->func[2]                = func2;             \
142            valid->debug_function_name[0] = name0;             \
143            valid->debug_function_name[1] = name1;             \
144            valid->debug_function_name[2] = name2;             \
145          FT_END_STMNT
146
147#define OTV_INIT  valid->debug_indent = 0
148
149#define OTV_ENTER                                                            \
150          FT_BEGIN_STMNT                                                     \
151            valid->debug_indent += 2;                                        \
152            FT_TRACE4(( "%*.s", valid->debug_indent, 0 ));                   \
153            FT_TRACE4(( "%s table\n",                                        \
154                        valid->debug_function_name[valid->nesting_level] )); \
155          FT_END_STMNT
156
157#define OTV_NAME_ENTER( name )                             \
158          FT_BEGIN_STMNT                                   \
159            valid->debug_indent += 2;                      \
160            FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
161            FT_TRACE4(( "%s table\n", name ));             \
162          FT_END_STMNT
163
164#define OTV_EXIT  valid->debug_indent -= 2
165
166#define OTV_TRACE( s )                                     \
167          FT_BEGIN_STMNT                                   \
168            FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
169            FT_TRACE4( s );                                \
170          FT_END_STMNT
171
172#else   /* !FT_DEBUG_LEVEL_TRACE */
173
174  /* use preprocessor's argument prescan to expand one argument into two */
175#define OTV_NEST1( x )  OTV_NEST1_( x )
176#define OTV_NEST1_( func0, name0 )        \
177          FT_BEGIN_STMNT                  \
178            valid->nesting_level = 0;     \
179            valid->func[0]       = func0; \
180          FT_END_STMNT
181
182  /* use preprocessor's argument prescan to expand two arguments into four */
183#define OTV_NEST2( x, y )  OTV_NEST2_( x, y )
184#define OTV_NEST2_( func0, name0, func1, name1 ) \
185          FT_BEGIN_STMNT                         \
186            valid->nesting_level = 0;            \
187            valid->func[0]       = func0;        \
188            valid->func[1]       = func1;        \
189          FT_END_STMNT
190
191  /* use preprocessor's argument prescan to expand three arguments into six */
192#define OTV_NEST3( x, y, z )  OTV_NEST3_( x, y, z )
193#define OTV_NEST3_( func0, name0, func1, name1, func2, name2 ) \
194          FT_BEGIN_STMNT                                       \
195            valid->nesting_level = 0;                          \
196            valid->func[0]       = func0;                      \
197            valid->func[1]       = func1;                      \
198            valid->func[2]       = func2;                      \
199          FT_END_STMNT
200
201#define OTV_INIT                do ; while ( 0 )
202#define OTV_ENTER               do ; while ( 0 )
203#define OTV_NAME_ENTER( name )  do ; while ( 0 )
204#define OTV_EXIT                do ; while ( 0 )
205
206#define OTV_TRACE( s )          do ; while ( 0 )
207
208#endif  /* !FT_DEBUG_LEVEL_TRACE */
209
210
211#define OTV_RUN  valid->func[0]
212
213
214  /*************************************************************************/
215  /*************************************************************************/
216  /*****                                                               *****/
217  /*****                       COVERAGE TABLE                          *****/
218  /*****                                                               *****/
219  /*************************************************************************/
220  /*************************************************************************/
221
222  FT_LOCAL( void )
223  otv_Coverage_validate( FT_Bytes       table,
224                         OTV_Validator  valid );
225
226  /* return first covered glyph */
227  FT_LOCAL( FT_UInt )
228  otv_Coverage_get_first( FT_Bytes  table );
229
230  /* return last covered glyph */
231  FT_LOCAL( FT_UInt )
232  otv_Coverage_get_last( FT_Bytes  table );
233
234  /* return number of covered glyphs */
235  FT_LOCAL( FT_UInt )
236  otv_Coverage_get_count( FT_Bytes  table );
237
238
239  /*************************************************************************/
240  /*************************************************************************/
241  /*****                                                               *****/
242  /*****                  CLASS DEFINITION TABLE                       *****/
243  /*****                                                               *****/
244  /*************************************************************************/
245  /*************************************************************************/
246
247  FT_LOCAL( void )
248  otv_ClassDef_validate( FT_Bytes       table,
249                         OTV_Validator  valid );
250
251
252  /*************************************************************************/
253  /*************************************************************************/
254  /*****                                                               *****/
255  /*****                      DEVICE TABLE                             *****/
256  /*****                                                               *****/
257  /*************************************************************************/
258  /*************************************************************************/
259
260  FT_LOCAL( void )
261  otv_Device_validate( FT_Bytes       table,
262                       OTV_Validator  valid );
263
264
265  /*************************************************************************/
266  /*************************************************************************/
267  /*****                                                               *****/
268  /*****                           LOOKUPS                             *****/
269  /*****                                                               *****/
270  /*************************************************************************/
271  /*************************************************************************/
272
273  FT_LOCAL( void )
274  otv_Lookup_validate( FT_Bytes       table,
275                       OTV_Validator  valid );
276
277  FT_LOCAL( void )
278  otv_LookupList_validate( FT_Bytes       table,
279                           OTV_Validator  valid );
280
281
282  /*************************************************************************/
283  /*************************************************************************/
284  /*****                                                               *****/
285  /*****                        FEATURES                               *****/
286  /*****                                                               *****/
287  /*************************************************************************/
288  /*************************************************************************/
289
290  FT_LOCAL( void )
291  otv_Feature_validate( FT_Bytes       table,
292                        OTV_Validator  valid );
293
294  /* lookups must already be validated */
295  FT_LOCAL( void )
296  otv_FeatureList_validate( FT_Bytes       table,
297                            FT_Bytes       lookups,
298                            OTV_Validator  valid );
299
300
301  /*************************************************************************/
302  /*************************************************************************/
303  /*****                                                               *****/
304  /*****                       LANGUAGE SYSTEM                         *****/
305  /*****                                                               *****/
306  /*************************************************************************/
307  /*************************************************************************/
308
309  FT_LOCAL( void )
310  otv_LangSys_validate( FT_Bytes       table,
311                        OTV_Validator  valid );
312
313
314  /*************************************************************************/
315  /*************************************************************************/
316  /*****                                                               *****/
317  /*****                           SCRIPTS                             *****/
318  /*****                                                               *****/
319  /*************************************************************************/
320  /*************************************************************************/
321
322  FT_LOCAL( void )
323  otv_Script_validate( FT_Bytes       table,
324                       OTV_Validator  valid );
325
326  /* features must already be validated */
327  FT_LOCAL( void )
328  otv_ScriptList_validate( FT_Bytes       table,
329                           FT_Bytes       features,
330                           OTV_Validator  valid );
331
332
333  /*************************************************************************/
334  /*************************************************************************/
335  /*****                                                               *****/
336  /*****                      UTILITY FUNCTIONS                        *****/
337  /*****                                                               *****/
338  /*************************************************************************/
339  /*************************************************************************/
340
341#define ChainPosClassSet  otv_x_Ox, "ChainPosClassSet"
342#define ChainPosRuleSet   otv_x_Ox, "ChainPosRuleSet"
343#define ChainSubClassSet  otv_x_Ox, "ChainSubClassSet"
344#define ChainSubRuleSet   otv_x_Ox, "ChainSubRuleSet"
345#define JstfLangSys       otv_x_Ox, "JstfLangSys"
346#define JstfMax           otv_x_Ox, "JstfMax"
347#define LigGlyph          otv_x_Ox, "LigGlyph"
348#define LigatureArray     otv_x_Ox, "LigatureArray"
349#define LigatureSet       otv_x_Ox, "LigatureSet"
350#define PosClassSet       otv_x_Ox, "PosClassSet"
351#define PosRuleSet        otv_x_Ox, "PosRuleSet"
352#define SubClassSet       otv_x_Ox, "SubClassSet"
353#define SubRuleSet        otv_x_Ox, "SubRuleSet"
354
355  FT_LOCAL( void )
356  otv_x_Ox ( FT_Bytes       table,
357             OTV_Validator  valid );
358
359#define AlternateSubstFormat1     otv_u_C_x_Ox, "AlternateSubstFormat1"
360#define ChainContextPosFormat1    otv_u_C_x_Ox, "ChainContextPosFormat1"
361#define ChainContextSubstFormat1  otv_u_C_x_Ox, "ChainContextSubstFormat1"
362#define ContextPosFormat1         otv_u_C_x_Ox, "ContextPosFormat1"
363#define ContextSubstFormat1       otv_u_C_x_Ox, "ContextSubstFormat1"
364#define LigatureSubstFormat1      otv_u_C_x_Ox, "LigatureSubstFormat1"
365#define MultipleSubstFormat1      otv_u_C_x_Ox, "MultipleSubstFormat1"
366
367  FT_LOCAL( void )
368  otv_u_C_x_Ox( FT_Bytes       table,
369                OTV_Validator  valid );
370
371#define AlternateSet     otv_x_ux, "AlternateSet"
372#define AttachPoint      otv_x_ux, "AttachPoint"
373#define ExtenderGlyph    otv_x_ux, "ExtenderGlyph"
374#define JstfGPOSModList  otv_x_ux, "JstfGPOSModList"
375#define JstfGSUBModList  otv_x_ux, "JstfGSUBModList"
376#define Sequence         otv_x_ux, "Sequence"
377
378  FT_LOCAL( void )
379  otv_x_ux( FT_Bytes       table,
380            OTV_Validator  valid );
381
382#define PosClassRule  otv_x_y_ux_sy, "PosClassRule"
383#define PosRule       otv_x_y_ux_sy, "PosRule"
384#define SubClassRule  otv_x_y_ux_sy, "SubClassRule"
385#define SubRule       otv_x_y_ux_sy, "SubRule"
386
387  FT_LOCAL( void )
388  otv_x_y_ux_sy( FT_Bytes       table,
389                 OTV_Validator  valid );
390
391#define ChainPosClassRule  otv_x_ux_y_uy_z_uz_p_sp, "ChainPosClassRule"
392#define ChainPosRule       otv_x_ux_y_uy_z_uz_p_sp, "ChainPosRule"
393#define ChainSubClassRule  otv_x_ux_y_uy_z_uz_p_sp, "ChainSubClassRule"
394#define ChainSubRule       otv_x_ux_y_uy_z_uz_p_sp, "ChainSubRule"
395
396  FT_LOCAL( void )
397  otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes       table,
398                           OTV_Validator  valid );
399
400#define ContextPosFormat2    otv_u_O_O_x_Onx, "ContextPosFormat2"
401#define ContextSubstFormat2  otv_u_O_O_x_Onx, "ContextSubstFormat2"
402
403  FT_LOCAL( void )
404  otv_u_O_O_x_Onx( FT_Bytes       table,
405                   OTV_Validator  valid );
406
407#define ContextPosFormat3    otv_u_x_y_Ox_sy, "ContextPosFormat3"
408#define ContextSubstFormat3  otv_u_x_y_Ox_sy, "ContextSubstFormat3"
409
410  FT_LOCAL( void )
411  otv_u_x_y_Ox_sy( FT_Bytes       table,
412                   OTV_Validator  valid );
413
414#define ChainContextPosFormat2    otv_u_O_O_O_O_x_Onx, "ChainContextPosFormat2"
415#define ChainContextSubstFormat2  otv_u_O_O_O_O_x_Onx, "ChainContextSubstFormat2"
416
417  FT_LOCAL( void )
418  otv_u_O_O_O_O_x_Onx( FT_Bytes       table,
419                       OTV_Validator  valid );
420
421#define ChainContextPosFormat3    otv_u_x_Ox_y_Oy_z_Oz_p_sp, "ChainContextPosFormat3"
422#define ChainContextSubstFormat3  otv_u_x_Ox_y_Oy_z_Oz_p_sp, "ChainContextSubstFormat3"
423
424  FT_LOCAL( void )
425  otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes       table,
426                             OTV_Validator  valid );
427
428
429  FT_LOCAL( FT_UInt )
430  otv_GSUBGPOS_get_Lookup_count( FT_Bytes  table );
431
432  FT_LOCAL( FT_UInt )
433  otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes  table );
434
435 /* */
436
437FT_END_HEADER
438
439#endif /* __OTVCOMMN_H__ */
440
441
442/* END */
Note: See TracBrowser for help on using the repository browser.