00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <ft2build.h>
00029 #include FT_TRUETYPE_TABLES_H
00030 #include FT_TRUETYPE_TAGS_H
00031 #include FT_GX_VALIDATE_H
00032 #include FT_INTERNAL_OBJECTS_H
00033 #include FT_SERVICE_GX_VALIDATE_H
00034
00035 #include "gxvmod.h"
00036 #include "gxvalid.h"
00037 #include "gxvcommn.h"
00038
00039
00040
00041
00042
00043
00044
00045
00046 #undef FT_COMPONENT
00047 #define FT_COMPONENT trace_gxvmodule
00048
00049
00050 static FT_Error
00051 gxv_load_table( FT_Face face,
00052 FT_Tag tag,
00053 FT_Byte* volatile* table,
00054 FT_ULong* table_len )
00055 {
00056 FT_Error error;
00057 FT_Memory memory = FT_FACE_MEMORY( face );
00058
00059
00060 error = FT_Load_Sfnt_Table( face, tag, 0, NULL, table_len );
00061 if ( error == GXV_Err_Table_Missing )
00062 return GXV_Err_Ok;
00063 if ( error )
00064 goto Exit;
00065
00066 if ( FT_ALLOC( *table, *table_len ) )
00067 goto Exit;
00068
00069 error = FT_Load_Sfnt_Table( face, tag, 0, *table, table_len );
00070
00071 Exit:
00072 return error;
00073 }
00074
00075
00076 #define GXV_TABLE_DECL( _sfnt ) \
00077 FT_Byte* volatile _sfnt = NULL; \
00078 FT_ULong len_ ## _sfnt = 0
00079
00080 #define GXV_TABLE_LOAD( _sfnt ) \
00081 if ( ( FT_VALIDATE_ ## _sfnt ## _INDEX < table_count ) && \
00082 ( gx_flags & FT_VALIDATE_ ## _sfnt ) ) \
00083 { \
00084 error = gxv_load_table( face, TTAG_ ## _sfnt, \
00085 &_sfnt, &len_ ## _sfnt ); \
00086 if ( error ) \
00087 goto Exit; \
00088 }
00089
00090 #define GXV_TABLE_VALIDATE( _sfnt ) \
00091 if ( _sfnt ) \
00092 { \
00093 ft_validator_init( &valid, _sfnt, _sfnt + len_ ## _sfnt, \
00094 FT_VALIDATE_DEFAULT ); \
00095 if ( ft_setjmp( valid.jump_buffer ) == 0 ) \
00096 gxv_ ## _sfnt ## _validate( _sfnt, face, &valid ); \
00097 error = valid.error; \
00098 if ( error ) \
00099 goto Exit; \
00100 }
00101
00102 #define GXV_TABLE_SET( _sfnt ) \
00103 if ( FT_VALIDATE_ ## _sfnt ## _INDEX < table_count ) \
00104 tables[FT_VALIDATE_ ## _sfnt ## _INDEX] = (FT_Bytes)_sfnt
00105
00106
00107 static FT_Error
00108 gxv_validate( FT_Face face,
00109 FT_UInt gx_flags,
00110 FT_Bytes tables[FT_VALIDATE_GX_LENGTH],
00111 FT_UInt table_count )
00112 {
00113 FT_Memory volatile memory = FT_FACE_MEMORY( face );
00114
00115 FT_Error error = GXV_Err_Ok;
00116 FT_ValidatorRec volatile valid;
00117
00118 FT_UInt i;
00119
00120
00121 GXV_TABLE_DECL( feat );
00122 GXV_TABLE_DECL( bsln );
00123 GXV_TABLE_DECL( trak );
00124 GXV_TABLE_DECL( just );
00125 GXV_TABLE_DECL( mort );
00126 GXV_TABLE_DECL( morx );
00127 GXV_TABLE_DECL( kern );
00128 GXV_TABLE_DECL( opbd );
00129 GXV_TABLE_DECL( prop );
00130 GXV_TABLE_DECL( lcar );
00131
00132 for ( i = 0; i < table_count; i++ )
00133 tables[i] = 0;
00134
00135
00136 GXV_TABLE_LOAD( feat );
00137 GXV_TABLE_LOAD( bsln );
00138 GXV_TABLE_LOAD( trak );
00139 GXV_TABLE_LOAD( just );
00140 GXV_TABLE_LOAD( mort );
00141 GXV_TABLE_LOAD( morx );
00142 GXV_TABLE_LOAD( kern );
00143 GXV_TABLE_LOAD( opbd );
00144 GXV_TABLE_LOAD( prop );
00145 GXV_TABLE_LOAD( lcar );
00146
00147
00148 GXV_TABLE_VALIDATE( feat );
00149 GXV_TABLE_VALIDATE( bsln );
00150 GXV_TABLE_VALIDATE( trak );
00151 GXV_TABLE_VALIDATE( just );
00152 GXV_TABLE_VALIDATE( mort );
00153 GXV_TABLE_VALIDATE( morx );
00154 GXV_TABLE_VALIDATE( kern );
00155 GXV_TABLE_VALIDATE( opbd );
00156 GXV_TABLE_VALIDATE( prop );
00157 GXV_TABLE_VALIDATE( lcar );
00158
00159
00160 GXV_TABLE_SET( feat );
00161 GXV_TABLE_SET( mort );
00162 GXV_TABLE_SET( morx );
00163 GXV_TABLE_SET( bsln );
00164 GXV_TABLE_SET( just );
00165 GXV_TABLE_SET( kern );
00166 GXV_TABLE_SET( opbd );
00167 GXV_TABLE_SET( trak );
00168 GXV_TABLE_SET( prop );
00169 GXV_TABLE_SET( lcar );
00170
00171 Exit:
00172 if ( error )
00173 {
00174 FT_FREE( feat );
00175 FT_FREE( bsln );
00176 FT_FREE( trak );
00177 FT_FREE( just );
00178 FT_FREE( mort );
00179 FT_FREE( morx );
00180 FT_FREE( kern );
00181 FT_FREE( opbd );
00182 FT_FREE( prop );
00183 FT_FREE( lcar );
00184 }
00185
00186 return error;
00187 }
00188
00189
00190 static FT_Error
00191 classic_kern_validate( FT_Face face,
00192 FT_UInt ckern_flags,
00193 FT_Bytes* ckern_table )
00194 {
00195 FT_Memory volatile memory = FT_FACE_MEMORY( face );
00196
00197 FT_Byte* volatile ckern = NULL;
00198 FT_ULong len_ckern = 0;
00199
00200
00201
00202
00203 FT_Error volatile error = GXV_Err_Ok;
00204 FT_ValidatorRec volatile valid;
00205
00206
00207 *ckern_table = NULL;
00208
00209 error = gxv_load_table( face, TTAG_kern, &ckern, &len_ckern );
00210 if ( error )
00211 goto Exit;
00212
00213 if ( ckern )
00214 {
00215 ft_validator_init( &valid, ckern, ckern + len_ckern,
00216 FT_VALIDATE_DEFAULT );
00217 if ( ft_setjmp( valid.jump_buffer ) == 0 )
00218 gxv_kern_validate_classic( ckern, face,
00219 ckern_flags & FT_VALIDATE_CKERN, &valid );
00220 error = valid.error;
00221 if ( error )
00222 goto Exit;
00223 }
00224
00225 *ckern_table = ckern;
00226
00227 Exit:
00228 if ( error )
00229 FT_FREE( ckern );
00230
00231 return error;
00232 }
00233
00234
00235 static
00236 const FT_Service_GXvalidateRec gxvalid_interface =
00237 {
00238 gxv_validate
00239 };
00240
00241
00242 static
00243 const FT_Service_CKERNvalidateRec ckernvalid_interface =
00244 {
00245 classic_kern_validate
00246 };
00247
00248
00249 static
00250 const FT_ServiceDescRec gxvalid_services[] =
00251 {
00252 { FT_SERVICE_ID_GX_VALIDATE, &gxvalid_interface },
00253 { FT_SERVICE_ID_CLASSICKERN_VALIDATE, &ckernvalid_interface },
00254 { NULL, NULL }
00255 };
00256
00257
00258 static FT_Pointer
00259 gxvalid_get_service( FT_Module module,
00260 const char* service_id )
00261 {
00262 FT_UNUSED( module );
00263
00264 return ft_service_list_lookup( gxvalid_services, service_id );
00265 }
00266
00267
00268 FT_CALLBACK_TABLE_DEF
00269 const FT_Module_Class gxv_module_class =
00270 {
00271 0,
00272 sizeof( FT_ModuleRec ),
00273 "gxvalid",
00274 0x10000L,
00275 0x20000L,
00276
00277 0,
00278
00279 (FT_Module_Constructor)0,
00280 (FT_Module_Destructor) 0,
00281 (FT_Module_Requester) gxvalid_get_service
00282 };
00283
00284
00285