16 |
/***************************************************************************/ |
/***************************************************************************/ |
17 |
|
|
18 |
/***************************************************************************/ |
/***************************************************************************/ |
19 |
|
/* */ |
20 |
/* gxvalid is derived from both gxlayout module and otvalid module. */ |
/* gxvalid is derived from both gxlayout module and otvalid module. */ |
21 |
/* Development of gxlayout was support of Information-technology Promotion */ |
/* Development of gxlayout is supported by the Information-technology */ |
22 |
/* Agency(IPA), Japan. */ |
/* Promotion Agency(IPA), Japan. */ |
23 |
|
/* */ |
24 |
/***************************************************************************/ |
/***************************************************************************/ |
25 |
|
|
26 |
|
|
47 |
/*************************************************************************/ |
/*************************************************************************/ |
48 |
|
|
49 |
/* |
/* |
50 |
* refered track table format specification: |
* referred track table format specification: |
51 |
* http://developer.apple.com/fonts/TTRefMan/RM06/Chap6trak.html |
* http://developer.apple.com/fonts/TTRefMan/RM06/Chap6trak.html |
52 |
* last update is 1996. |
* last update was 1996. |
53 |
* ---------------------------------------------- |
* ---------------------------------------------- |
54 |
* [MINIMUM HEADER]: GXV_TRAK_SIZE_MIN |
* [MINIMUM HEADER]: GXV_TRAK_SIZE_MIN |
55 |
* version (fixed: 32bit) = 0x00010000 |
* version (fixed: 32bit) = 0x00010000 |
77 |
|
|
78 |
} GXV_trak_DataRec, *GXV_trak_Data; |
} GXV_trak_DataRec, *GXV_trak_Data; |
79 |
|
|
80 |
#define GXV_TRAK_DATA(FIELD) GXV_TABLE_DATA( trak, FIELD ) |
|
81 |
|
#define GXV_TRAK_DATA( FIELD ) GXV_TABLE_DATA( trak, FIELD ) |
82 |
|
|
83 |
|
|
84 |
/*************************************************************************/ |
/*************************************************************************/ |
85 |
/*************************************************************************/ |
/*************************************************************************/ |
93 |
gxv_trak_trackTable_validate( FT_Bytes table, |
gxv_trak_trackTable_validate( FT_Bytes table, |
94 |
FT_Bytes limit, |
FT_Bytes limit, |
95 |
FT_UShort nTracks, |
FT_UShort nTracks, |
|
FT_UShort nSizes, |
|
96 |
GXV_Validator valid ) |
GXV_Validator valid ) |
97 |
{ |
{ |
98 |
FT_Bytes p = table; |
FT_Bytes p = table; |
105 |
|
|
106 |
GXV_NAME_ENTER( "trackTable" ); |
GXV_NAME_ENTER( "trackTable" ); |
107 |
|
|
108 |
GXV_TRAK_DATA( trackValueOffset_min ) = 0xFFFF; |
GXV_TRAK_DATA( trackValueOffset_min ) = 0xFFFFU; |
109 |
GXV_TRAK_DATA( trackValueOffset_max ) = 0x0000; |
GXV_TRAK_DATA( trackValueOffset_max ) = 0x0000; |
110 |
|
|
111 |
for ( i = 0; i < nTracks; i ++ ) |
for ( i = 0; i < nTracks; i ++ ) |
123 |
gxv_sfntName_validate( nameIndex, 256, 32767, valid ); |
gxv_sfntName_validate( nameIndex, 256, 32767, valid ); |
124 |
} |
} |
125 |
|
|
126 |
valid->subtable_length = ( p - table ); |
valid->subtable_length = p - table; |
127 |
GXV_EXIT; |
GXV_EXIT; |
128 |
} |
} |
129 |
|
|
152 |
|
|
153 |
gxv_odtect_add_range( table, p - table, "trackData header", odtect ); |
gxv_odtect_add_range( table, p - table, "trackData header", odtect ); |
154 |
|
|
|
|
|
155 |
/* validate trackTable */ |
/* validate trackTable */ |
156 |
gxv_trak_trackTable_validate( p, limit, nTracks, nSizes, valid ); |
gxv_trak_trackTable_validate( p, limit, nTracks, valid ); |
157 |
gxv_odtect_add_range( p, valid->subtable_length, |
gxv_odtect_add_range( p, valid->subtable_length, |
158 |
"trackTable", odtect ); |
"trackTable", odtect ); |
159 |
|
|
|
|
|
160 |
/* sizeTable is array of FT_Fixed, don't check contents */ |
/* sizeTable is array of FT_Fixed, don't check contents */ |
161 |
p = valid->root->base + sizeTableOffset; |
p = valid->root->base + sizeTableOffset; |
162 |
GXV_LIMIT_CHECK( nSizes * 4 ); |
GXV_LIMIT_CHECK( nSizes * 4 ); |
163 |
gxv_odtect_add_range( p, ( nSizes * 4 ), "sizeTable", odtect ); |
gxv_odtect_add_range( p, nSizes * 4, "sizeTable", odtect ); |
|
|
|
164 |
|
|
165 |
/* validate trackValueOffet */ |
/* validate trackValueOffet */ |
166 |
p = valid->root->base + GXV_TRAK_DATA( trackValueOffset_min ); |
p = valid->root->base + GXV_TRAK_DATA( trackValueOffset_min ); |
167 |
if ( ( limit - p ) < ( nTracks * nSizes * 2 ) ) |
if ( limit - p < nTracks * nSizes * 2 ) |
168 |
GXV_TRACE(( "too short trackValue array\n" )); |
GXV_TRACE(( "too short trackValue array\n" )); |
169 |
|
|
170 |
p = valid->root->base + GXV_TRAK_DATA( trackValueOffset_max ); |
p = valid->root->base + GXV_TRAK_DATA( trackValueOffset_max ); |
174 |
+ GXV_TRAK_DATA( trackValueOffset_min ), |
+ GXV_TRAK_DATA( trackValueOffset_min ), |
175 |
GXV_TRAK_DATA( trackValueOffset_max ) |
GXV_TRAK_DATA( trackValueOffset_max ) |
176 |
- GXV_TRAK_DATA( trackValueOffset_min ) |
- GXV_TRAK_DATA( trackValueOffset_min ) |
177 |
+ ( nSizes * 2 ), |
+ nSizes * 2, |
178 |
"trackValue array", odtect ); |
"trackValue array", odtect ); |
179 |
|
|
|
|
|
180 |
gxv_odtect_validate( odtect, valid ); |
gxv_odtect_validate( odtect, valid ); |
181 |
|
|
182 |
GXV_EXIT; |
GXV_EXIT; |
214 |
|
|
215 |
GXV_ODTECT( 3, odtect ); |
GXV_ODTECT( 3, odtect ); |
216 |
|
|
|
|
|
217 |
GXV_ODTECT_INIT( odtect ); |
GXV_ODTECT_INIT( odtect ); |
218 |
valid->root = ftvalid; |
valid->root = ftvalid; |
219 |
valid->table_data = trak; |
valid->table_data = trak; |
220 |
valid->face = face; |
valid->face = face; |
221 |
|
|
|
|
|
222 |
limit = valid->root->limit; |
limit = valid->root->limit; |
223 |
table_size = limit - table; |
table_size = limit - table; |
224 |
|
|
225 |
FT_TRACE3(( "validation trak table\n" )); |
FT_TRACE3(( "validating `trak' table\n" )); |
226 |
GXV_INIT; |
GXV_INIT; |
227 |
|
|
228 |
GXV_LIMIT_CHECK( 4 + 2 + 2 + 2 + 2 ); |
GXV_LIMIT_CHECK( 4 + 2 + 2 + 2 + 2 ); |
253 |
if ( reserved != 0x0000 ) |
if ( reserved != 0x0000 ) |
254 |
FT_INVALID_DATA; |
FT_INVALID_DATA; |
255 |
|
|
|
|
|
256 |
/* validate trackData */ |
/* validate trackData */ |
257 |
if ( 0 < horizOffset ) |
if ( 0 < horizOffset ) |
258 |
{ |
{ |
270 |
|
|
271 |
gxv_odtect_validate( odtect, valid ); |
gxv_odtect_validate( odtect, valid ); |
272 |
|
|
|
|
|
273 |
FT_TRACE4(( "\n" )); |
FT_TRACE4(( "\n" )); |
274 |
} |
} |
275 |
|
|