/src/freetype/src/gxvalid/gxvcommn.h

https://bitbucket.org/cabalistic/ogredeps/ · C++ Header · 582 lines · 327 code · 141 blank · 114 comment · 14 complexity · 4a945465f605e5a2d236d560ab021e6b MD5 · raw file

  1. /***************************************************************************/
  2. /* */
  3. /* gxvcommn.h */
  4. /* */
  5. /* TrueTypeGX/AAT common tables validation (specification). */
  6. /* */
  7. /* Copyright 2004, 2005, 2012 */
  8. /* by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
  9. /* David Turner, Robert Wilhelm, and Werner Lemberg. */
  10. /* */
  11. /* This file is part of the FreeType project, and may only be used, */
  12. /* modified, and distributed under the terms of the FreeType project */
  13. /* license, LICENSE.TXT. By continuing to use, modify, or distribute */
  14. /* this file you indicate that you have read the license and */
  15. /* understand and accept it fully. */
  16. /* */
  17. /***************************************************************************/
  18. /***************************************************************************/
  19. /* */
  20. /* gxvalid is derived from both gxlayout module and otvalid module. */
  21. /* Development of gxlayout is supported by the Information-technology */
  22. /* Promotion Agency(IPA), Japan. */
  23. /* */
  24. /***************************************************************************/
  25. /*
  26. * keywords in variable naming
  27. * ---------------------------
  28. * table: Of type FT_Bytes, pointing to the start of this table/subtable.
  29. * limit: Of type FT_Bytes, pointing to the end of this table/subtable,
  30. * including padding for alignment.
  31. * offset: Of type FT_UInt, the number of octets from the start to target.
  32. * length: Of type FT_UInt, the number of octets from the start to the
  33. * end in this table/subtable, including padding for alignment.
  34. *
  35. * _MIN, _MAX: Should be added to the tail of macros, as INT_MIN, etc.
  36. */
  37. #ifndef __GXVCOMMN_H__
  38. #define __GXVCOMMN_H__
  39. #include <ft2build.h>
  40. #include "gxvalid.h"
  41. #include FT_INTERNAL_DEBUG_H
  42. #include FT_SFNT_NAMES_H
  43. FT_BEGIN_HEADER
  44. /* some variables are not evaluated or only used in trace */
  45. #ifdef FT_DEBUG_LEVEL_TRACE
  46. #define GXV_LOAD_TRACE_VARS
  47. #else
  48. #undef GXV_LOAD_TRACE_VARS
  49. #endif
  50. #undef GXV_LOAD_UNUSED_VARS /* debug purpose */
  51. #define IS_PARANOID_VALIDATION ( valid->root->level >= FT_VALIDATE_PARANOID )
  52. #define GXV_SET_ERR_IF_PARANOID( err ) { if ( IS_PARANOID_VALIDATION ) ( err ); }
  53. /*************************************************************************/
  54. /*************************************************************************/
  55. /***** *****/
  56. /***** VALIDATION *****/
  57. /***** *****/
  58. /*************************************************************************/
  59. /*************************************************************************/
  60. typedef struct GXV_ValidatorRec_* GXV_Validator;
  61. #define DUMMY_LIMIT 0
  62. typedef void
  63. (*GXV_Validate_Func)( FT_Bytes table,
  64. FT_Bytes limit,
  65. GXV_Validator valid );
  66. /* ====================== LookupTable Validator ======================== */
  67. typedef union GXV_LookupValueDesc_
  68. {
  69. FT_UShort u;
  70. FT_Short s;
  71. } GXV_LookupValueDesc;
  72. typedef const GXV_LookupValueDesc* GXV_LookupValueCPtr;
  73. typedef enum GXV_LookupValue_SignSpec_
  74. {
  75. GXV_LOOKUPVALUE_UNSIGNED = 0,
  76. GXV_LOOKUPVALUE_SIGNED
  77. } GXV_LookupValue_SignSpec;
  78. typedef void
  79. (*GXV_Lookup_Value_Validate_Func)( FT_UShort glyph,
  80. GXV_LookupValueCPtr value_p,
  81. GXV_Validator valid );
  82. typedef GXV_LookupValueDesc
  83. (*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort relative_gindex,
  84. GXV_LookupValueCPtr base_value_p,
  85. FT_Bytes lookuptbl_limit,
  86. GXV_Validator valid );
  87. /* ====================== StateTable Validator ========================= */
  88. typedef enum GXV_GlyphOffset_Format_
  89. {
  90. GXV_GLYPHOFFSET_NONE = -1,
  91. GXV_GLYPHOFFSET_UCHAR = 2,
  92. GXV_GLYPHOFFSET_CHAR,
  93. GXV_GLYPHOFFSET_USHORT = 4,
  94. GXV_GLYPHOFFSET_SHORT,
  95. GXV_GLYPHOFFSET_ULONG = 8,
  96. GXV_GLYPHOFFSET_LONG
  97. } GXV_GlyphOffset_Format;
  98. #define GXV_GLYPHOFFSET_FMT( table ) \
  99. ( valid->table.entry_glyphoffset_fmt )
  100. #define GXV_GLYPHOFFSET_SIZE( table ) \
  101. ( valid->table.entry_glyphoffset_fmt / 2 )
  102. /* ----------------------- 16bit StateTable ---------------------------- */
  103. typedef union GXV_StateTable_GlyphOffsetDesc_
  104. {
  105. FT_Byte uc;
  106. FT_UShort u; /* same as GXV_LookupValueDesc */
  107. FT_ULong ul;
  108. FT_Char c;
  109. FT_Short s; /* same as GXV_LookupValueDesc */
  110. FT_Long l;
  111. } GXV_StateTable_GlyphOffsetDesc;
  112. typedef const GXV_StateTable_GlyphOffsetDesc* GXV_StateTable_GlyphOffsetCPtr;
  113. typedef void
  114. (*GXV_StateTable_Subtable_Setup_Func)( FT_UShort table_size,
  115. FT_UShort classTable,
  116. FT_UShort stateArray,
  117. FT_UShort entryTable,
  118. FT_UShort* classTable_length_p,
  119. FT_UShort* stateArray_length_p,
  120. FT_UShort* entryTable_length_p,
  121. GXV_Validator valid );
  122. typedef void
  123. (*GXV_StateTable_Entry_Validate_Func)(
  124. FT_Byte state,
  125. FT_UShort flags,
  126. GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
  127. FT_Bytes statetable_table,
  128. FT_Bytes statetable_limit,
  129. GXV_Validator valid );
  130. typedef void
  131. (*GXV_StateTable_OptData_Load_Func)( FT_Bytes table,
  132. FT_Bytes limit,
  133. GXV_Validator valid );
  134. typedef struct GXV_StateTable_ValidatorRec_
  135. {
  136. GXV_GlyphOffset_Format entry_glyphoffset_fmt;
  137. void* optdata;
  138. GXV_StateTable_Subtable_Setup_Func subtable_setup_func;
  139. GXV_StateTable_Entry_Validate_Func entry_validate_func;
  140. GXV_StateTable_OptData_Load_Func optdata_load_func;
  141. } GXV_StateTable_ValidatorRec, *GXV_StateTable_ValidatorRecData;
  142. /* ---------------------- 32bit XStateTable ---------------------------- */
  143. typedef GXV_StateTable_GlyphOffsetDesc GXV_XStateTable_GlyphOffsetDesc;
  144. typedef const GXV_XStateTable_GlyphOffsetDesc* GXV_XStateTable_GlyphOffsetCPtr;
  145. typedef void
  146. (*GXV_XStateTable_Subtable_Setup_Func)( FT_ULong table_size,
  147. FT_ULong classTable,
  148. FT_ULong stateArray,
  149. FT_ULong entryTable,
  150. FT_ULong* classTable_length_p,
  151. FT_ULong* stateArray_length_p,
  152. FT_ULong* entryTable_length_p,
  153. GXV_Validator valid );
  154. typedef void
  155. (*GXV_XStateTable_Entry_Validate_Func)(
  156. FT_UShort state,
  157. FT_UShort flags,
  158. GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
  159. FT_Bytes xstatetable_table,
  160. FT_Bytes xstatetable_limit,
  161. GXV_Validator valid );
  162. typedef GXV_StateTable_OptData_Load_Func GXV_XStateTable_OptData_Load_Func;
  163. typedef struct GXV_XStateTable_ValidatorRec_
  164. {
  165. int entry_glyphoffset_fmt;
  166. void* optdata;
  167. GXV_XStateTable_Subtable_Setup_Func subtable_setup_func;
  168. GXV_XStateTable_Entry_Validate_Func entry_validate_func;
  169. GXV_XStateTable_OptData_Load_Func optdata_load_func;
  170. FT_ULong nClasses;
  171. FT_UShort maxClassID;
  172. } GXV_XStateTable_ValidatorRec, *GXV_XStateTable_ValidatorRecData;
  173. /* ===================================================================== */
  174. typedef struct GXV_ValidatorRec_
  175. {
  176. FT_Validator root;
  177. FT_Face face;
  178. void* table_data;
  179. FT_ULong subtable_length;
  180. GXV_LookupValue_SignSpec lookupval_sign;
  181. GXV_Lookup_Value_Validate_Func lookupval_func;
  182. GXV_Lookup_Fmt4_Transit_Func lookupfmt4_trans;
  183. FT_Bytes lookuptbl_head;
  184. FT_UShort min_gid;
  185. FT_UShort max_gid;
  186. GXV_StateTable_ValidatorRec statetable;
  187. GXV_XStateTable_ValidatorRec xstatetable;
  188. #ifdef FT_DEBUG_LEVEL_TRACE
  189. FT_UInt debug_indent;
  190. const FT_String* debug_function_name[3];
  191. #endif
  192. } GXV_ValidatorRec;
  193. #define GXV_TABLE_DATA( tag, field ) \
  194. ( ( (GXV_ ## tag ## _Data)valid->table_data )->field )
  195. #undef FT_INVALID_
  196. #define FT_INVALID_( _prefix, _error ) \
  197. ft_validator_error( valid->root, _prefix ## _error )
  198. #define GXV_LIMIT_CHECK( _count ) \
  199. FT_BEGIN_STMNT \
  200. if ( p + _count > ( limit? limit : valid->root->limit ) ) \
  201. FT_INVALID_TOO_SHORT; \
  202. FT_END_STMNT
  203. #ifdef FT_DEBUG_LEVEL_TRACE
  204. #define GXV_INIT valid->debug_indent = 0
  205. #define GXV_NAME_ENTER( name ) \
  206. FT_BEGIN_STMNT \
  207. valid->debug_indent += 2; \
  208. FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
  209. FT_TRACE4(( "%s table\n", name )); \
  210. FT_END_STMNT
  211. #define GXV_EXIT valid->debug_indent -= 2
  212. #define GXV_TRACE( s ) \
  213. FT_BEGIN_STMNT \
  214. FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
  215. FT_TRACE4( s ); \
  216. FT_END_STMNT
  217. #else /* !FT_DEBUG_LEVEL_TRACE */
  218. #define GXV_INIT do { } while ( 0 )
  219. #define GXV_NAME_ENTER( name ) do { } while ( 0 )
  220. #define GXV_EXIT do { } while ( 0 )
  221. #define GXV_TRACE( s ) do { } while ( 0 )
  222. #endif /* !FT_DEBUG_LEVEL_TRACE */
  223. /*************************************************************************/
  224. /*************************************************************************/
  225. /***** *****/
  226. /***** 32bit alignment checking *****/
  227. /***** *****/
  228. /*************************************************************************/
  229. /*************************************************************************/
  230. #define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \
  231. FT_BEGIN_STMNT \
  232. { \
  233. if ( (a) & 3 ) \
  234. FT_INVALID_OFFSET ; \
  235. } \
  236. FT_END_STMNT
  237. /*************************************************************************/
  238. /*************************************************************************/
  239. /***** *****/
  240. /***** Dumping Binary Data *****/
  241. /***** *****/
  242. /*************************************************************************/
  243. /*************************************************************************/
  244. #define GXV_TRACE_HEXDUMP( p, len ) \
  245. FT_BEGIN_STMNT \
  246. { \
  247. FT_Bytes b; \
  248. \
  249. \
  250. for ( b = p; b < (FT_Bytes)p + len; b++ ) \
  251. FT_TRACE1(("\\x%02x", *b)) ; \
  252. } \
  253. FT_END_STMNT
  254. #define GXV_TRACE_HEXDUMP_C( p, len ) \
  255. FT_BEGIN_STMNT \
  256. { \
  257. FT_Bytes b; \
  258. \
  259. \
  260. for ( b = p; b < (FT_Bytes)p + len; b++ ) \
  261. if ( 0x40 < *b && *b < 0x7e ) \
  262. FT_TRACE1(("%c", *b)) ; \
  263. else \
  264. FT_TRACE1(("\\x%02x", *b)) ; \
  265. } \
  266. FT_END_STMNT
  267. #define GXV_TRACE_HEXDUMP_SFNTNAME( n ) \
  268. GXV_TRACE_HEXDUMP( n.string, n.string_len )
  269. /*************************************************************************/
  270. /*************************************************************************/
  271. /***** *****/
  272. /***** LOOKUP TABLE *****/
  273. /***** *****/
  274. /*************************************************************************/
  275. /*************************************************************************/
  276. FT_LOCAL( void )
  277. gxv_BinSrchHeader_validate( FT_Bytes p,
  278. FT_Bytes limit,
  279. FT_UShort* unitSize_p,
  280. FT_UShort* nUnits_p,
  281. GXV_Validator valid );
  282. FT_LOCAL( void )
  283. gxv_LookupTable_validate( FT_Bytes table,
  284. FT_Bytes limit,
  285. GXV_Validator valid );
  286. /*************************************************************************/
  287. /*************************************************************************/
  288. /***** *****/
  289. /***** Glyph ID *****/
  290. /***** *****/
  291. /*************************************************************************/
  292. /*************************************************************************/
  293. FT_LOCAL( FT_Int )
  294. gxv_glyphid_validate( FT_UShort gid,
  295. GXV_Validator valid );
  296. /*************************************************************************/
  297. /*************************************************************************/
  298. /***** *****/
  299. /***** CONTROL POINT *****/
  300. /***** *****/
  301. /*************************************************************************/
  302. /*************************************************************************/
  303. FT_LOCAL( void )
  304. gxv_ctlPoint_validate( FT_UShort gid,
  305. FT_Short ctl_point,
  306. GXV_Validator valid );
  307. /*************************************************************************/
  308. /*************************************************************************/
  309. /***** *****/
  310. /***** SFNT NAME *****/
  311. /***** *****/
  312. /*************************************************************************/
  313. /*************************************************************************/
  314. FT_LOCAL( void )
  315. gxv_sfntName_validate( FT_UShort name_index,
  316. FT_UShort min_index,
  317. FT_UShort max_index,
  318. GXV_Validator valid );
  319. /*************************************************************************/
  320. /*************************************************************************/
  321. /***** *****/
  322. /***** STATE TABLE *****/
  323. /***** *****/
  324. /*************************************************************************/
  325. /*************************************************************************/
  326. FT_LOCAL( void )
  327. gxv_StateTable_subtable_setup( FT_UShort table_size,
  328. FT_UShort classTable,
  329. FT_UShort stateArray,
  330. FT_UShort entryTable,
  331. FT_UShort* classTable_length_p,
  332. FT_UShort* stateArray_length_p,
  333. FT_UShort* entryTable_length_p,
  334. GXV_Validator valid );
  335. FT_LOCAL( void )
  336. gxv_XStateTable_subtable_setup( FT_ULong table_size,
  337. FT_ULong classTable,
  338. FT_ULong stateArray,
  339. FT_ULong entryTable,
  340. FT_ULong* classTable_length_p,
  341. FT_ULong* stateArray_length_p,
  342. FT_ULong* entryTable_length_p,
  343. GXV_Validator valid );
  344. FT_LOCAL( void )
  345. gxv_StateTable_validate( FT_Bytes table,
  346. FT_Bytes limit,
  347. GXV_Validator valid );
  348. FT_LOCAL( void )
  349. gxv_XStateTable_validate( FT_Bytes table,
  350. FT_Bytes limit,
  351. GXV_Validator valid );
  352. /*************************************************************************/
  353. /*************************************************************************/
  354. /***** *****/
  355. /***** UTILITY MACROS AND FUNCTIONS *****/
  356. /***** *****/
  357. /*************************************************************************/
  358. /*************************************************************************/
  359. FT_LOCAL( void )
  360. gxv_array_getlimits_byte( FT_Bytes table,
  361. FT_Bytes limit,
  362. FT_Byte* min,
  363. FT_Byte* max,
  364. GXV_Validator valid );
  365. FT_LOCAL( void )
  366. gxv_array_getlimits_ushort( FT_Bytes table,
  367. FT_Bytes limit,
  368. FT_UShort* min,
  369. FT_UShort* max,
  370. GXV_Validator valid );
  371. FT_LOCAL( void )
  372. gxv_set_length_by_ushort_offset( FT_UShort* offset,
  373. FT_UShort** length,
  374. FT_UShort* buff,
  375. FT_UInt nmemb,
  376. FT_UShort limit,
  377. GXV_Validator valid );
  378. FT_LOCAL( void )
  379. gxv_set_length_by_ulong_offset( FT_ULong* offset,
  380. FT_ULong** length,
  381. FT_ULong* buff,
  382. FT_UInt nmemb,
  383. FT_ULong limit,
  384. GXV_Validator valid);
  385. #define GXV_SUBTABLE_OFFSET_CHECK( _offset ) \
  386. FT_BEGIN_STMNT \
  387. if ( (_offset) > valid->subtable_length ) \
  388. FT_INVALID_OFFSET; \
  389. FT_END_STMNT
  390. #define GXV_SUBTABLE_LIMIT_CHECK( _count ) \
  391. FT_BEGIN_STMNT \
  392. if ( ( p + (_count) - valid->subtable_start ) > \
  393. valid->subtable_length ) \
  394. FT_INVALID_TOO_SHORT; \
  395. FT_END_STMNT
  396. #define GXV_USHORT_TO_SHORT( _us ) \
  397. ( ( 0x8000U < ( _us ) ) ? ( ( _us ) - 0x8000U ) : ( _us ) )
  398. #define GXV_STATETABLE_HEADER_SIZE ( 2 + 2 + 2 + 2 )
  399. #define GXV_STATEHEADER_SIZE GXV_STATETABLE_HEADER_SIZE
  400. #define GXV_XSTATETABLE_HEADER_SIZE ( 4 + 4 + 4 + 4 )
  401. #define GXV_XSTATEHEADER_SIZE GXV_XSTATETABLE_HEADER_SIZE
  402. /*************************************************************************/
  403. /*************************************************************************/
  404. /***** *****/
  405. /***** Table overlapping *****/
  406. /***** *****/
  407. /*************************************************************************/
  408. /*************************************************************************/
  409. typedef struct GXV_odtect_DataRec_
  410. {
  411. FT_Bytes start;
  412. FT_ULong length;
  413. FT_String* name;
  414. } GXV_odtect_DataRec, *GXV_odtect_Data;
  415. typedef struct GXV_odtect_RangeRec_
  416. {
  417. FT_UInt nRanges;
  418. GXV_odtect_Data range;
  419. } GXV_odtect_RangeRec, *GXV_odtect_Range;
  420. FT_LOCAL( void )
  421. gxv_odtect_add_range( FT_Bytes start,
  422. FT_ULong length,
  423. const FT_String* name,
  424. GXV_odtect_Range odtect );
  425. FT_LOCAL( void )
  426. gxv_odtect_validate( GXV_odtect_Range odtect,
  427. GXV_Validator valid );
  428. #define GXV_ODTECT( n, odtect ) \
  429. GXV_odtect_DataRec odtect ## _range[n]; \
  430. GXV_odtect_RangeRec odtect ## _rec = { 0, NULL }; \
  431. GXV_odtect_Range odtect = NULL
  432. #define GXV_ODTECT_INIT( odtect ) \
  433. FT_BEGIN_STMNT \
  434. odtect ## _rec.nRanges = 0; \
  435. odtect ## _rec.range = odtect ## _range; \
  436. odtect = & odtect ## _rec; \
  437. FT_END_STMNT
  438. /* */
  439. FT_END_HEADER
  440. #endif /* __GXVCOMMN_H__ */
  441. /* END */