source: trunk/poppler/freetype2/src/otvalid/otvgdef.c @ 262

Last change on this file since 262 was 262, checked in by Eugene Romanenko, 12 years ago

PDF plugin: freetype library updated to version 2.3.8

File size: 7.7 KB
Line 
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 */
Note: See TracBrowser for help on using the repository browser.