1 | /***************************************************************************/
|
---|
2 | /* */
|
---|
3 | /* ftvalid.h */
|
---|
4 | /* */
|
---|
5 | /* FreeType validation support (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 __FTVALID_H__
|
---|
20 | #define __FTVALID_H__
|
---|
21 |
|
---|
22 | #include <ft2build.h>
|
---|
23 | #include FT_CONFIG_STANDARD_LIBRARY_H /* for ft_setjmp and ft_longjmp */
|
---|
24 |
|
---|
25 |
|
---|
26 | FT_BEGIN_HEADER
|
---|
27 |
|
---|
28 |
|
---|
29 | /*************************************************************************/
|
---|
30 | /*************************************************************************/
|
---|
31 | /*************************************************************************/
|
---|
32 | /**** ****/
|
---|
33 | /**** ****/
|
---|
34 | /**** V A L I D A T I O N ****/
|
---|
35 | /**** ****/
|
---|
36 | /**** ****/
|
---|
37 | /*************************************************************************/
|
---|
38 | /*************************************************************************/
|
---|
39 | /*************************************************************************/
|
---|
40 |
|
---|
41 | /* handle to a validation object */
|
---|
42 | typedef struct FT_ValidatorRec_* FT_Validator;
|
---|
43 |
|
---|
44 |
|
---|
45 | /*************************************************************************/
|
---|
46 | /* */
|
---|
47 | /* There are three distinct validation levels defined here: */
|
---|
48 | /* */
|
---|
49 | /* FT_VALIDATE_DEFAULT :: */
|
---|
50 | /* A table that passes this validation level can be used reliably by */
|
---|
51 | /* FreeType. It generally means that all offsets have been checked to */
|
---|
52 | /* prevent out-of-bound reads, that array counts are correct, etc. */
|
---|
53 | /* */
|
---|
54 | /* FT_VALIDATE_TIGHT :: */
|
---|
55 | /* A table that passes this validation level can be used reliably and */
|
---|
56 | /* doesn't contain invalid data. For example, a charmap table that */
|
---|
57 | /* returns invalid glyph indices will not pass, even though it can */
|
---|
58 | /* be used with FreeType in default mode (the library will simply */
|
---|
59 | /* return an error later when trying to load the glyph). */
|
---|
60 | /* */
|
---|
61 | /* It also checks that fields which must be a multiple of 2, 4, or 8, */
|
---|
62 | /* don't have incorrect values, etc. */
|
---|
63 | /* */
|
---|
64 | /* FT_VALIDATE_PARANOID :: */
|
---|
65 | /* Only for font debugging. Checks that a table follows the */
|
---|
66 | /* specification by 100%. Very few fonts will be able to pass this */
|
---|
67 | /* level anyway but it can be useful for certain tools like font */
|
---|
68 | /* editors/converters. */
|
---|
69 | /* */
|
---|
70 | typedef enum FT_ValidationLevel_
|
---|
71 | {
|
---|
72 | FT_VALIDATE_DEFAULT = 0,
|
---|
73 | FT_VALIDATE_TIGHT,
|
---|
74 | FT_VALIDATE_PARANOID
|
---|
75 |
|
---|
76 | } FT_ValidationLevel;
|
---|
77 |
|
---|
78 |
|
---|
79 | /* validator structure */
|
---|
80 | typedef struct FT_ValidatorRec_
|
---|
81 | {
|
---|
82 | const FT_Byte* base; /* address of table in memory */
|
---|
83 | const FT_Byte* limit; /* `base' + sizeof(table) in memory */
|
---|
84 | FT_ValidationLevel level; /* validation level */
|
---|
85 | FT_Error error; /* error returned. 0 means success */
|
---|
86 |
|
---|
87 | ft_jmp_buf jump_buffer; /* used for exception handling */
|
---|
88 |
|
---|
89 | } FT_ValidatorRec;
|
---|
90 |
|
---|
91 |
|
---|
92 | #define FT_VALIDATOR( x ) ((FT_Validator)( x ))
|
---|
93 |
|
---|
94 |
|
---|
95 | FT_BASE( void )
|
---|
96 | ft_validator_init( FT_Validator valid,
|
---|
97 | const FT_Byte* base,
|
---|
98 | const FT_Byte* limit,
|
---|
99 | FT_ValidationLevel level );
|
---|
100 |
|
---|
101 | FT_BASE( FT_Int )
|
---|
102 | ft_validator_run( FT_Validator valid );
|
---|
103 |
|
---|
104 | /* Sets the error field in a validator, then calls `longjmp' to return */
|
---|
105 | /* to high-level caller. Using `setjmp/longjmp' avoids many stupid */
|
---|
106 | /* error checks within the validation routines. */
|
---|
107 | /* */
|
---|
108 | FT_BASE( void )
|
---|
109 | ft_validator_error( FT_Validator valid,
|
---|
110 | FT_Error error );
|
---|
111 |
|
---|
112 |
|
---|
113 | /* Calls ft_validate_error. Assumes that the `valid' local variable */
|
---|
114 | /* holds a pointer to the current validator object. */
|
---|
115 | /* */
|
---|
116 | /* Use preprocessor prescan to pass FT_ERR_PREFIX. */
|
---|
117 | /* */
|
---|
118 | #define FT_INVALID( _prefix, _error ) FT_INVALID_( _prefix, _error )
|
---|
119 | #define FT_INVALID_( _prefix, _error ) \
|
---|
120 | ft_validator_error( valid, _prefix ## _error )
|
---|
121 |
|
---|
122 | /* called when a broken table is detected */
|
---|
123 | #define FT_INVALID_TOO_SHORT \
|
---|
124 | FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
|
---|
125 |
|
---|
126 | /* called when an invalid offset is detected */
|
---|
127 | #define FT_INVALID_OFFSET \
|
---|
128 | FT_INVALID( FT_ERR_PREFIX, Invalid_Offset )
|
---|
129 |
|
---|
130 | /* called when an invalid format/value is detected */
|
---|
131 | #define FT_INVALID_FORMAT \
|
---|
132 | FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
|
---|
133 |
|
---|
134 | /* called when an invalid glyph index is detected */
|
---|
135 | #define FT_INVALID_GLYPH_ID \
|
---|
136 | FT_INVALID( FT_ERR_PREFIX, Invalid_Glyph_Index )
|
---|
137 |
|
---|
138 | /* called when an invalid field value is detected */
|
---|
139 | #define FT_INVALID_DATA \
|
---|
140 | FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
|
---|
141 |
|
---|
142 |
|
---|
143 | FT_END_HEADER
|
---|
144 |
|
---|
145 | #endif /* __FTVALID_H__ */
|
---|
146 |
|
---|
147 |
|
---|
148 | /* END */
|
---|