1 /***************************************************************************/
5 /* FreeType's OpenType validation module implementation (body). */
7 /* Copyright 2004, 2005, 2006, 2007, 2008 by */
8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
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. */
16 /***************************************************************************/
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
31 /*************************************************************************/
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. */
38 #define FT_COMPONENT trace_otvmodule
42 otv_load_table( FT_Face face
,
44 FT_Byte
* volatile* table
,
48 FT_Memory memory
= FT_FACE_MEMORY( face
);
51 error
= FT_Load_Sfnt_Table( face
, tag
, 0, NULL
, table_len
);
52 if ( error
== OTV_Err_Table_Missing
)
57 if ( FT_ALLOC( *table
, *table_len
) )
60 error
= FT_Load_Sfnt_Table( face
, tag
, 0, *table
, table_len
);
68 otv_validate( FT_Face
volatile face
,
76 FT_Error error
= OTV_Err_Ok
;
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
;
85 FT_UInt num_glyphs
= (FT_UInt
)face
->num_glyphs
;
86 FT_ValidatorRec
volatile valid
;
89 base
= gdef
= gpos
= gsub
= jstf
= math
= NULL
;
90 len_base
= len_gdef
= len_gpos
= len_gsub
= len_jstf
= len_math
= 0;
93 * XXX: OpenType tables cannot handle 32-bit glyph index,
94 * although broken TrueType can have 32-bit glyph index.
96 if ( face
->num_glyphs
> 0xFFFFL
)
98 FT_TRACE1(( "otv_validate: Invalid glyphs index (0x0000FFFF - 0x%08x) ",
100 FT_TRACE1(( "are not handled by OpenType tables\n" ));
106 if ( ot_flags
& FT_VALIDATE_BASE
)
108 error
= otv_load_table( face
, TTAG_BASE
, &base
, &len_base
);
113 if ( ot_flags
& FT_VALIDATE_GDEF
)
115 error
= otv_load_table( face
, TTAG_GDEF
, &gdef
, &len_gdef
);
120 if ( ot_flags
& FT_VALIDATE_GPOS
)
122 error
= otv_load_table( face
, TTAG_GPOS
, &gpos
, &len_gpos
);
127 if ( ot_flags
& FT_VALIDATE_GSUB
)
129 error
= otv_load_table( face
, TTAG_GSUB
, &gsub
, &len_gsub
);
134 if ( ot_flags
& FT_VALIDATE_JSTF
)
136 error
= otv_load_table( face
, TTAG_JSTF
, &jstf
, &len_jstf
);
141 if ( ot_flags
& FT_VALIDATE_MATH
)
143 error
= otv_load_table( face
, TTAG_MATH
, &math
, &len_math
);
148 /* validate tables */
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
);
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
);
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
);
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
);
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
);
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
);
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
;
218 FT_Memory memory
= FT_FACE_MEMORY( face
);
228 FT_Memory memory
= FT_FACE_MEMORY( face
);
231 FT_FREE( math
); /* Can't return this as API is frozen */
239 const FT_Service_OTvalidateRec otvalid_interface
=
246 const FT_ServiceDescRec otvalid_services
[] =
248 { FT_SERVICE_ID_OPENTYPE_VALIDATE
, &otvalid_interface
},
254 otvalid_get_service( FT_Module module
,
255 const char* service_id
)
259 return ft_service_list_lookup( otvalid_services
, service_id
);
263 FT_CALLBACK_TABLE_DEF
264 const FT_Module_Class otv_module_class
=
267 sizeof( FT_ModuleRec
),
272 0, /* module-specific interface */
274 (FT_Module_Constructor
)0,
275 (FT_Module_Destructor
) 0,
276 (FT_Module_Requester
) otvalid_get_service