PageRenderTime 41ms CodeModel.GetById 19ms app.highlight 17ms RepoModel.GetById 1ms app.codeStats 0ms

/src/freetype/src/otvalid/otvgdef.c

https://bitbucket.org/cabalistic/ogredeps/
C | 224 lines | 115 code | 56 blank | 53 comment | 12 complexity | 4eb8e171af8a500287b7ad4ce7893156 MD5 | raw file
  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
 18
 19#include "otvalid.h"
 20#include "otvcommn.h"
 21
 22
 23  /*************************************************************************/
 24  /*                                                                       */
 25  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
 26  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
 27  /* messages during execution.                                            */
 28  /*                                                                       */
 29#undef  FT_COMPONENT
 30#define FT_COMPONENT  trace_otvgdef
 31
 32
 33  /*************************************************************************/
 34  /*************************************************************************/
 35  /*****                                                               *****/
 36  /*****                      UTILITY FUNCTIONS                        *****/
 37  /*****                                                               *****/
 38  /*************************************************************************/
 39  /*************************************************************************/
 40
 41#define AttachListFunc    otv_O_x_Ox
 42#define LigCaretListFunc  otv_O_x_Ox
 43
 44  /* sets valid->extra1 (0)           */
 45
 46  static void
 47  otv_O_x_Ox( FT_Bytes       table,
 48              OTV_Validator  valid )
 49  {
 50    FT_Bytes           p = table;
 51    FT_Bytes           Coverage;
 52    FT_UInt            GlyphCount;
 53    OTV_Validate_Func  func;
 54
 55
 56    OTV_ENTER;
 57
 58    OTV_LIMIT_CHECK( 4 );
 59    Coverage   = table + FT_NEXT_USHORT( p );
 60    GlyphCount = FT_NEXT_USHORT( p );
 61
 62    OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount ));
 63
 64    otv_Coverage_validate( Coverage, valid, GlyphCount );
 65    if ( GlyphCount != otv_Coverage_get_count( Coverage ) )
 66      FT_INVALID_DATA;
 67
 68    OTV_LIMIT_CHECK( GlyphCount * 2 );
 69
 70    valid->nesting_level++;
 71    func          = valid->func[valid->nesting_level];
 72    valid->extra1 = 0;
 73
 74    for ( ; GlyphCount > 0; GlyphCount-- )
 75      func( table + FT_NEXT_USHORT( p ), valid );
 76
 77    valid->nesting_level--;
 78
 79    OTV_EXIT;
 80  }
 81
 82
 83  /*************************************************************************/
 84  /*************************************************************************/
 85  /*****                                                               *****/
 86  /*****                       LIGATURE CARETS                         *****/
 87  /*****                                                               *****/
 88  /*************************************************************************/
 89  /*************************************************************************/
 90
 91#define CaretValueFunc  otv_CaretValue_validate
 92
 93  static void
 94  otv_CaretValue_validate( FT_Bytes       table,
 95                           OTV_Validator  valid )
 96  {
 97    FT_Bytes  p = table;
 98    FT_UInt   CaretValueFormat;
 99
100
101    OTV_ENTER;
102
103    OTV_LIMIT_CHECK( 4 );
104
105    CaretValueFormat = FT_NEXT_USHORT( p );
106
107    OTV_TRACE(( " (format = %d)\n", CaretValueFormat ));
108
109    switch ( CaretValueFormat )
110    {
111    case 1:     /* CaretValueFormat1 */
112      /* skip Coordinate, no test */
113      break;
114
115    case 2:     /* CaretValueFormat2 */
116      /* skip CaretValuePoint, no test */
117      break;
118
119    case 3:     /* CaretValueFormat3 */
120      p += 2;   /* skip Coordinate */
121
122      OTV_LIMIT_CHECK( 2 );
123
124      /* DeviceTable */
125      otv_Device_validate( table + FT_NEXT_USHORT( p ), valid );
126      break;
127
128    default:
129      FT_INVALID_FORMAT;
130    }
131
132    OTV_EXIT;
133  }
134
135
136  /*************************************************************************/
137  /*************************************************************************/
138  /*****                                                               *****/
139  /*****                         GDEF TABLE                            *****/
140  /*****                                                               *****/
141  /*************************************************************************/
142  /*************************************************************************/
143
144  /* sets valid->glyph_count */
145
146  FT_LOCAL_DEF( void )
147  otv_GDEF_validate( FT_Bytes      table,
148                     FT_Bytes      gsub,
149                     FT_Bytes      gpos,
150                     FT_UInt       glyph_count,
151                     FT_Validator  ftvalid )
152  {
153    OTV_ValidatorRec  validrec;
154    OTV_Validator     valid = &validrec;
155    FT_Bytes          p     = table;
156    FT_UInt           table_size;
157    FT_Bool           need_MarkAttachClassDef;
158
159    OTV_OPTIONAL_TABLE( GlyphClassDef );
160    OTV_OPTIONAL_TABLE( AttachListOffset );
161    OTV_OPTIONAL_TABLE( LigCaretListOffset );
162    OTV_OPTIONAL_TABLE( MarkAttachClassDef );
163
164
165    valid->root = ftvalid;
166
167    FT_TRACE3(( "validating GDEF table\n" ));
168    OTV_INIT;
169
170    OTV_LIMIT_CHECK( 12 );
171
172    if ( FT_NEXT_ULONG( p ) != 0x10000UL )          /* Version */
173      FT_INVALID_FORMAT;
174
175    /* MarkAttachClassDef has been added to the OpenType */
176    /* specification without increasing GDEF's version,  */
177    /* so we use this ugly hack to find out whether the  */
178    /* table is needed actually.                         */
179
180    need_MarkAttachClassDef = FT_BOOL(
181      otv_GSUBGPOS_have_MarkAttachmentType_flag( gsub ) ||
182      otv_GSUBGPOS_have_MarkAttachmentType_flag( gpos ) );
183
184    if ( need_MarkAttachClassDef )
185      table_size = 12;              /* OpenType >= 1.2 */
186    else
187      table_size = 10;              /* OpenType < 1.2  */
188
189    valid->glyph_count = glyph_count;
190
191    OTV_OPTIONAL_OFFSET( GlyphClassDef );
192    OTV_SIZE_CHECK( GlyphClassDef );
193    if ( GlyphClassDef )
194      otv_ClassDef_validate( table + GlyphClassDef, valid );
195
196    OTV_OPTIONAL_OFFSET( AttachListOffset );
197    OTV_SIZE_CHECK( AttachListOffset );
198    if ( AttachListOffset )
199    {
200      OTV_NEST2( AttachList, AttachPoint );
201      OTV_RUN( table + AttachListOffset, valid );
202    }
203
204    OTV_OPTIONAL_OFFSET( LigCaretListOffset );
205    OTV_SIZE_CHECK( LigCaretListOffset );
206    if ( LigCaretListOffset )
207    {
208      OTV_NEST3( LigCaretList, LigGlyph, CaretValue );
209      OTV_RUN( table + LigCaretListOffset, valid );
210    }
211
212    if ( need_MarkAttachClassDef )
213    {
214      OTV_OPTIONAL_OFFSET( MarkAttachClassDef );
215      OTV_SIZE_CHECK( MarkAttachClassDef );
216      if ( MarkAttachClassDef )
217        otv_ClassDef_validate( table + MarkAttachClassDef, valid );
218    }
219
220    FT_TRACE4(( "\n" ));
221  }
222
223
224/* END */