PageRenderTime 45ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/modules/freetype2/src/otvalid/otvgdef.c

https://bitbucket.org/MeeGoAdmin/mozilla-central/
C | 224 lines | 115 code | 56 blank | 53 comment | 12 complexity | 4eb8e171af8a500287b7ad4ce7893156 MD5 | raw file
Possible License(s): AGPL-1.0, MIT, BSD-3-Clause, Apache-2.0, LGPL-2.1, 0BSD, LGPL-3.0, MPL-2.0-no-copyleft-exception, GPL-2.0, JSON
  1. /***************************************************************************/
  2. /* */
  3. /* otvgdef.c */
  4. /* */
  5. /* OpenType GDEF table validation (body). */
  6. /* */
  7. /* Copyright 2004, 2005, 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_otvgdef
  27. /*************************************************************************/
  28. /*************************************************************************/
  29. /***** *****/
  30. /***** UTILITY FUNCTIONS *****/
  31. /***** *****/
  32. /*************************************************************************/
  33. /*************************************************************************/
  34. #define AttachListFunc otv_O_x_Ox
  35. #define LigCaretListFunc otv_O_x_Ox
  36. /* sets valid->extra1 (0) */
  37. static void
  38. otv_O_x_Ox( FT_Bytes table,
  39. OTV_Validator valid )
  40. {
  41. FT_Bytes p = table;
  42. FT_Bytes Coverage;
  43. FT_UInt GlyphCount;
  44. OTV_Validate_Func func;
  45. OTV_ENTER;
  46. OTV_LIMIT_CHECK( 4 );
  47. Coverage = table + FT_NEXT_USHORT( p );
  48. GlyphCount = FT_NEXT_USHORT( p );
  49. OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount ));
  50. otv_Coverage_validate( Coverage, valid, GlyphCount );
  51. if ( GlyphCount != otv_Coverage_get_count( Coverage ) )
  52. FT_INVALID_DATA;
  53. OTV_LIMIT_CHECK( GlyphCount * 2 );
  54. valid->nesting_level++;
  55. func = valid->func[valid->nesting_level];
  56. valid->extra1 = 0;
  57. for ( ; GlyphCount > 0; GlyphCount-- )
  58. func( table + FT_NEXT_USHORT( p ), valid );
  59. valid->nesting_level--;
  60. OTV_EXIT;
  61. }
  62. /*************************************************************************/
  63. /*************************************************************************/
  64. /***** *****/
  65. /***** LIGATURE CARETS *****/
  66. /***** *****/
  67. /*************************************************************************/
  68. /*************************************************************************/
  69. #define CaretValueFunc otv_CaretValue_validate
  70. static void
  71. otv_CaretValue_validate( FT_Bytes table,
  72. OTV_Validator valid )
  73. {
  74. FT_Bytes p = table;
  75. FT_UInt CaretValueFormat;
  76. OTV_ENTER;
  77. OTV_LIMIT_CHECK( 4 );
  78. CaretValueFormat = FT_NEXT_USHORT( p );
  79. OTV_TRACE(( " (format = %d)\n", CaretValueFormat ));
  80. switch ( CaretValueFormat )
  81. {
  82. case 1: /* CaretValueFormat1 */
  83. /* skip Coordinate, no test */
  84. break;
  85. case 2: /* CaretValueFormat2 */
  86. /* skip CaretValuePoint, no test */
  87. break;
  88. case 3: /* CaretValueFormat3 */
  89. p += 2; /* skip Coordinate */
  90. OTV_LIMIT_CHECK( 2 );
  91. /* DeviceTable */
  92. otv_Device_validate( table + FT_NEXT_USHORT( p ), valid );
  93. break;
  94. default:
  95. FT_INVALID_FORMAT;
  96. }
  97. OTV_EXIT;
  98. }
  99. /*************************************************************************/
  100. /*************************************************************************/
  101. /***** *****/
  102. /***** GDEF TABLE *****/
  103. /***** *****/
  104. /*************************************************************************/
  105. /*************************************************************************/
  106. /* sets valid->glyph_count */
  107. FT_LOCAL_DEF( void )
  108. otv_GDEF_validate( FT_Bytes table,
  109. FT_Bytes gsub,
  110. FT_Bytes gpos,
  111. FT_UInt glyph_count,
  112. FT_Validator ftvalid )
  113. {
  114. OTV_ValidatorRec validrec;
  115. OTV_Validator valid = &validrec;
  116. FT_Bytes p = table;
  117. FT_UInt table_size;
  118. FT_Bool need_MarkAttachClassDef;
  119. OTV_OPTIONAL_TABLE( GlyphClassDef );
  120. OTV_OPTIONAL_TABLE( AttachListOffset );
  121. OTV_OPTIONAL_TABLE( LigCaretListOffset );
  122. OTV_OPTIONAL_TABLE( MarkAttachClassDef );
  123. valid->root = ftvalid;
  124. FT_TRACE3(( "validating GDEF table\n" ));
  125. OTV_INIT;
  126. OTV_LIMIT_CHECK( 12 );
  127. if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */
  128. FT_INVALID_FORMAT;
  129. /* MarkAttachClassDef has been added to the OpenType */
  130. /* specification without increasing GDEF's version, */
  131. /* so we use this ugly hack to find out whether the */
  132. /* table is needed actually. */
  133. need_MarkAttachClassDef = FT_BOOL(
  134. otv_GSUBGPOS_have_MarkAttachmentType_flag( gsub ) ||
  135. otv_GSUBGPOS_have_MarkAttachmentType_flag( gpos ) );
  136. if ( need_MarkAttachClassDef )
  137. table_size = 12; /* OpenType >= 1.2 */
  138. else
  139. table_size = 10; /* OpenType < 1.2 */
  140. valid->glyph_count = glyph_count;
  141. OTV_OPTIONAL_OFFSET( GlyphClassDef );
  142. OTV_SIZE_CHECK( GlyphClassDef );
  143. if ( GlyphClassDef )
  144. otv_ClassDef_validate( table + GlyphClassDef, valid );
  145. OTV_OPTIONAL_OFFSET( AttachListOffset );
  146. OTV_SIZE_CHECK( AttachListOffset );
  147. if ( AttachListOffset )
  148. {
  149. OTV_NEST2( AttachList, AttachPoint );
  150. OTV_RUN( table + AttachListOffset, valid );
  151. }
  152. OTV_OPTIONAL_OFFSET( LigCaretListOffset );
  153. OTV_SIZE_CHECK( LigCaretListOffset );
  154. if ( LigCaretListOffset )
  155. {
  156. OTV_NEST3( LigCaretList, LigGlyph, CaretValue );
  157. OTV_RUN( table + LigCaretListOffset, valid );
  158. }
  159. if ( need_MarkAttachClassDef )
  160. {
  161. OTV_OPTIONAL_OFFSET( MarkAttachClassDef );
  162. OTV_SIZE_CHECK( MarkAttachClassDef );
  163. if ( MarkAttachClassDef )
  164. otv_ClassDef_validate( table + MarkAttachClassDef, valid );
  165. }
  166. FT_TRACE4(( "\n" ));
  167. }
  168. /* END */