ReactOS 0.4.15-dev-8096-ga0eec98
gxvmod.c
Go to the documentation of this file.
1/***************************************************************************/
2/* */
3/* gxvmod.c */
4/* */
5/* FreeType's TrueTypeGX/AAT validation module implementation (body). */
6/* */
7/* Copyright 2004-2018 by */
8/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
9/* David Turner, Robert Wilhelm, and Werner Lemberg. */
10/* */
11/* This file is part of the FreeType project, and may only be used, */
12/* modified, and distributed under the terms of the FreeType project */
13/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
14/* this file you indicate that you have read the license and */
15/* understand and accept it fully. */
16/* */
17/***************************************************************************/
18
19/***************************************************************************/
20/* */
21/* gxvalid is derived from both gxlayout module and otvalid module. */
22/* Development of gxlayout is supported by the Information-technology */
23/* Promotion Agency(IPA), Japan. */
24/* */
25/***************************************************************************/
26
27
28#include <ft2build.h>
29#include FT_TRUETYPE_TABLES_H
30#include FT_TRUETYPE_TAGS_H
31#include FT_GX_VALIDATE_H
32#include FT_INTERNAL_OBJECTS_H
33#include FT_SERVICE_GX_VALIDATE_H
34
35#include "gxvmod.h"
36#include "gxvalid.h"
37#include "gxvcommn.h"
38
39
40 /*************************************************************************/
41 /* */
42 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
43 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
44 /* messages during execution. */
45 /* */
46#undef FT_COMPONENT
47#define FT_COMPONENT trace_gxvmodule
48
49
50 static FT_Error
52 FT_Tag tag,
53 FT_Byte* volatile* table,
54 FT_ULong* table_len )
55 {
58
59
60 error = FT_Load_Sfnt_Table( face, tag, 0, NULL, table_len );
61 if ( FT_ERR_EQ( error, Table_Missing ) )
62 return FT_Err_Ok;
63 if ( error )
64 goto Exit;
65
66 if ( FT_ALLOC( *table, *table_len ) )
67 goto Exit;
68
69 error = FT_Load_Sfnt_Table( face, tag, 0, *table, table_len );
70
71 Exit:
72 return error;
73 }
74
75
76#define GXV_TABLE_DECL( _sfnt ) \
77 FT_Byte* volatile _sfnt = NULL; \
78 FT_ULong len_ ## _sfnt = 0
79
80#define GXV_TABLE_LOAD( _sfnt ) \
81 if ( ( FT_VALIDATE_ ## _sfnt ## _INDEX < table_count ) && \
82 ( gx_flags & FT_VALIDATE_ ## _sfnt ) ) \
83 { \
84 error = gxv_load_table( face, TTAG_ ## _sfnt, \
85 &_sfnt, &len_ ## _sfnt ); \
86 if ( error ) \
87 goto Exit; \
88 }
89
90#define GXV_TABLE_VALIDATE( _sfnt ) \
91 if ( _sfnt ) \
92 { \
93 ft_validator_init( &valid, _sfnt, _sfnt + len_ ## _sfnt, \
94 FT_VALIDATE_DEFAULT ); \
95 if ( ft_setjmp( valid.jump_buffer ) == 0 ) \
96 gxv_ ## _sfnt ## _validate( _sfnt, face, &valid ); \
97 error = valid.error; \
98 if ( error ) \
99 goto Exit; \
100 }
101
102#define GXV_TABLE_SET( _sfnt ) \
103 if ( FT_VALIDATE_ ## _sfnt ## _INDEX < table_count ) \
104 tables[FT_VALIDATE_ ## _sfnt ## _INDEX] = (FT_Bytes)_sfnt
105
106
107 static FT_Error
109 FT_UInt gx_flags,
111 FT_UInt table_count )
112 {
113 FT_Memory volatile memory = FT_FACE_MEMORY( face );
114
116 FT_ValidatorRec volatile valid;
117
118 FT_UInt i;
119
120
121 GXV_TABLE_DECL( feat );
122 GXV_TABLE_DECL( bsln );
123 GXV_TABLE_DECL( trak );
124 GXV_TABLE_DECL( just );
125 GXV_TABLE_DECL( mort );
126 GXV_TABLE_DECL( morx );
127 GXV_TABLE_DECL( kern );
128 GXV_TABLE_DECL( opbd );
129 GXV_TABLE_DECL( prop );
130 GXV_TABLE_DECL( lcar );
131
132 for ( i = 0; i < table_count; i++ )
133 tables[i] = 0;
134
135 /* load tables */
136 GXV_TABLE_LOAD( feat );
137 GXV_TABLE_LOAD( bsln );
138 GXV_TABLE_LOAD( trak );
139 GXV_TABLE_LOAD( just );
140 GXV_TABLE_LOAD( mort );
141 GXV_TABLE_LOAD( morx );
142 GXV_TABLE_LOAD( kern );
143 GXV_TABLE_LOAD( opbd );
144 GXV_TABLE_LOAD( prop );
145 GXV_TABLE_LOAD( lcar );
146
147 /* validate tables */
148 GXV_TABLE_VALIDATE( feat );
149 GXV_TABLE_VALIDATE( bsln );
150 GXV_TABLE_VALIDATE( trak );
151 GXV_TABLE_VALIDATE( just );
152 GXV_TABLE_VALIDATE( mort );
153 GXV_TABLE_VALIDATE( morx );
154 GXV_TABLE_VALIDATE( kern );
155 GXV_TABLE_VALIDATE( opbd );
156 GXV_TABLE_VALIDATE( prop );
157 GXV_TABLE_VALIDATE( lcar );
158
159 /* Set results */
160 GXV_TABLE_SET( feat );
161 GXV_TABLE_SET( mort );
162 GXV_TABLE_SET( morx );
163 GXV_TABLE_SET( bsln );
164 GXV_TABLE_SET( just );
165 GXV_TABLE_SET( kern );
166 GXV_TABLE_SET( opbd );
167 GXV_TABLE_SET( trak );
168 GXV_TABLE_SET( prop );
169 GXV_TABLE_SET( lcar );
170
171 Exit:
172 if ( error )
173 {
174 FT_FREE( feat );
175 FT_FREE( bsln );
176 FT_FREE( trak );
177 FT_FREE( just );
178 FT_FREE( mort );
179 FT_FREE( morx );
180 FT_FREE( kern );
181 FT_FREE( opbd );
182 FT_FREE( prop );
183 FT_FREE( lcar );
184 }
185
186 return error;
187 }
188
189
190 static FT_Error
192 FT_UInt ckern_flags,
193 FT_Bytes* ckern_table )
194 {
195 FT_Memory volatile memory = FT_FACE_MEMORY( face );
196
197 FT_Byte* volatile ckern = NULL;
198 FT_ULong len_ckern = 0;
199
200 /* without volatile on `error' GCC 4.1.1. emits: */
201 /* warning: variable 'error' might be clobbered by 'longjmp' or 'vfork' */
202 /* this warning seems spurious but --- */
203 FT_Error volatile error;
204 FT_ValidatorRec volatile valid;
205
206
207 *ckern_table = NULL;
208
209 error = gxv_load_table( face, TTAG_kern, &ckern, &len_ckern );
210 if ( error )
211 goto Exit;
212
213 if ( ckern )
214 {
215 ft_validator_init( &valid, ckern, ckern + len_ckern,
217 if ( ft_setjmp( valid.jump_buffer ) == 0 )
219 ckern_flags & FT_VALIDATE_CKERN, &valid );
220 error = valid.error;
221 if ( error )
222 goto Exit;
223 }
224
225 *ckern_table = ckern;
226
227 Exit:
228 if ( error )
229 FT_FREE( ckern );
230
231 return error;
232 }
233
234
235 static
236 const FT_Service_GXvalidateRec gxvalid_interface =
237 {
238 gxv_validate /* validate */
239 };
240
241
242 static
243 const FT_Service_CKERNvalidateRec ckernvalid_interface =
244 {
245 classic_kern_validate /* validate */
246 };
247
248
249 static
251 {
254 { NULL, NULL }
255 };
256
257
258 static FT_Pointer
260 const char* service_id )
261 {
262 FT_UNUSED( module );
263
264 return ft_service_list_lookup( gxvalid_services, service_id );
265 }
266
267
270 {
271 0,
272 sizeof ( FT_ModuleRec ),
273 "gxvalid",
274 0x10000L,
275 0x20000L,
276
277 NULL, /* module-specific interface */
278
279 (FT_Module_Constructor)NULL, /* module_init */
280 (FT_Module_Destructor) NULL, /* module_done */
281 (FT_Module_Requester) gxvalid_get_service /* get_interface */
282 };
283
284
285/* END */
#define NULL
Definition: types.h:112
struct nls_table * tables
Definition: nls_base.c:22
return FT_Err_Ok
Definition: ftbbox.c:511
#define FT_CALLBACK_TABLE_DEF
Definition: ftconfig.h:553
#define FT_UNUSED(arg)
Definition: ftconfig.h:101
#define FT_VALIDATE_GX_LENGTH
Definition: ftgxval.h:104
#define FT_VALIDATE_CKERN
Definition: ftgxval.h:281
#define FT_ALLOC(ptr, size)
Definition: ftmemory.h:303
#define FT_FREE(ptr)
Definition: ftmemory.h:329
void(* FT_Module_Destructor)(FT_Module module)
Definition: ftmodapi.h:167
FT_Error(* FT_Module_Constructor)(FT_Module module)
Definition: ftmodapi.h:152
FT_Module_Interface(* FT_Module_Requester)(FT_Module module, const char *name)
Definition: ftmodapi.h:184
struct FT_ModuleRec_ FT_ModuleRec
#define FT_FACE_MEMORY(x)
Definition: ftobjs.h:636
ft_service_list_lookup(FT_ServiceDesc service_descriptors, const char *service_id)
Definition: ftobjs.c:98
#define ft_setjmp(b)
Definition: ftstdlib.h:163
typedefFT_BEGIN_HEADER struct FT_MemoryRec_ * FT_Memory
Definition: ftsystem.h:66
FT_UInt32 FT_Tag
Definition: fttypes.h:176
unsigned long FT_ULong
Definition: fttypes.h:253
unsigned char FT_Byte
Definition: fttypes.h:154
#define FT_ERR_EQ(x, e)
Definition: fttypes.h:591
int FT_Error
Definition: fttypes.h:300
unsigned int FT_UInt
Definition: fttypes.h:231
const FT_Byte * FT_Bytes
Definition: fttypes.h:165
@ FT_VALIDATE_DEFAULT
Definition: ftvalid.h:72
ft_validator_init(FT_Validator valid, const FT_Byte *base, const FT_Byte *limit, FT_ValidationLevel level)
Definition: ftobjs.c:122
BOOLEAN valid
GLenum GLuint GLint GLenum face
Definition: glext.h:7025
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
gxv_kern_validate_classic(FT_Bytes table, FT_Face face, FT_Int dialect_flags, FT_Validator valid)
Definition: gxvkern.c:907
static const FT_ServiceDescRec gxvalid_services[]
Definition: gxvmod.c:250
static FT_Error gxv_validate(FT_Face face, FT_UInt gx_flags, FT_Bytes tables[FT_VALIDATE_GX_LENGTH], FT_UInt table_count)
Definition: gxvmod.c:108
#define GXV_TABLE_LOAD(_sfnt)
Definition: gxvmod.c:80
#define GXV_TABLE_SET(_sfnt)
Definition: gxvmod.c:102
FT_CALLBACK_TABLE_DEF const FT_Module_Class gxv_module_class
Definition: gxvmod.c:269
#define GXV_TABLE_DECL(_sfnt)
Definition: gxvmod.c:76
#define GXV_TABLE_VALIDATE(_sfnt)
Definition: gxvmod.c:90
static FT_Pointer gxvalid_get_service(FT_Module module, const char *service_id)
Definition: gxvmod.c:259
static FT_Error gxv_load_table(FT_Face face, FT_Tag tag, FT_Byte *volatile *table, FT_ULong *table_len)
Definition: gxvmod.c:51
static const FT_Service_GXvalidateRec gxvalid_interface
Definition: gxvmod.c:236
static FT_Error classic_kern_validate(FT_Face face, FT_UInt ckern_flags, FT_Bytes *ckern_table)
Definition: gxvmod.c:191
static const FT_Service_CKERNvalidateRec ckernvalid_interface
Definition: gxvmod.c:243
#define error(str)
Definition: mkdosfs.c:1605
static char memory[1024 *256]
Definition: process.c:116
static void Exit(void)
Definition: sock.c:1330
Definition: ecma_167.h:138
#define FT_SERVICE_ID_CLASSICKERN_VALIDATE
Definition: svgxval.h:38
#define FT_SERVICE_ID_GX_VALIDATE
Definition: svgxval.h:37
FT_Load_Sfnt_Table(FT_Face face, FT_ULong tag, FT_Long offset, FT_Byte *buffer, FT_ULong *length)
Definition: ftobjs.c:4134
#define TTAG_kern
Definition: tttags.h:72