• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /****************************************************************************
2  *
3  * otvcommn.h
4  *
5  *   OpenType common tables validation (specification).
6  *
7  * Copyright (C) 2004-2022 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 "otvalid.h"
24 #include <freetype/internal/ftdebug.h>
25 
26 
27 FT_BEGIN_HEADER
28 
29 
30   /*************************************************************************/
31   /*************************************************************************/
32   /*****                                                               *****/
33   /*****                         VALIDATION                            *****/
34   /*****                                                               *****/
35   /*************************************************************************/
36   /*************************************************************************/
37 
38   typedef struct OTV_ValidatorRec_*  OTV_Validator;
39 
40   typedef void  (*OTV_Validate_Func)( FT_Bytes       table,
41                                       OTV_Validator  otvalid );
42 
43   typedef struct  OTV_ValidatorRec_
44   {
45     FT_Validator        root;
46     FT_UInt             type_count;
47     OTV_Validate_Func*  type_funcs;
48 
49     FT_UInt             lookup_count;
50     FT_UInt             glyph_count;
51 
52     FT_UInt             nesting_level;
53 
54     OTV_Validate_Func   func[3];
55 
56     FT_UInt             extra1;     /* for passing parameters */
57     FT_UInt             extra2;
58     FT_Bytes            extra3;
59 
60 #ifdef FT_DEBUG_LEVEL_TRACE
61     FT_UInt             debug_indent;
62     const FT_String*    debug_function_name[3];
63 #endif
64 
65   } OTV_ValidatorRec;
66 
67 
68 #undef  FT_INVALID_
69 #define FT_INVALID_( _error )                                     \
70           ft_validator_error( otvalid->root, FT_THROW( _error ) )
71 
72 #define OTV_OPTIONAL_TABLE( _table )  FT_UShort  _table;      \
73                                       FT_Bytes   _table ## _p
74 
75 #define OTV_OPTIONAL_TABLE32( _table )  FT_ULong  _table;       \
76                                         FT_Bytes   _table ## _p
77 
78 #define OTV_OPTIONAL_OFFSET( _offset )           \
79           FT_BEGIN_STMNT                         \
80             _offset ## _p = p;                   \
81             _offset       = FT_NEXT_USHORT( p ); \
82           FT_END_STMNT
83 
84 #define OTV_OPTIONAL_OFFSET32( _offset )        \
85           FT_BEGIN_STMNT                        \
86             _offset ## _p = p;                  \
87             _offset       = FT_NEXT_ULONG( p ); \
88           FT_END_STMNT
89 
90 #define OTV_LIMIT_CHECK( _count )                      \
91           FT_BEGIN_STMNT                               \
92             if ( p + (_count) > otvalid->root->limit ) \
93               FT_INVALID_TOO_SHORT;                    \
94           FT_END_STMNT
95 
96 #define OTV_SIZE_CHECK( _size )                                     \
97           FT_BEGIN_STMNT                                            \
98             if ( _size > 0 && _size < table_size )                  \
99             {                                                       \
100               if ( otvalid->root->level == FT_VALIDATE_PARANOID )   \
101                 FT_INVALID_OFFSET;                                  \
102               else                                                  \
103               {                                                     \
104                 /* strip off `const' */                             \
105                 FT_Byte*  pp = (FT_Byte*)_size ## _p;               \
106                                                                     \
107                                                                     \
108                 FT_TRACE3(( "\n" ));                                \
109                 FT_TRACE3(( "Invalid offset to optional table `%s'" \
110                             " set to zero.\n",                      \
111                             #_size ));                              \
112                 FT_TRACE3(( "\n" ));                                \
113                                                                     \
114                 _size = pp[0] = pp[1] = 0;                          \
115               }                                                     \
116             }                                                       \
117           FT_END_STMNT
118 
119 #define OTV_SIZE_CHECK32( _size )                                   \
120           FT_BEGIN_STMNT                                            \
121             if ( _size > 0 && _size < table_size )                  \
122             {                                                       \
123               if ( otvalid->root->level == FT_VALIDATE_PARANOID )   \
124                 FT_INVALID_OFFSET;                                  \
125               else                                                  \
126               {                                                     \
127                 /* strip off `const' */                             \
128                 FT_Byte*  pp = (FT_Byte*)_size ## _p;               \
129                                                                     \
130                                                                     \
131                 FT_TRACE3(( "\n" ));                                \
132                 FT_TRACE3(( "Invalid offset to optional table `%s'" \
133                             " set to zero.\n",                      \
134                             #_size ));                              \
135                 FT_TRACE3(( "\n" ));                                \
136                                                                     \
137                 _size = pp[0] = pp[1] = pp[2] = pp[3] = 0;          \
138               }                                                     \
139             }                                                       \
140           FT_END_STMNT
141 
142 
143 #define  OTV_NAME_(x)  #x
144 #define  OTV_NAME(x)   OTV_NAME_(x)
145 
146 #define  OTV_FUNC_(x)  x##Func
147 #define  OTV_FUNC(x)   OTV_FUNC_(x)
148 
149 #ifdef FT_DEBUG_LEVEL_TRACE
150 
151 #define OTV_NEST1( x )                                       \
152           FT_BEGIN_STMNT                                     \
153             otvalid->nesting_level          = 0;             \
154             otvalid->func[0]                = OTV_FUNC( x ); \
155             otvalid->debug_function_name[0] = OTV_NAME( x ); \
156           FT_END_STMNT
157 
158 #define OTV_NEST2( x, y )                                    \
159           FT_BEGIN_STMNT                                     \
160             otvalid->nesting_level          = 0;             \
161             otvalid->func[0]                = OTV_FUNC( x ); \
162             otvalid->func[1]                = OTV_FUNC( y ); \
163             otvalid->debug_function_name[0] = OTV_NAME( x ); \
164             otvalid->debug_function_name[1] = OTV_NAME( y ); \
165           FT_END_STMNT
166 
167 #define OTV_NEST3( x, y, z )                                 \
168           FT_BEGIN_STMNT                                     \
169             otvalid->nesting_level          = 0;             \
170             otvalid->func[0]                = OTV_FUNC( x ); \
171             otvalid->func[1]                = OTV_FUNC( y ); \
172             otvalid->func[2]                = OTV_FUNC( z ); \
173             otvalid->debug_function_name[0] = OTV_NAME( x ); \
174             otvalid->debug_function_name[1] = OTV_NAME( y ); \
175             otvalid->debug_function_name[2] = OTV_NAME( z ); \
176           FT_END_STMNT
177 
178 #define OTV_INIT  otvalid->debug_indent = 0
179 
180 #define OTV_ENTER                                                                \
181           FT_BEGIN_STMNT                                                         \
182             otvalid->debug_indent += 2;                                          \
183             FT_TRACE4(( "%*.s", otvalid->debug_indent, "" ));                    \
184             FT_TRACE4(( "%s table\n",                                            \
185                         otvalid->debug_function_name[otvalid->nesting_level] )); \
186           FT_END_STMNT
187 
188 #define OTV_NAME_ENTER( name )                                \
189           FT_BEGIN_STMNT                                      \
190             otvalid->debug_indent += 2;                       \
191             FT_TRACE4(( "%*.s", otvalid->debug_indent, "" )); \
192             FT_TRACE4(( "%s table\n", name ));                \
193           FT_END_STMNT
194 
195 #define OTV_EXIT  otvalid->debug_indent -= 2
196 
197 #define OTV_TRACE( s )                                        \
198           FT_BEGIN_STMNT                                      \
199             FT_TRACE4(( "%*.s", otvalid->debug_indent, "" )); \
200             FT_TRACE4( s );                                   \
201           FT_END_STMNT
202 
203 #else   /* !FT_DEBUG_LEVEL_TRACE */
204 
205 #define OTV_NEST1( x )                              \
206           FT_BEGIN_STMNT                            \
207             otvalid->nesting_level = 0;             \
208             otvalid->func[0]       = OTV_FUNC( x ); \
209           FT_END_STMNT
210 
211 #define OTV_NEST2( x, y )                           \
212           FT_BEGIN_STMNT                            \
213             otvalid->nesting_level = 0;             \
214             otvalid->func[0]       = OTV_FUNC( x ); \
215             otvalid->func[1]       = OTV_FUNC( y ); \
216           FT_END_STMNT
217 
218 #define OTV_NEST3( x, y, z )                        \
219           FT_BEGIN_STMNT                            \
220             otvalid->nesting_level = 0;             \
221             otvalid->func[0]       = OTV_FUNC( x ); \
222             otvalid->func[1]       = OTV_FUNC( y ); \
223             otvalid->func[2]       = OTV_FUNC( z ); \
224           FT_END_STMNT
225 
226 #define OTV_INIT                do { } while ( 0 )
227 #define OTV_ENTER               do { } while ( 0 )
228 #define OTV_NAME_ENTER( name )  do { } while ( 0 )
229 #define OTV_EXIT                do { } while ( 0 )
230 
231 #define OTV_TRACE( s )          do { } while ( 0 )
232 
233 #endif  /* !FT_DEBUG_LEVEL_TRACE */
234 
235 
236 #define OTV_RUN  otvalid->func[0]
237 
238 
239   /*************************************************************************/
240   /*************************************************************************/
241   /*****                                                               *****/
242   /*****                       COVERAGE TABLE                          *****/
243   /*****                                                               *****/
244   /*************************************************************************/
245   /*************************************************************************/
246 
247   FT_LOCAL( void )
248   otv_Coverage_validate( FT_Bytes       table,
249                          OTV_Validator  otvalid,
250                          FT_Int         expected_count );
251 
252   /* return first covered glyph */
253   FT_LOCAL( FT_UInt )
254   otv_Coverage_get_first( FT_Bytes  table );
255 
256   /* return last covered glyph */
257   FT_LOCAL( FT_UInt )
258   otv_Coverage_get_last( FT_Bytes  table );
259 
260   /* return number of covered glyphs */
261   FT_LOCAL( FT_UInt )
262   otv_Coverage_get_count( FT_Bytes  table );
263 
264 
265   /*************************************************************************/
266   /*************************************************************************/
267   /*****                                                               *****/
268   /*****                  CLASS DEFINITION TABLE                       *****/
269   /*****                                                               *****/
270   /*************************************************************************/
271   /*************************************************************************/
272 
273   FT_LOCAL( void )
274   otv_ClassDef_validate( FT_Bytes       table,
275                          OTV_Validator  otvalid );
276 
277 
278   /*************************************************************************/
279   /*************************************************************************/
280   /*****                                                               *****/
281   /*****                      DEVICE TABLE                             *****/
282   /*****                                                               *****/
283   /*************************************************************************/
284   /*************************************************************************/
285 
286   FT_LOCAL( void )
287   otv_Device_validate( FT_Bytes       table,
288                        OTV_Validator  otvalid );
289 
290 
291   /*************************************************************************/
292   /*************************************************************************/
293   /*****                                                               *****/
294   /*****                           LOOKUPS                             *****/
295   /*****                                                               *****/
296   /*************************************************************************/
297   /*************************************************************************/
298 
299   FT_LOCAL( void )
300   otv_Lookup_validate( FT_Bytes       table,
301                        OTV_Validator  otvalid );
302 
303   FT_LOCAL( void )
304   otv_LookupList_validate( FT_Bytes       table,
305                            OTV_Validator  otvalid );
306 
307 
308   /*************************************************************************/
309   /*************************************************************************/
310   /*****                                                               *****/
311   /*****                        FEATURES                               *****/
312   /*****                                                               *****/
313   /*************************************************************************/
314   /*************************************************************************/
315 
316   FT_LOCAL( void )
317   otv_Feature_validate( FT_Bytes       table,
318                         OTV_Validator  otvalid );
319 
320   /* lookups must already be validated */
321   FT_LOCAL( void )
322   otv_FeatureList_validate( FT_Bytes       table,
323                             FT_Bytes       lookups,
324                             OTV_Validator  otvalid );
325 
326 
327   /*************************************************************************/
328   /*************************************************************************/
329   /*****                                                               *****/
330   /*****                       LANGUAGE SYSTEM                         *****/
331   /*****                                                               *****/
332   /*************************************************************************/
333   /*************************************************************************/
334 
335   FT_LOCAL( void )
336   otv_LangSys_validate( FT_Bytes       table,
337                         OTV_Validator  otvalid );
338 
339 
340   /*************************************************************************/
341   /*************************************************************************/
342   /*****                                                               *****/
343   /*****                           SCRIPTS                             *****/
344   /*****                                                               *****/
345   /*************************************************************************/
346   /*************************************************************************/
347 
348   FT_LOCAL( void )
349   otv_Script_validate( FT_Bytes       table,
350                        OTV_Validator  otvalid );
351 
352   /* features must already be validated */
353   FT_LOCAL( void )
354   otv_ScriptList_validate( FT_Bytes       table,
355                            FT_Bytes       features,
356                            OTV_Validator  otvalid );
357 
358 
359   /*************************************************************************/
360   /*************************************************************************/
361   /*****                                                               *****/
362   /*****                      UTILITY FUNCTIONS                        *****/
363   /*****                                                               *****/
364   /*************************************************************************/
365   /*************************************************************************/
366 
367 #define ChainPosClassSetFunc  otv_x_Ox
368 #define ChainPosRuleSetFunc   otv_x_Ox
369 #define ChainSubClassSetFunc  otv_x_Ox
370 #define ChainSubRuleSetFunc   otv_x_Ox
371 #define JstfLangSysFunc       otv_x_Ox
372 #define JstfMaxFunc           otv_x_Ox
373 #define LigGlyphFunc          otv_x_Ox
374 #define LigatureArrayFunc     otv_x_Ox
375 #define LigatureSetFunc       otv_x_Ox
376 #define PosClassSetFunc       otv_x_Ox
377 #define PosRuleSetFunc        otv_x_Ox
378 #define SubClassSetFunc       otv_x_Ox
379 #define SubRuleSetFunc        otv_x_Ox
380 
381   FT_LOCAL( void )
382   otv_x_Ox ( FT_Bytes       table,
383              OTV_Validator  otvalid );
384 
385 #define AlternateSubstFormat1Func     otv_u_C_x_Ox
386 #define ChainContextPosFormat1Func    otv_u_C_x_Ox
387 #define ChainContextSubstFormat1Func  otv_u_C_x_Ox
388 #define ContextPosFormat1Func         otv_u_C_x_Ox
389 #define ContextSubstFormat1Func       otv_u_C_x_Ox
390 #define LigatureSubstFormat1Func      otv_u_C_x_Ox
391 #define MultipleSubstFormat1Func      otv_u_C_x_Ox
392 
393   FT_LOCAL( void )
394   otv_u_C_x_Ox( FT_Bytes       table,
395                 OTV_Validator  otvalid );
396 
397 #define AlternateSetFunc     otv_x_ux
398 #define AttachPointFunc      otv_x_ux
399 #define ExtenderGlyphFunc    otv_x_ux
400 #define JstfGPOSModListFunc  otv_x_ux
401 #define JstfGSUBModListFunc  otv_x_ux
402 #define SequenceFunc         otv_x_ux
403 
404   FT_LOCAL( void )
405   otv_x_ux( FT_Bytes       table,
406             OTV_Validator  otvalid );
407 
408 #define PosClassRuleFunc  otv_x_y_ux_sy
409 #define PosRuleFunc       otv_x_y_ux_sy
410 #define SubClassRuleFunc  otv_x_y_ux_sy
411 #define SubRuleFunc       otv_x_y_ux_sy
412 
413   FT_LOCAL( void )
414   otv_x_y_ux_sy( FT_Bytes       table,
415                  OTV_Validator  otvalid );
416 
417 #define ChainPosClassRuleFunc  otv_x_ux_y_uy_z_uz_p_sp
418 #define ChainPosRuleFunc       otv_x_ux_y_uy_z_uz_p_sp
419 #define ChainSubClassRuleFunc  otv_x_ux_y_uy_z_uz_p_sp
420 #define ChainSubRuleFunc       otv_x_ux_y_uy_z_uz_p_sp
421 
422   FT_LOCAL( void )
423   otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes       table,
424                            OTV_Validator  otvalid );
425 
426 #define ContextPosFormat2Func    otv_u_O_O_x_Onx
427 #define ContextSubstFormat2Func  otv_u_O_O_x_Onx
428 
429   FT_LOCAL( void )
430   otv_u_O_O_x_Onx( FT_Bytes       table,
431                    OTV_Validator  otvalid );
432 
433 #define ContextPosFormat3Func    otv_u_x_y_Ox_sy
434 #define ContextSubstFormat3Func  otv_u_x_y_Ox_sy
435 
436   FT_LOCAL( void )
437   otv_u_x_y_Ox_sy( FT_Bytes       table,
438                    OTV_Validator  otvalid );
439 
440 #define ChainContextPosFormat2Func    otv_u_O_O_O_O_x_Onx
441 #define ChainContextSubstFormat2Func  otv_u_O_O_O_O_x_Onx
442 
443   FT_LOCAL( void )
444   otv_u_O_O_O_O_x_Onx( FT_Bytes       table,
445                        OTV_Validator  otvalid );
446 
447 #define ChainContextPosFormat3Func    otv_u_x_Ox_y_Oy_z_Oz_p_sp
448 #define ChainContextSubstFormat3Func  otv_u_x_Ox_y_Oy_z_Oz_p_sp
449 
450   FT_LOCAL( void )
451   otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes       table,
452                              OTV_Validator  otvalid );
453 
454 
455   FT_LOCAL( FT_UInt )
456   otv_GSUBGPOS_get_Lookup_count( FT_Bytes  table );
457 
458   FT_LOCAL( FT_UInt )
459   otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes  table );
460 
461  /* */
462 
463 FT_END_HEADER
464 
465 #endif /* OTVCOMMN_H_ */
466 
467 
468 /* END */
469