/src/freetype/src/gxvalid/gxvbsln.c

https://bitbucket.org/cabalistic/ogredeps/ · C · 333 lines · 159 code · 84 blank · 90 comment · 13 complexity · cacec50a8bda7943b60bf2b16beedad6 MD5 · raw file

  1. /***************************************************************************/
  2. /* */
  3. /* gxvbsln.c */
  4. /* */
  5. /* TrueTypeGX/AAT bsln table validation (body). */
  6. /* */
  7. /* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
  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. /* gxvalid is derived from both gxlayout module and otvalid module. */
  20. /* Development of gxlayout is supported by the Information-technology */
  21. /* Promotion Agency(IPA), Japan. */
  22. /* */
  23. /***************************************************************************/
  24. #include "gxvalid.h"
  25. #include "gxvcommn.h"
  26. /*************************************************************************/
  27. /* */
  28. /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
  29. /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
  30. /* messages during execution. */
  31. /* */
  32. #undef FT_COMPONENT
  33. #define FT_COMPONENT trace_gxvbsln
  34. /*************************************************************************/
  35. /*************************************************************************/
  36. /***** *****/
  37. /***** Data and Types *****/
  38. /***** *****/
  39. /*************************************************************************/
  40. /*************************************************************************/
  41. #define GXV_BSLN_VALUE_COUNT 32
  42. #define GXV_BSLN_VALUE_EMPTY 0xFFFFU
  43. typedef struct GXV_bsln_DataRec_
  44. {
  45. FT_Bytes ctlPoints_p;
  46. FT_UShort defaultBaseline;
  47. } GXV_bsln_DataRec, *GXV_bsln_Data;
  48. #define GXV_BSLN_DATA( field ) GXV_TABLE_DATA( bsln, field )
  49. /*************************************************************************/
  50. /*************************************************************************/
  51. /***** *****/
  52. /***** UTILITY FUNCTIONS *****/
  53. /***** *****/
  54. /*************************************************************************/
  55. /*************************************************************************/
  56. static void
  57. gxv_bsln_LookupValue_validate( FT_UShort glyph,
  58. GXV_LookupValueCPtr value_p,
  59. GXV_Validator valid )
  60. {
  61. FT_UShort v = value_p->u;
  62. FT_UShort* ctlPoints;
  63. FT_UNUSED( glyph );
  64. GXV_NAME_ENTER( "lookup value" );
  65. if ( v >= GXV_BSLN_VALUE_COUNT )
  66. FT_INVALID_DATA;
  67. ctlPoints = (FT_UShort*)GXV_BSLN_DATA( ctlPoints_p );
  68. if ( ctlPoints && ctlPoints[v] == GXV_BSLN_VALUE_EMPTY )
  69. FT_INVALID_DATA;
  70. GXV_EXIT;
  71. }
  72. /*
  73. +===============+ --------+
  74. | lookup header | |
  75. +===============+ |
  76. | BinSrchHeader | |
  77. +===============+ |
  78. | lastGlyph[0] | |
  79. +---------------+ |
  80. | firstGlyph[0] | | head of lookup table
  81. +---------------+ | +
  82. | offset[0] | -> | offset [byte]
  83. +===============+ | +
  84. | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte]
  85. +---------------+ |
  86. | firstGlyph[1] | |
  87. +---------------+ |
  88. | offset[1] | |
  89. +===============+ |
  90. |
  91. ... |
  92. |
  93. 16bit value array |
  94. +===============+ |
  95. | value | <-------+
  96. ...
  97. */
  98. static GXV_LookupValueDesc
  99. gxv_bsln_LookupFmt4_transit( FT_UShort relative_gindex,
  100. GXV_LookupValueCPtr base_value_p,
  101. FT_Bytes lookuptbl_limit,
  102. GXV_Validator valid )
  103. {
  104. FT_Bytes p;
  105. FT_Bytes limit;
  106. FT_UShort offset;
  107. GXV_LookupValueDesc value;
  108. /* XXX: check range ? */
  109. offset = (FT_UShort)( base_value_p->u +
  110. ( relative_gindex * sizeof ( FT_UShort ) ) );
  111. p = valid->lookuptbl_head + offset;
  112. limit = lookuptbl_limit;
  113. GXV_LIMIT_CHECK( 2 );
  114. value.u = FT_NEXT_USHORT( p );
  115. return value;
  116. }
  117. static void
  118. gxv_bsln_parts_fmt0_validate( FT_Bytes tables,
  119. FT_Bytes limit,
  120. GXV_Validator valid )
  121. {
  122. FT_Bytes p = tables;
  123. GXV_NAME_ENTER( "parts format 0" );
  124. /* deltas */
  125. GXV_LIMIT_CHECK( 2 * GXV_BSLN_VALUE_COUNT );
  126. valid->table_data = NULL; /* No ctlPoints here. */
  127. GXV_EXIT;
  128. }
  129. static void
  130. gxv_bsln_parts_fmt1_validate( FT_Bytes tables,
  131. FT_Bytes limit,
  132. GXV_Validator valid )
  133. {
  134. FT_Bytes p = tables;
  135. GXV_NAME_ENTER( "parts format 1" );
  136. /* deltas */
  137. gxv_bsln_parts_fmt0_validate( p, limit, valid );
  138. /* mappingData */
  139. valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
  140. valid->lookupval_func = gxv_bsln_LookupValue_validate;
  141. valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit;
  142. gxv_LookupTable_validate( p + 2 * GXV_BSLN_VALUE_COUNT,
  143. limit,
  144. valid );
  145. GXV_EXIT;
  146. }
  147. static void
  148. gxv_bsln_parts_fmt2_validate( FT_Bytes tables,
  149. FT_Bytes limit,
  150. GXV_Validator valid )
  151. {
  152. FT_Bytes p = tables;
  153. FT_UShort stdGlyph;
  154. FT_UShort ctlPoint;
  155. FT_Int i;
  156. FT_UShort defaultBaseline = GXV_BSLN_DATA( defaultBaseline );
  157. GXV_NAME_ENTER( "parts format 2" );
  158. GXV_LIMIT_CHECK( 2 + ( 2 * GXV_BSLN_VALUE_COUNT ) );
  159. /* stdGlyph */
  160. stdGlyph = FT_NEXT_USHORT( p );
  161. GXV_TRACE(( " (stdGlyph = %u)\n", stdGlyph ));
  162. gxv_glyphid_validate( stdGlyph, valid );
  163. /* Record the position of ctlPoints */
  164. GXV_BSLN_DATA( ctlPoints_p ) = p;
  165. /* ctlPoints */
  166. for ( i = 0; i < GXV_BSLN_VALUE_COUNT; i++ )
  167. {
  168. ctlPoint = FT_NEXT_USHORT( p );
  169. if ( ctlPoint == GXV_BSLN_VALUE_EMPTY )
  170. {
  171. if ( i == defaultBaseline )
  172. FT_INVALID_DATA;
  173. }
  174. else
  175. gxv_ctlPoint_validate( stdGlyph, (FT_Short)ctlPoint, valid );
  176. }
  177. GXV_EXIT;
  178. }
  179. static void
  180. gxv_bsln_parts_fmt3_validate( FT_Bytes tables,
  181. FT_Bytes limit,
  182. GXV_Validator valid)
  183. {
  184. FT_Bytes p = tables;
  185. GXV_NAME_ENTER( "parts format 3" );
  186. /* stdGlyph + ctlPoints */
  187. gxv_bsln_parts_fmt2_validate( p, limit, valid );
  188. /* mappingData */
  189. valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
  190. valid->lookupval_func = gxv_bsln_LookupValue_validate;
  191. valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit;
  192. gxv_LookupTable_validate( p + ( 2 + 2 * GXV_BSLN_VALUE_COUNT ),
  193. limit,
  194. valid );
  195. GXV_EXIT;
  196. }
  197. /*************************************************************************/
  198. /*************************************************************************/
  199. /***** *****/
  200. /***** bsln TABLE *****/
  201. /***** *****/
  202. /*************************************************************************/
  203. /*************************************************************************/
  204. FT_LOCAL_DEF( void )
  205. gxv_bsln_validate( FT_Bytes table,
  206. FT_Face face,
  207. FT_Validator ftvalid )
  208. {
  209. GXV_ValidatorRec validrec;
  210. GXV_Validator valid = &validrec;
  211. GXV_bsln_DataRec bslnrec;
  212. GXV_bsln_Data bsln = &bslnrec;
  213. FT_Bytes p = table;
  214. FT_Bytes limit = 0;
  215. FT_ULong version;
  216. FT_UShort format;
  217. FT_UShort defaultBaseline;
  218. GXV_Validate_Func fmt_funcs_table [] =
  219. {
  220. gxv_bsln_parts_fmt0_validate,
  221. gxv_bsln_parts_fmt1_validate,
  222. gxv_bsln_parts_fmt2_validate,
  223. gxv_bsln_parts_fmt3_validate,
  224. };
  225. valid->root = ftvalid;
  226. valid->table_data = bsln;
  227. valid->face = face;
  228. FT_TRACE3(( "validating `bsln' table\n" ));
  229. GXV_INIT;
  230. GXV_LIMIT_CHECK( 4 + 2 + 2 );
  231. version = FT_NEXT_ULONG( p );
  232. format = FT_NEXT_USHORT( p );
  233. defaultBaseline = FT_NEXT_USHORT( p );
  234. /* only version 1.0 is defined (1996) */
  235. if ( version != 0x00010000UL )
  236. FT_INVALID_FORMAT;
  237. /* only format 1, 2, 3 are defined (1996) */
  238. GXV_TRACE(( " (format = %d)\n", format ));
  239. if ( format > 3 )
  240. FT_INVALID_FORMAT;
  241. if ( defaultBaseline > 31 )
  242. FT_INVALID_FORMAT;
  243. bsln->defaultBaseline = defaultBaseline;
  244. fmt_funcs_table[format]( p, limit, valid );
  245. FT_TRACE4(( "\n" ));
  246. }
  247. /* arch-tag: ebe81143-fdaa-4c68-a4d1-b57227daa3bc
  248. (do not change this comment) */
  249. /* END */