/src/freetype/src/otvalid/otvbase.c

https://bitbucket.org/cabalistic/ogredeps/ · C · 318 lines · 189 code · 99 blank · 30 comment · 16 complexity · c0d939234c69fb9d538941662a490eab MD5 · raw file

  1. /***************************************************************************/
  2. /* */
  3. /* otvbase.c */
  4. /* */
  5. /* OpenType BASE table validation (body). */
  6. /* */
  7. /* Copyright 2004, 2007 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. #include "otvalid.h"
  18. #include "otvcommn.h"
  19. /*************************************************************************/
  20. /* */
  21. /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
  22. /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
  23. /* messages during execution. */
  24. /* */
  25. #undef FT_COMPONENT
  26. #define FT_COMPONENT trace_otvbase
  27. static void
  28. otv_BaseCoord_validate( FT_Bytes table,
  29. OTV_Validator valid )
  30. {
  31. FT_Bytes p = table;
  32. FT_UInt BaseCoordFormat;
  33. OTV_NAME_ENTER( "BaseCoord" );
  34. OTV_LIMIT_CHECK( 4 );
  35. BaseCoordFormat = FT_NEXT_USHORT( p );
  36. p += 2; /* skip Coordinate */
  37. OTV_TRACE(( " (format %d)\n", BaseCoordFormat ));
  38. switch ( BaseCoordFormat )
  39. {
  40. case 1: /* BaseCoordFormat1 */
  41. break;
  42. case 2: /* BaseCoordFormat2 */
  43. OTV_LIMIT_CHECK( 4 ); /* ReferenceGlyph, BaseCoordPoint */
  44. break;
  45. case 3: /* BaseCoordFormat3 */
  46. OTV_LIMIT_CHECK( 2 );
  47. /* DeviceTable */
  48. otv_Device_validate( table + FT_NEXT_USHORT( p ), valid );
  49. break;
  50. default:
  51. FT_INVALID_FORMAT;
  52. }
  53. OTV_EXIT;
  54. }
  55. static void
  56. otv_BaseTagList_validate( FT_Bytes table,
  57. OTV_Validator valid )
  58. {
  59. FT_Bytes p = table;
  60. FT_UInt BaseTagCount;
  61. OTV_NAME_ENTER( "BaseTagList" );
  62. OTV_LIMIT_CHECK( 2 );
  63. BaseTagCount = FT_NEXT_USHORT( p );
  64. OTV_TRACE(( " (BaseTagCount = %d)\n", BaseTagCount ));
  65. OTV_LIMIT_CHECK( BaseTagCount * 4 ); /* BaselineTag */
  66. OTV_EXIT;
  67. }
  68. static void
  69. otv_BaseValues_validate( FT_Bytes table,
  70. OTV_Validator valid )
  71. {
  72. FT_Bytes p = table;
  73. FT_UInt BaseCoordCount;
  74. OTV_NAME_ENTER( "BaseValues" );
  75. OTV_LIMIT_CHECK( 4 );
  76. p += 2; /* skip DefaultIndex */
  77. BaseCoordCount = FT_NEXT_USHORT( p );
  78. OTV_TRACE(( " (BaseCoordCount = %d)\n", BaseCoordCount ));
  79. OTV_LIMIT_CHECK( BaseCoordCount * 2 );
  80. /* BaseCoord */
  81. for ( ; BaseCoordCount > 0; BaseCoordCount-- )
  82. otv_BaseCoord_validate( table + FT_NEXT_USHORT( p ), valid );
  83. OTV_EXIT;
  84. }
  85. static void
  86. otv_MinMax_validate( FT_Bytes table,
  87. OTV_Validator valid )
  88. {
  89. FT_Bytes p = table;
  90. FT_UInt table_size;
  91. FT_UInt FeatMinMaxCount;
  92. OTV_OPTIONAL_TABLE( MinCoord );
  93. OTV_OPTIONAL_TABLE( MaxCoord );
  94. OTV_NAME_ENTER( "MinMax" );
  95. OTV_LIMIT_CHECK( 6 );
  96. OTV_OPTIONAL_OFFSET( MinCoord );
  97. OTV_OPTIONAL_OFFSET( MaxCoord );
  98. FeatMinMaxCount = FT_NEXT_USHORT( p );
  99. OTV_TRACE(( " (FeatMinMaxCount = %d)\n", FeatMinMaxCount ));
  100. table_size = FeatMinMaxCount * 8 + 6;
  101. OTV_SIZE_CHECK( MinCoord );
  102. if ( MinCoord )
  103. otv_BaseCoord_validate( table + MinCoord, valid );
  104. OTV_SIZE_CHECK( MaxCoord );
  105. if ( MaxCoord )
  106. otv_BaseCoord_validate( table + MaxCoord, valid );
  107. OTV_LIMIT_CHECK( FeatMinMaxCount * 8 );
  108. /* FeatMinMaxRecord */
  109. for ( ; FeatMinMaxCount > 0; FeatMinMaxCount-- )
  110. {
  111. p += 4; /* skip FeatureTableTag */
  112. OTV_OPTIONAL_OFFSET( MinCoord );
  113. OTV_OPTIONAL_OFFSET( MaxCoord );
  114. OTV_SIZE_CHECK( MinCoord );
  115. if ( MinCoord )
  116. otv_BaseCoord_validate( table + MinCoord, valid );
  117. OTV_SIZE_CHECK( MaxCoord );
  118. if ( MaxCoord )
  119. otv_BaseCoord_validate( table + MaxCoord, valid );
  120. }
  121. OTV_EXIT;
  122. }
  123. static void
  124. otv_BaseScript_validate( FT_Bytes table,
  125. OTV_Validator valid )
  126. {
  127. FT_Bytes p = table;
  128. FT_UInt table_size;
  129. FT_UInt BaseLangSysCount;
  130. OTV_OPTIONAL_TABLE( BaseValues );
  131. OTV_OPTIONAL_TABLE( DefaultMinMax );
  132. OTV_NAME_ENTER( "BaseScript" );
  133. OTV_LIMIT_CHECK( 6 );
  134. OTV_OPTIONAL_OFFSET( BaseValues );
  135. OTV_OPTIONAL_OFFSET( DefaultMinMax );
  136. BaseLangSysCount = FT_NEXT_USHORT( p );
  137. OTV_TRACE(( " (BaseLangSysCount = %d)\n", BaseLangSysCount ));
  138. table_size = BaseLangSysCount * 6 + 6;
  139. OTV_SIZE_CHECK( BaseValues );
  140. if ( BaseValues )
  141. otv_BaseValues_validate( table + BaseValues, valid );
  142. OTV_SIZE_CHECK( DefaultMinMax );
  143. if ( DefaultMinMax )
  144. otv_MinMax_validate( table + DefaultMinMax, valid );
  145. OTV_LIMIT_CHECK( BaseLangSysCount * 6 );
  146. /* BaseLangSysRecord */
  147. for ( ; BaseLangSysCount > 0; BaseLangSysCount-- )
  148. {
  149. p += 4; /* skip BaseLangSysTag */
  150. otv_MinMax_validate( table + FT_NEXT_USHORT( p ), valid );
  151. }
  152. OTV_EXIT;
  153. }
  154. static void
  155. otv_BaseScriptList_validate( FT_Bytes table,
  156. OTV_Validator valid )
  157. {
  158. FT_Bytes p = table;
  159. FT_UInt BaseScriptCount;
  160. OTV_NAME_ENTER( "BaseScriptList" );
  161. OTV_LIMIT_CHECK( 2 );
  162. BaseScriptCount = FT_NEXT_USHORT( p );
  163. OTV_TRACE(( " (BaseScriptCount = %d)\n", BaseScriptCount ));
  164. OTV_LIMIT_CHECK( BaseScriptCount * 6 );
  165. /* BaseScriptRecord */
  166. for ( ; BaseScriptCount > 0; BaseScriptCount-- )
  167. {
  168. p += 4; /* skip BaseScriptTag */
  169. /* BaseScript */
  170. otv_BaseScript_validate( table + FT_NEXT_USHORT( p ), valid );
  171. }
  172. OTV_EXIT;
  173. }
  174. static void
  175. otv_Axis_validate( FT_Bytes table,
  176. OTV_Validator valid )
  177. {
  178. FT_Bytes p = table;
  179. FT_UInt table_size;
  180. OTV_OPTIONAL_TABLE( BaseTagList );
  181. OTV_NAME_ENTER( "Axis" );
  182. OTV_LIMIT_CHECK( 4 );
  183. OTV_OPTIONAL_OFFSET( BaseTagList );
  184. table_size = 4;
  185. OTV_SIZE_CHECK( BaseTagList );
  186. if ( BaseTagList )
  187. otv_BaseTagList_validate( table + BaseTagList, valid );
  188. /* BaseScriptList */
  189. otv_BaseScriptList_validate( table + FT_NEXT_USHORT( p ), valid );
  190. OTV_EXIT;
  191. }
  192. FT_LOCAL_DEF( void )
  193. otv_BASE_validate( FT_Bytes table,
  194. FT_Validator ftvalid )
  195. {
  196. OTV_ValidatorRec validrec;
  197. OTV_Validator valid = &validrec;
  198. FT_Bytes p = table;
  199. FT_UInt table_size;
  200. OTV_OPTIONAL_TABLE( HorizAxis );
  201. OTV_OPTIONAL_TABLE( VertAxis );
  202. valid->root = ftvalid;
  203. FT_TRACE3(( "validating BASE table\n" ));
  204. OTV_INIT;
  205. OTV_LIMIT_CHECK( 6 );
  206. if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */
  207. FT_INVALID_FORMAT;
  208. table_size = 6;
  209. OTV_OPTIONAL_OFFSET( HorizAxis );
  210. OTV_SIZE_CHECK( HorizAxis );
  211. if ( HorizAxis )
  212. otv_Axis_validate( table + HorizAxis, valid );
  213. OTV_OPTIONAL_OFFSET( VertAxis );
  214. OTV_SIZE_CHECK( VertAxis );
  215. if ( VertAxis )
  216. otv_Axis_validate( table + VertAxis, valid );
  217. FT_TRACE4(( "\n" ));
  218. }
  219. /* END */