Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3918 Serge 1
/***************************************************************************/
2
/*                                                                         */
3
/*  otvcommn.h                                                             */
4
/*                                                                         */
5
/*    OpenType common tables validation (specification).                   */
6
/*                                                                         */
7
/*  Copyright 2004, 2005, 2007, 2009 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 
24
#include "otvalid.h"
25
#include FT_INTERNAL_DEBUG_H
26
 
27
 
28
FT_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_UShort  _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'" \
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
#define  OTV_NAME_(x)  #x
113
#define  OTV_NAME(x)   OTV_NAME_(x)
114
 
115
#define  OTV_FUNC_(x)  x##Func
116
#define  OTV_FUNC(x)   OTV_FUNC_(x)
117
 
118
#ifdef FT_DEBUG_LEVEL_TRACE
119
 
120
#define OTV_NEST1( x )                                     \
121
          FT_BEGIN_STMNT                                   \
122
            valid->nesting_level          = 0;             \
123
            valid->func[0]                = OTV_FUNC( x ); \
124
            valid->debug_function_name[0] = OTV_NAME( x ); \
125
          FT_END_STMNT
126
 
127
#define OTV_NEST2( x, y )                                  \
128
          FT_BEGIN_STMNT                                   \
129
            valid->nesting_level          = 0;             \
130
            valid->func[0]                = OTV_FUNC( x ); \
131
            valid->func[1]                = OTV_FUNC( y ); \
132
            valid->debug_function_name[0] = OTV_NAME( x ); \
133
            valid->debug_function_name[1] = OTV_NAME( y ); \
134
          FT_END_STMNT
135
 
136
#define OTV_NEST3( x, y, z )                               \
137
          FT_BEGIN_STMNT                                   \
138
            valid->nesting_level          = 0;             \
139
            valid->func[0]                = OTV_FUNC( x ); \
140
            valid->func[1]                = OTV_FUNC( y ); \
141
            valid->func[2]                = OTV_FUNC( z ); \
142
            valid->debug_function_name[0] = OTV_NAME( x ); \
143
            valid->debug_function_name[1] = OTV_NAME( y ); \
144
            valid->debug_function_name[2] = OTV_NAME( z ); \
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
#define OTV_NEST1( x )                            \
175
          FT_BEGIN_STMNT                          \
176
            valid->nesting_level = 0;             \
177
            valid->func[0]       = OTV_FUNC( x ); \
178
          FT_END_STMNT
179
 
180
#define OTV_NEST2( x, y )                         \
181
          FT_BEGIN_STMNT                          \
182
            valid->nesting_level = 0;             \
183
            valid->func[0]       = OTV_FUNC( x ); \
184
            valid->func[1]       = OTV_FUNC( y ); \
185
          FT_END_STMNT
186
 
187
#define OTV_NEST3( x, y, z )                      \
188
          FT_BEGIN_STMNT                          \
189
            valid->nesting_level = 0;             \
190
            valid->func[0]       = OTV_FUNC( x ); \
191
            valid->func[1]       = OTV_FUNC( y ); \
192
            valid->func[2]       = OTV_FUNC( z ); \
193
          FT_END_STMNT
194
 
195
#define OTV_INIT                do { } while ( 0 )
196
#define OTV_ENTER               do { } while ( 0 )
197
#define OTV_NAME_ENTER( name )  do { } while ( 0 )
198
#define OTV_EXIT                do { } while ( 0 )
199
 
200
#define OTV_TRACE( s )          do { } while ( 0 )
201
 
202
#endif  /* !FT_DEBUG_LEVEL_TRACE */
203
 
204
 
205
#define OTV_RUN  valid->func[0]
206
 
207
 
208
  /*************************************************************************/
209
  /*************************************************************************/
210
  /*****                                                               *****/
211
  /*****                       COVERAGE TABLE                          *****/
212
  /*****                                                               *****/
213
  /*************************************************************************/
214
  /*************************************************************************/
215
 
216
  FT_LOCAL( void )
217
  otv_Coverage_validate( FT_Bytes       table,
218
                         OTV_Validator  valid,
219
                         FT_Int         expected_count );
220
 
221
  /* return first covered glyph */
222
  FT_LOCAL( FT_UInt )
223
  otv_Coverage_get_first( FT_Bytes  table );
224
 
225
  /* return last covered glyph */
226
  FT_LOCAL( FT_UInt )
227
  otv_Coverage_get_last( FT_Bytes  table );
228
 
229
  /* return number of covered glyphs */
230
  FT_LOCAL( FT_UInt )
231
  otv_Coverage_get_count( FT_Bytes  table );
232
 
233
 
234
  /*************************************************************************/
235
  /*************************************************************************/
236
  /*****                                                               *****/
237
  /*****                  CLASS DEFINITION TABLE                       *****/
238
  /*****                                                               *****/
239
  /*************************************************************************/
240
  /*************************************************************************/
241
 
242
  FT_LOCAL( void )
243
  otv_ClassDef_validate( FT_Bytes       table,
244
                         OTV_Validator  valid );
245
 
246
 
247
  /*************************************************************************/
248
  /*************************************************************************/
249
  /*****                                                               *****/
250
  /*****                      DEVICE TABLE                             *****/
251
  /*****                                                               *****/
252
  /*************************************************************************/
253
  /*************************************************************************/
254
 
255
  FT_LOCAL( void )
256
  otv_Device_validate( FT_Bytes       table,
257
                       OTV_Validator  valid );
258
 
259
 
260
  /*************************************************************************/
261
  /*************************************************************************/
262
  /*****                                                               *****/
263
  /*****                           LOOKUPS                             *****/
264
  /*****                                                               *****/
265
  /*************************************************************************/
266
  /*************************************************************************/
267
 
268
  FT_LOCAL( void )
269
  otv_Lookup_validate( FT_Bytes       table,
270
                       OTV_Validator  valid );
271
 
272
  FT_LOCAL( void )
273
  otv_LookupList_validate( FT_Bytes       table,
274
                           OTV_Validator  valid );
275
 
276
 
277
  /*************************************************************************/
278
  /*************************************************************************/
279
  /*****                                                               *****/
280
  /*****                        FEATURES                               *****/
281
  /*****                                                               *****/
282
  /*************************************************************************/
283
  /*************************************************************************/
284
 
285
  FT_LOCAL( void )
286
  otv_Feature_validate( FT_Bytes       table,
287
                        OTV_Validator  valid );
288
 
289
  /* lookups must already be validated */
290
  FT_LOCAL( void )
291
  otv_FeatureList_validate( FT_Bytes       table,
292
                            FT_Bytes       lookups,
293
                            OTV_Validator  valid );
294
 
295
 
296
  /*************************************************************************/
297
  /*************************************************************************/
298
  /*****                                                               *****/
299
  /*****                       LANGUAGE SYSTEM                         *****/
300
  /*****                                                               *****/
301
  /*************************************************************************/
302
  /*************************************************************************/
303
 
304
  FT_LOCAL( void )
305
  otv_LangSys_validate( FT_Bytes       table,
306
                        OTV_Validator  valid );
307
 
308
 
309
  /*************************************************************************/
310
  /*************************************************************************/
311
  /*****                                                               *****/
312
  /*****                           SCRIPTS                             *****/
313
  /*****                                                               *****/
314
  /*************************************************************************/
315
  /*************************************************************************/
316
 
317
  FT_LOCAL( void )
318
  otv_Script_validate( FT_Bytes       table,
319
                       OTV_Validator  valid );
320
 
321
  /* features must already be validated */
322
  FT_LOCAL( void )
323
  otv_ScriptList_validate( FT_Bytes       table,
324
                           FT_Bytes       features,
325
                           OTV_Validator  valid );
326
 
327
 
328
  /*************************************************************************/
329
  /*************************************************************************/
330
  /*****                                                               *****/
331
  /*****                      UTILITY FUNCTIONS                        *****/
332
  /*****                                                               *****/
333
  /*************************************************************************/
334
  /*************************************************************************/
335
 
336
#define ChainPosClassSetFunc  otv_x_Ox
337
#define ChainPosRuleSetFunc   otv_x_Ox
338
#define ChainSubClassSetFunc  otv_x_Ox
339
#define ChainSubRuleSetFunc   otv_x_Ox
340
#define JstfLangSysFunc       otv_x_Ox
341
#define JstfMaxFunc           otv_x_Ox
342
#define LigGlyphFunc          otv_x_Ox
343
#define LigatureArrayFunc     otv_x_Ox
344
#define LigatureSetFunc       otv_x_Ox
345
#define PosClassSetFunc       otv_x_Ox
346
#define PosRuleSetFunc        otv_x_Ox
347
#define SubClassSetFunc       otv_x_Ox
348
#define SubRuleSetFunc        otv_x_Ox
349
 
350
  FT_LOCAL( void )
351
  otv_x_Ox ( FT_Bytes       table,
352
             OTV_Validator  valid );
353
 
354
#define AlternateSubstFormat1Func     otv_u_C_x_Ox
355
#define ChainContextPosFormat1Func    otv_u_C_x_Ox
356
#define ChainContextSubstFormat1Func  otv_u_C_x_Ox
357
#define ContextPosFormat1Func         otv_u_C_x_Ox
358
#define ContextSubstFormat1Func       otv_u_C_x_Ox
359
#define LigatureSubstFormat1Func      otv_u_C_x_Ox
360
#define MultipleSubstFormat1Func      otv_u_C_x_Ox
361
 
362
  FT_LOCAL( void )
363
  otv_u_C_x_Ox( FT_Bytes       table,
364
                OTV_Validator  valid );
365
 
366
#define AlternateSetFunc     otv_x_ux
367
#define AttachPointFunc      otv_x_ux
368
#define ExtenderGlyphFunc    otv_x_ux
369
#define JstfGPOSModListFunc  otv_x_ux
370
#define JstfGSUBModListFunc  otv_x_ux
371
#define SequenceFunc         otv_x_ux
372
 
373
  FT_LOCAL( void )
374
  otv_x_ux( FT_Bytes       table,
375
            OTV_Validator  valid );
376
 
377
#define PosClassRuleFunc  otv_x_y_ux_sy
378
#define PosRuleFunc       otv_x_y_ux_sy
379
#define SubClassRuleFunc  otv_x_y_ux_sy
380
#define SubRuleFunc       otv_x_y_ux_sy
381
 
382
  FT_LOCAL( void )
383
  otv_x_y_ux_sy( FT_Bytes       table,
384
                 OTV_Validator  valid );
385
 
386
#define ChainPosClassRuleFunc  otv_x_ux_y_uy_z_uz_p_sp
387
#define ChainPosRuleFunc       otv_x_ux_y_uy_z_uz_p_sp
388
#define ChainSubClassRuleFunc  otv_x_ux_y_uy_z_uz_p_sp
389
#define ChainSubRuleFunc       otv_x_ux_y_uy_z_uz_p_sp
390
 
391
  FT_LOCAL( void )
392
  otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes       table,
393
                           OTV_Validator  valid );
394
 
395
#define ContextPosFormat2Func    otv_u_O_O_x_Onx
396
#define ContextSubstFormat2Func  otv_u_O_O_x_Onx
397
 
398
  FT_LOCAL( void )
399
  otv_u_O_O_x_Onx( FT_Bytes       table,
400
                   OTV_Validator  valid );
401
 
402
#define ContextPosFormat3Func    otv_u_x_y_Ox_sy
403
#define ContextSubstFormat3Func  otv_u_x_y_Ox_sy
404
 
405
  FT_LOCAL( void )
406
  otv_u_x_y_Ox_sy( FT_Bytes       table,
407
                   OTV_Validator  valid );
408
 
409
#define ChainContextPosFormat2Func    otv_u_O_O_O_O_x_Onx
410
#define ChainContextSubstFormat2Func  otv_u_O_O_O_O_x_Onx
411
 
412
  FT_LOCAL( void )
413
  otv_u_O_O_O_O_x_Onx( FT_Bytes       table,
414
                       OTV_Validator  valid );
415
 
416
#define ChainContextPosFormat3Func    otv_u_x_Ox_y_Oy_z_Oz_p_sp
417
#define ChainContextSubstFormat3Func  otv_u_x_Ox_y_Oy_z_Oz_p_sp
418
 
419
  FT_LOCAL( void )
420
  otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes       table,
421
                             OTV_Validator  valid );
422
 
423
 
424
  FT_LOCAL( FT_UInt )
425
  otv_GSUBGPOS_get_Lookup_count( FT_Bytes  table );
426
 
427
  FT_LOCAL( FT_UInt )
428
  otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes  table );
429
 
430
 /* */
431
 
432
FT_END_HEADER
433
 
434
#endif /* __OTVCOMMN_H__ */
435
 
436
 
437
/* END */