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

Last change on this file since 182 was 150, checked in by Eugene Romanenko, 15 years ago

update freetype to 2.2.1

File size: 7.6 KB
Line 
1/***************************************************************************/
2/*                                                                         */
3/*  otvgdef.c                                                              */
4/*                                                                         */
5/*    OpenType GDEF table validation (body).                               */
6/*                                                                         */
7/*  Copyright 2004, 2005 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 );
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_DATA;
130    }
131
132    OTV_EXIT;
133  }
134
135
136  /*************************************************************************/
137  /*************************************************************************/
138  /*****                                                               *****/
139  /*****                         GDEF TABLE                            *****/
140  /*****                                                               *****/
141  /*************************************************************************/
142  /*************************************************************************/
143
144  FT_LOCAL_DEF( void )
145  otv_GDEF_validate( FT_Bytes      table,
146                     FT_Bytes      gsub,
147                     FT_Bytes      gpos,
148                     FT_Validator  ftvalid )
149  {
150    OTV_ValidatorRec  validrec;
151    OTV_Validator     valid = &validrec;
152    FT_Bytes          p     = table;
153    FT_UInt           table_size;
154    FT_Bool           need_MarkAttachClassDef;
155
156    OTV_OPTIONAL_TABLE( GlyphClassDef );
157    OTV_OPTIONAL_TABLE( AttachListOffset );
158    OTV_OPTIONAL_TABLE( LigCaretListOffset );
159    OTV_OPTIONAL_TABLE( MarkAttachClassDef );
160
161
162    valid->root = ftvalid;
163
164    FT_TRACE3(( "validating GDEF table\n" ));
165    OTV_INIT;
166
167    OTV_LIMIT_CHECK( 12 );
168
169    if ( FT_NEXT_ULONG( p ) != 0x10000UL )          /* Version */
170      FT_INVALID_FORMAT;
171
172    /* MarkAttachClassDef has been added to the OpenType */
173    /* specification without increasing GDEF's version,  */
174    /* so we use this ugly hack to find out whether the  */
175    /* table is needed actually.                         */
176
177    need_MarkAttachClassDef = FT_BOOL(
178      otv_GSUBGPOS_have_MarkAttachmentType_flag( gsub ) ||
179      otv_GSUBGPOS_have_MarkAttachmentType_flag( gpos ) );
180
181    if ( need_MarkAttachClassDef )
182      table_size = 12;              /* OpenType >= 1.2 */
183    else
184      table_size = 10;              /* OpenType < 1.2  */
185
186    OTV_OPTIONAL_OFFSET( GlyphClassDef );
187    OTV_SIZE_CHECK( GlyphClassDef );
188    if ( GlyphClassDef )
189      otv_ClassDef_validate( table + GlyphClassDef, valid );
190
191    OTV_OPTIONAL_OFFSET( AttachListOffset );
192    OTV_SIZE_CHECK( AttachListOffset );
193    if ( AttachListOffset )
194    {
195      OTV_NEST2( AttachList, AttachPoint );
196      OTV_RUN( table + AttachListOffset, valid );
197    }
198
199    OTV_OPTIONAL_OFFSET( LigCaretListOffset );
200    OTV_SIZE_CHECK( LigCaretListOffset );
201    if ( LigCaretListOffset )
202    {
203      OTV_NEST3( LigCaretList, LigGlyph, CaretValue );
204      OTV_RUN( table + LigCaretListOffset, valid );
205    }
206
207    if ( need_MarkAttachClassDef )
208    {
209      OTV_OPTIONAL_OFFSET( MarkAttachClassDef );
210      OTV_SIZE_CHECK( MarkAttachClassDef );
211      if ( MarkAttachClassDef )
212        otv_ClassDef_validate( table + MarkAttachClassDef, valid );
213    }
214
215    FT_TRACE4(( "\n" ));
216  }
217
218
219/* END */
Note: See TracBrowser for help on using the repository browser.