~ubuntu-branches/ubuntu/vivid/emscripten/vivid

« back to all changes in this revision

Viewing changes to tests/freetype/src/otvalid/otvgdef.c

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2013-05-02 13:11:51 UTC
  • Revision ID: package-import@ubuntu.com-20130502131151-q8dvteqr1ef2x7xz
Tags: upstream-1.4.1~20130504~adb56cb
ImportĀ upstreamĀ versionĀ 1.4.1~20130504~adb56cb

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 */