Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 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 */