ReactOS  0.4.15-dev-1171-gab82533
otvmod.c
Go to the documentation of this file.
1 /***************************************************************************/
2 /* */
3 /* otvmod.c */
4 /* */
5 /* FreeType's OpenType validation module implementation (body). */
6 /* */
7 /* Copyright 2004-2018 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 <ft2build.h>
20 #include FT_TRUETYPE_TABLES_H
21 #include FT_TRUETYPE_TAGS_H
22 #include FT_OPENTYPE_VALIDATE_H
23 #include FT_INTERNAL_OBJECTS_H
24 #include FT_SERVICE_OPENTYPE_VALIDATE_H
25 
26 #include "otvmod.h"
27 #include "otvalid.h"
28 #include "otvcommn.h"
29 
30 
31  /*************************************************************************/
32  /* */
33  /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
34  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
35  /* messages during execution. */
36  /* */
37 #undef FT_COMPONENT
38 #define FT_COMPONENT trace_otvmodule
39 
40 
41  static FT_Error
43  FT_Tag tag,
44  FT_Byte* volatile* table,
45  FT_ULong* table_len )
46  {
49 
50 
51  error = FT_Load_Sfnt_Table( face, tag, 0, NULL, table_len );
52  if ( FT_ERR_EQ( error, Table_Missing ) )
53  return FT_Err_Ok;
54  if ( error )
55  goto Exit;
56 
57  if ( FT_ALLOC( *table, *table_len ) )
58  goto Exit;
59 
60  error = FT_Load_Sfnt_Table( face, tag, 0, *table, table_len );
61 
62  Exit:
63  return error;
64  }
65 
66 
67  static FT_Error
69  FT_UInt ot_flags,
70  FT_Bytes *ot_base,
71  FT_Bytes *ot_gdef,
72  FT_Bytes *ot_gpos,
73  FT_Bytes *ot_gsub,
74  FT_Bytes *ot_jstf )
75  {
77  FT_Byte* volatile base;
78  FT_Byte* volatile gdef;
79  FT_Byte* volatile gpos;
80  FT_Byte* volatile gsub;
81  FT_Byte* volatile jstf;
82  FT_Byte* volatile math;
83  FT_ULong len_base, len_gdef, len_gpos, len_gsub, len_jstf;
84  FT_ULong len_math;
85  FT_UInt num_glyphs = (FT_UInt)face->num_glyphs;
86  FT_ValidatorRec volatile valid;
87 
88 
89  base = gdef = gpos = gsub = jstf = math = NULL;
90  len_base = len_gdef = len_gpos = len_gsub = len_jstf = len_math = 0;
91 
92  /*
93  * XXX: OpenType tables cannot handle 32-bit glyph index,
94  * although broken TrueType can have 32-bit glyph index.
95  */
96  if ( face->num_glyphs > 0xFFFFL )
97  {
98  FT_TRACE1(( "otv_validate: Invalid glyphs index (0x0000FFFF - 0x%08x) ",
99  face->num_glyphs ));
100  FT_TRACE1(( "are not handled by OpenType tables\n" ));
101  num_glyphs = 0xFFFF;
102  }
103 
104  /* load tables */
105 
106  if ( ot_flags & FT_VALIDATE_BASE )
107  {
108  error = otv_load_table( face, TTAG_BASE, &base, &len_base );
109  if ( error )
110  goto Exit;
111  }
112 
113  if ( ot_flags & FT_VALIDATE_GDEF )
114  {
115  error = otv_load_table( face, TTAG_GDEF, &gdef, &len_gdef );
116  if ( error )
117  goto Exit;
118  }
119 
120  if ( ot_flags & FT_VALIDATE_GPOS )
121  {
122  error = otv_load_table( face, TTAG_GPOS, &gpos, &len_gpos );
123  if ( error )
124  goto Exit;
125  }
126 
127  if ( ot_flags & FT_VALIDATE_GSUB )
128  {
129  error = otv_load_table( face, TTAG_GSUB, &gsub, &len_gsub );
130  if ( error )
131  goto Exit;
132  }
133 
134  if ( ot_flags & FT_VALIDATE_JSTF )
135  {
136  error = otv_load_table( face, TTAG_JSTF, &jstf, &len_jstf );
137  if ( error )
138  goto Exit;
139  }
140 
141  if ( ot_flags & FT_VALIDATE_MATH )
142  {
143  error = otv_load_table( face, TTAG_MATH, &math, &len_math );
144  if ( error )
145  goto Exit;
146  }
147 
148  /* validate tables */
149 
150  if ( base )
151  {
152  ft_validator_init( &valid, base, base + len_base, FT_VALIDATE_DEFAULT );
153  if ( ft_setjmp( valid.jump_buffer ) == 0 )
154  otv_BASE_validate( base, &valid );
155  error = valid.error;
156  if ( error )
157  goto Exit;
158  }
159 
160  if ( gpos )
161  {
162  ft_validator_init( &valid, gpos, gpos + len_gpos, FT_VALIDATE_DEFAULT );
163  if ( ft_setjmp( valid.jump_buffer ) == 0 )
164  otv_GPOS_validate( gpos, num_glyphs, &valid );
165  error = valid.error;
166  if ( error )
167  goto Exit;
168  }
169 
170  if ( gsub )
171  {
172  ft_validator_init( &valid, gsub, gsub + len_gsub, FT_VALIDATE_DEFAULT );
173  if ( ft_setjmp( valid.jump_buffer ) == 0 )
174  otv_GSUB_validate( gsub, num_glyphs, &valid );
175  error = valid.error;
176  if ( error )
177  goto Exit;
178  }
179 
180  if ( gdef )
181  {
182  ft_validator_init( &valid, gdef, gdef + len_gdef, FT_VALIDATE_DEFAULT );
183  if ( ft_setjmp( valid.jump_buffer ) == 0 )
184  otv_GDEF_validate( gdef, gsub, gpos, num_glyphs, &valid );
185  error = valid.error;
186  if ( error )
187  goto Exit;
188  }
189 
190  if ( jstf )
191  {
192  ft_validator_init( &valid, jstf, jstf + len_jstf, FT_VALIDATE_DEFAULT );
193  if ( ft_setjmp( valid.jump_buffer ) == 0 )
194  otv_JSTF_validate( jstf, gsub, gpos, num_glyphs, &valid );
195  error = valid.error;
196  if ( error )
197  goto Exit;
198  }
199 
200  if ( math )
201  {
202  ft_validator_init( &valid, math, math + len_math, FT_VALIDATE_DEFAULT );
203  if ( ft_setjmp( valid.jump_buffer ) == 0 )
204  otv_MATH_validate( math, num_glyphs, &valid );
205  error = valid.error;
206  if ( error )
207  goto Exit;
208  }
209 
210  *ot_base = (FT_Bytes)base;
211  *ot_gdef = (FT_Bytes)gdef;
212  *ot_gpos = (FT_Bytes)gpos;
213  *ot_gsub = (FT_Bytes)gsub;
214  *ot_jstf = (FT_Bytes)jstf;
215 
216  Exit:
217  if ( error )
218  {
220 
221 
222  FT_FREE( base );
223  FT_FREE( gdef );
224  FT_FREE( gpos );
225  FT_FREE( gsub );
226  FT_FREE( jstf );
227  }
228 
229  {
231 
232 
233  FT_FREE( math ); /* Can't return this as API is frozen */
234  }
235 
236  return error;
237  }
238 
239 
240  static
241  const FT_Service_OTvalidateRec otvalid_interface =
242  {
243  otv_validate /* validate */
244  };
245 
246 
247  static
249  {
251  { NULL, NULL }
252  };
253 
254 
255  static FT_Pointer
257  const char* service_id )
258  {
259  FT_UNUSED( module );
260 
261  return ft_service_list_lookup( otvalid_services, service_id );
262  }
263 
264 
267  {
268  0,
269  sizeof ( FT_ModuleRec ),
270  "otvalid",
271  0x10000L,
272  0x20000L,
273 
274  NULL, /* module-specific interface */
275 
276  (FT_Module_Constructor)NULL, /* module_init */
277  (FT_Module_Destructor) NULL, /* module_done */
278  (FT_Module_Requester) otvalid_get_service /* get_interface */
279  };
280 
281 
282 /* END */
#define FT_ALLOC(ptr, size)
Definition: ftmemory.h:303
ft_service_list_lookup(FT_ServiceDesc service_descriptors, const char *service_id)
Definition: ftobjs.c:98
int FT_Error
Definition: fttypes.h:300
static const FT_ServiceDescRec otvalid_services[]
Definition: otvmod.c:248
FT_CALLBACK_TABLE_DEF const FT_Module_Class otv_module_class
Definition: otvmod.c:266
FT_BEGIN_HEADER otv_BASE_validate(FT_Bytes table, FT_Validator valid)
Definition: otvbase.c:280
FT_Error(* FT_Module_Constructor)(FT_Module module)
Definition: ftmodapi.h:152
unsigned long FT_ULong
Definition: fttypes.h:253
#define error(str)
Definition: mkdosfs.c:1605
#define FT_VALIDATE_MATH
Definition: ftotval.h:107
static FT_Pointer otvalid_get_service(FT_Module module, const char *service_id)
Definition: otvmod.c:256
otv_JSTF_validate(FT_Bytes table, FT_Bytes gsub, FT_Bytes gpos, FT_UInt glyph_count, FT_Validator valid)
Definition: otvjstf.c:205
#define TTAG_GPOS
Definition: tttags.h:62
static FT_Error otv_validate(FT_Face volatile face, FT_UInt ot_flags, FT_Bytes *ot_base, FT_Bytes *ot_gdef, FT_Bytes *ot_gpos, FT_Bytes *ot_gsub, FT_Bytes *ot_jstf)
Definition: otvmod.c:68
struct FT_ModuleRec_ FT_ModuleRec
otv_GPOS_validate(FT_Bytes table, FT_UInt glyph_count, FT_Validator valid)
Definition: otvgpos.c:982
Definition: ecma_167.h:138
return FT_Err_Ok
Definition: ftbbox.c:511
static char memory[1024 *256]
Definition: process.c:116
#define TTAG_GDEF
Definition: tttags.h:60
static FT_Error otv_load_table(FT_Face face, FT_Tag tag, FT_Byte *volatile *table, FT_ULong *table_len)
Definition: otvmod.c:42
#define FT_TRACE1(varformat)
Definition: ftdebug.h:158
static const FT_Service_OTvalidateRec otvalid_interface
Definition: otvmod.c:241
unsigned char FT_Byte
Definition: fttypes.h:154
GLuint base
Definition: 3dtext.c:35
FT_Module_Interface(* FT_Module_Requester)(FT_Module module, const char *name)
Definition: ftmodapi.h:184
smooth NULL
Definition: ftsmooth.c:416
otv_GSUB_validate(FT_Bytes table, FT_UInt glyph_count, FT_Validator valid)
Definition: otvgsub.c:548
#define FT_FREE(ptr)
Definition: ftmemory.h:329
#define FT_VALIDATE_GDEF
Definition: ftotval.h:103
FT_Load_Sfnt_Table(FT_Face face, FT_ULong tag, FT_Long offset, FT_Byte *buffer, FT_ULong *length)
Definition: ftobjs.c:4134
if(!(yy_init))
Definition: macro.lex.yy.c:714
static void Exit(void)
Definition: sock.c:1331
#define FT_ERR_EQ(x, e)
Definition: fttypes.h:591
otv_GDEF_validate(FT_Bytes table, FT_Bytes gsub, FT_Bytes gpos, FT_UInt glyph_count, FT_Validator valid)
Definition: otvgdef.c:181
#define TTAG_BASE
Definition: tttags.h:37
#define ft_setjmp(b)
Definition: ftstdlib.h:163
#define FT_VALIDATE_JSTF
Definition: ftotval.h:106
const FT_Byte * FT_Bytes
Definition: fttypes.h:165
typedefFT_BEGIN_HEADER struct FT_MemoryRec_ * FT_Memory
Definition: ftsystem.h:66
#define FT_FACE_MEMORY(x)
Definition: ftobjs.h:636
otv_MATH_validate(FT_Bytes table, FT_UInt glyph_count, FT_Validator ftvalid)
Definition: otvmath.c:416
unsigned int FT_UInt
Definition: fttypes.h:231
FT_UInt32 FT_Tag
Definition: fttypes.h:176
void(* FT_Module_Destructor)(FT_Module module)
Definition: ftmodapi.h:167
ft_validator_init(FT_Validator valid, const FT_Byte *base, const FT_Byte *limit, FT_ValidationLevel level)
Definition: ftobjs.c:122
#define FT_VALIDATE_GPOS
Definition: ftotval.h:104
#define FT_VALIDATE_BASE
Definition: ftotval.h:102
#define FT_SERVICE_ID_OPENTYPE_VALIDATE
Definition: svotval.h:28
#define TTAG_GSUB
Definition: tttags.h:63
#define FT_UNUSED(arg)
Definition: ftconfig.h:101
#define TTAG_MATH
Definition: tttags.h:77
GLenum GLuint GLint GLenum face
Definition: glext.h:7025
#define FT_VALIDATE_GSUB
Definition: ftotval.h:105
#define FT_CALLBACK_TABLE_DEF
Definition: ftconfig.h:553
#define TTAG_JSTF
Definition: tttags.h:70