/modules/freetype2/src/otvalid/otvcommn.h

http://github.com/zpao/v8monkey · C Header · 437 lines · 252 code · 99 blank · 86 comment · 11 complexity · 0897d4e7765fbf2c8b23e4e43b5b61ea MD5 · raw file

  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. #ifndef __OTVCOMMN_H__
  18. #define __OTVCOMMN_H__
  19. #include <ft2build.h>
  20. #include "otvalid.h"
  21. #include FT_INTERNAL_DEBUG_H
  22. FT_BEGIN_HEADER
  23. /*************************************************************************/
  24. /*************************************************************************/
  25. /***** *****/
  26. /***** VALIDATION *****/
  27. /***** *****/
  28. /*************************************************************************/
  29. /*************************************************************************/
  30. typedef struct OTV_ValidatorRec_* OTV_Validator;
  31. typedef void (*OTV_Validate_Func)( FT_Bytes table,
  32. OTV_Validator valid );
  33. typedef struct OTV_ValidatorRec_
  34. {
  35. FT_Validator root;
  36. FT_UInt type_count;
  37. OTV_Validate_Func* type_funcs;
  38. FT_UInt lookup_count;
  39. FT_UInt glyph_count;
  40. FT_UInt nesting_level;
  41. OTV_Validate_Func func[3];
  42. FT_UInt extra1; /* for passing parameters */
  43. FT_UInt extra2;
  44. FT_Bytes extra3;
  45. #ifdef FT_DEBUG_LEVEL_TRACE
  46. FT_UInt debug_indent;
  47. const FT_String* debug_function_name[3];
  48. #endif
  49. } OTV_ValidatorRec;
  50. #undef FT_INVALID_
  51. #define FT_INVALID_( _prefix, _error ) \
  52. ft_validator_error( valid->root, _prefix ## _error )
  53. #define OTV_OPTIONAL_TABLE( _table ) FT_UShort _table; \
  54. FT_Bytes _table ## _p
  55. #define OTV_OPTIONAL_OFFSET( _offset ) \
  56. FT_BEGIN_STMNT \
  57. _offset ## _p = p; \
  58. _offset = FT_NEXT_USHORT( p ); \
  59. FT_END_STMNT
  60. #define OTV_LIMIT_CHECK( _count ) \
  61. FT_BEGIN_STMNT \
  62. if ( p + (_count) > valid->root->limit ) \
  63. FT_INVALID_TOO_SHORT; \
  64. FT_END_STMNT
  65. #define OTV_SIZE_CHECK( _size ) \
  66. FT_BEGIN_STMNT \
  67. if ( _size > 0 && _size < table_size ) \
  68. { \
  69. if ( valid->root->level == FT_VALIDATE_PARANOID ) \
  70. FT_INVALID_OFFSET; \
  71. else \
  72. { \
  73. /* strip off `const' */ \
  74. FT_Byte* pp = (FT_Byte*)_size ## _p; \
  75. \
  76. \
  77. FT_TRACE3(( "\n" \
  78. "Invalid offset to optional table `%s'" \
  79. " set to zero.\n" \
  80. "\n", #_size )); \
  81. \
  82. /* always assume 16bit entities */ \
  83. _size = pp[0] = pp[1] = 0; \
  84. } \
  85. } \
  86. FT_END_STMNT
  87. #define OTV_NAME_(x) #x
  88. #define OTV_NAME(x) OTV_NAME_(x)
  89. #define OTV_FUNC_(x) x##Func
  90. #define OTV_FUNC(x) OTV_FUNC_(x)
  91. #ifdef FT_DEBUG_LEVEL_TRACE
  92. #define OTV_NEST1( x ) \
  93. FT_BEGIN_STMNT \
  94. valid->nesting_level = 0; \
  95. valid->func[0] = OTV_FUNC( x ); \
  96. valid->debug_function_name[0] = OTV_NAME( x ); \
  97. FT_END_STMNT
  98. #define OTV_NEST2( x, y ) \
  99. FT_BEGIN_STMNT \
  100. valid->nesting_level = 0; \
  101. valid->func[0] = OTV_FUNC( x ); \
  102. valid->func[1] = OTV_FUNC( y ); \
  103. valid->debug_function_name[0] = OTV_NAME( x ); \
  104. valid->debug_function_name[1] = OTV_NAME( y ); \
  105. FT_END_STMNT
  106. #define OTV_NEST3( x, y, z ) \
  107. FT_BEGIN_STMNT \
  108. valid->nesting_level = 0; \
  109. valid->func[0] = OTV_FUNC( x ); \
  110. valid->func[1] = OTV_FUNC( y ); \
  111. valid->func[2] = OTV_FUNC( z ); \
  112. valid->debug_function_name[0] = OTV_NAME( x ); \
  113. valid->debug_function_name[1] = OTV_NAME( y ); \
  114. valid->debug_function_name[2] = OTV_NAME( z ); \
  115. FT_END_STMNT
  116. #define OTV_INIT valid->debug_indent = 0
  117. #define OTV_ENTER \
  118. FT_BEGIN_STMNT \
  119. valid->debug_indent += 2; \
  120. FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
  121. FT_TRACE4(( "%s table\n", \
  122. valid->debug_function_name[valid->nesting_level] )); \
  123. FT_END_STMNT
  124. #define OTV_NAME_ENTER( name ) \
  125. FT_BEGIN_STMNT \
  126. valid->debug_indent += 2; \
  127. FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
  128. FT_TRACE4(( "%s table\n", name )); \
  129. FT_END_STMNT
  130. #define OTV_EXIT valid->debug_indent -= 2
  131. #define OTV_TRACE( s ) \
  132. FT_BEGIN_STMNT \
  133. FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
  134. FT_TRACE4( s ); \
  135. FT_END_STMNT
  136. #else /* !FT_DEBUG_LEVEL_TRACE */
  137. #define OTV_NEST1( x ) \
  138. FT_BEGIN_STMNT \
  139. valid->nesting_level = 0; \
  140. valid->func[0] = OTV_FUNC( x ); \
  141. FT_END_STMNT
  142. #define OTV_NEST2( x, y ) \
  143. FT_BEGIN_STMNT \
  144. valid->nesting_level = 0; \
  145. valid->func[0] = OTV_FUNC( x ); \
  146. valid->func[1] = OTV_FUNC( y ); \
  147. FT_END_STMNT
  148. #define OTV_NEST3( x, y, z ) \
  149. FT_BEGIN_STMNT \
  150. valid->nesting_level = 0; \
  151. valid->func[0] = OTV_FUNC( x ); \
  152. valid->func[1] = OTV_FUNC( y ); \
  153. valid->func[2] = OTV_FUNC( z ); \
  154. FT_END_STMNT
  155. #define OTV_INIT do { } while ( 0 )
  156. #define OTV_ENTER do { } while ( 0 )
  157. #define OTV_NAME_ENTER( name ) do { } while ( 0 )
  158. #define OTV_EXIT do { } while ( 0 )
  159. #define OTV_TRACE( s ) do { } while ( 0 )
  160. #endif /* !FT_DEBUG_LEVEL_TRACE */
  161. #define OTV_RUN valid->func[0]
  162. /*************************************************************************/
  163. /*************************************************************************/
  164. /***** *****/
  165. /***** COVERAGE TABLE *****/
  166. /***** *****/
  167. /*************************************************************************/
  168. /*************************************************************************/
  169. FT_LOCAL( void )
  170. otv_Coverage_validate( FT_Bytes table,
  171. OTV_Validator valid,
  172. FT_Int expected_count );
  173. /* return first covered glyph */
  174. FT_LOCAL( FT_UInt )
  175. otv_Coverage_get_first( FT_Bytes table );
  176. /* return last covered glyph */
  177. FT_LOCAL( FT_UInt )
  178. otv_Coverage_get_last( FT_Bytes table );
  179. /* return number of covered glyphs */
  180. FT_LOCAL( FT_UInt )
  181. otv_Coverage_get_count( FT_Bytes table );
  182. /*************************************************************************/
  183. /*************************************************************************/
  184. /***** *****/
  185. /***** CLASS DEFINITION TABLE *****/
  186. /***** *****/
  187. /*************************************************************************/
  188. /*************************************************************************/
  189. FT_LOCAL( void )
  190. otv_ClassDef_validate( FT_Bytes table,
  191. OTV_Validator valid );
  192. /*************************************************************************/
  193. /*************************************************************************/
  194. /***** *****/
  195. /***** DEVICE TABLE *****/
  196. /***** *****/
  197. /*************************************************************************/
  198. /*************************************************************************/
  199. FT_LOCAL( void )
  200. otv_Device_validate( FT_Bytes table,
  201. OTV_Validator valid );
  202. /*************************************************************************/
  203. /*************************************************************************/
  204. /***** *****/
  205. /***** LOOKUPS *****/
  206. /***** *****/
  207. /*************************************************************************/
  208. /*************************************************************************/
  209. FT_LOCAL( void )
  210. otv_Lookup_validate( FT_Bytes table,
  211. OTV_Validator valid );
  212. FT_LOCAL( void )
  213. otv_LookupList_validate( FT_Bytes table,
  214. OTV_Validator valid );
  215. /*************************************************************************/
  216. /*************************************************************************/
  217. /***** *****/
  218. /***** FEATURES *****/
  219. /***** *****/
  220. /*************************************************************************/
  221. /*************************************************************************/
  222. FT_LOCAL( void )
  223. otv_Feature_validate( FT_Bytes table,
  224. OTV_Validator valid );
  225. /* lookups must already be validated */
  226. FT_LOCAL( void )
  227. otv_FeatureList_validate( FT_Bytes table,
  228. FT_Bytes lookups,
  229. OTV_Validator valid );
  230. /*************************************************************************/
  231. /*************************************************************************/
  232. /***** *****/
  233. /***** LANGUAGE SYSTEM *****/
  234. /***** *****/
  235. /*************************************************************************/
  236. /*************************************************************************/
  237. FT_LOCAL( void )
  238. otv_LangSys_validate( FT_Bytes table,
  239. OTV_Validator valid );
  240. /*************************************************************************/
  241. /*************************************************************************/
  242. /***** *****/
  243. /***** SCRIPTS *****/
  244. /***** *****/
  245. /*************************************************************************/
  246. /*************************************************************************/
  247. FT_LOCAL( void )
  248. otv_Script_validate( FT_Bytes table,
  249. OTV_Validator valid );
  250. /* features must already be validated */
  251. FT_LOCAL( void )
  252. otv_ScriptList_validate( FT_Bytes table,
  253. FT_Bytes features,
  254. OTV_Validator valid );
  255. /*************************************************************************/
  256. /*************************************************************************/
  257. /***** *****/
  258. /***** UTILITY FUNCTIONS *****/
  259. /***** *****/
  260. /*************************************************************************/
  261. /*************************************************************************/
  262. #define ChainPosClassSetFunc otv_x_Ox
  263. #define ChainPosRuleSetFunc otv_x_Ox
  264. #define ChainSubClassSetFunc otv_x_Ox
  265. #define ChainSubRuleSetFunc otv_x_Ox
  266. #define JstfLangSysFunc otv_x_Ox
  267. #define JstfMaxFunc otv_x_Ox
  268. #define LigGlyphFunc otv_x_Ox
  269. #define LigatureArrayFunc otv_x_Ox
  270. #define LigatureSetFunc otv_x_Ox
  271. #define PosClassSetFunc otv_x_Ox
  272. #define PosRuleSetFunc otv_x_Ox
  273. #define SubClassSetFunc otv_x_Ox
  274. #define SubRuleSetFunc otv_x_Ox
  275. FT_LOCAL( void )
  276. otv_x_Ox ( FT_Bytes table,
  277. OTV_Validator valid );
  278. #define AlternateSubstFormat1Func otv_u_C_x_Ox
  279. #define ChainContextPosFormat1Func otv_u_C_x_Ox
  280. #define ChainContextSubstFormat1Func otv_u_C_x_Ox
  281. #define ContextPosFormat1Func otv_u_C_x_Ox
  282. #define ContextSubstFormat1Func otv_u_C_x_Ox
  283. #define LigatureSubstFormat1Func otv_u_C_x_Ox
  284. #define MultipleSubstFormat1Func otv_u_C_x_Ox
  285. FT_LOCAL( void )
  286. otv_u_C_x_Ox( FT_Bytes table,
  287. OTV_Validator valid );
  288. #define AlternateSetFunc otv_x_ux
  289. #define AttachPointFunc otv_x_ux
  290. #define ExtenderGlyphFunc otv_x_ux
  291. #define JstfGPOSModListFunc otv_x_ux
  292. #define JstfGSUBModListFunc otv_x_ux
  293. #define SequenceFunc otv_x_ux
  294. FT_LOCAL( void )
  295. otv_x_ux( FT_Bytes table,
  296. OTV_Validator valid );
  297. #define PosClassRuleFunc otv_x_y_ux_sy
  298. #define PosRuleFunc otv_x_y_ux_sy
  299. #define SubClassRuleFunc otv_x_y_ux_sy
  300. #define SubRuleFunc otv_x_y_ux_sy
  301. FT_LOCAL( void )
  302. otv_x_y_ux_sy( FT_Bytes table,
  303. OTV_Validator valid );
  304. #define ChainPosClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp
  305. #define ChainPosRuleFunc otv_x_ux_y_uy_z_uz_p_sp
  306. #define ChainSubClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp
  307. #define ChainSubRuleFunc otv_x_ux_y_uy_z_uz_p_sp
  308. FT_LOCAL( void )
  309. otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table,
  310. OTV_Validator valid );
  311. #define ContextPosFormat2Func otv_u_O_O_x_Onx
  312. #define ContextSubstFormat2Func otv_u_O_O_x_Onx
  313. FT_LOCAL( void )
  314. otv_u_O_O_x_Onx( FT_Bytes table,
  315. OTV_Validator valid );
  316. #define ContextPosFormat3Func otv_u_x_y_Ox_sy
  317. #define ContextSubstFormat3Func otv_u_x_y_Ox_sy
  318. FT_LOCAL( void )
  319. otv_u_x_y_Ox_sy( FT_Bytes table,
  320. OTV_Validator valid );
  321. #define ChainContextPosFormat2Func otv_u_O_O_O_O_x_Onx
  322. #define ChainContextSubstFormat2Func otv_u_O_O_O_O_x_Onx
  323. FT_LOCAL( void )
  324. otv_u_O_O_O_O_x_Onx( FT_Bytes table,
  325. OTV_Validator valid );
  326. #define ChainContextPosFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp
  327. #define ChainContextSubstFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp
  328. FT_LOCAL( void )
  329. otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table,
  330. OTV_Validator valid );
  331. FT_LOCAL( FT_UInt )
  332. otv_GSUBGPOS_get_Lookup_count( FT_Bytes table );
  333. FT_LOCAL( FT_UInt )
  334. otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table );
  335. /* */
  336. FT_END_HEADER
  337. #endif /* __OTVCOMMN_H__ */
  338. /* END */