[692] | 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 */
|
---|