Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4349 | Serge | 1 | /***************************************************************************/ |
2 | /* */ |
||
3 | /* gxvbsln.c */ |
||
4 | /* */ |
||
5 | /* TrueTypeGX/AAT bsln table validation (body). */ |
||
6 | /* */ |
||
7 | /* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ |
||
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 | /* */ |
||
20 | /* gxvalid is derived from both gxlayout module and otvalid module. */ |
||
21 | /* Development of gxlayout is supported by the Information-technology */ |
||
22 | /* Promotion Agency(IPA), Japan. */ |
||
23 | /* */ |
||
24 | /***************************************************************************/ |
||
25 | |||
26 | |||
27 | #include "gxvalid.h" |
||
28 | #include "gxvcommn.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_gxvbsln |
||
39 | |||
40 | |||
41 | /*************************************************************************/ |
||
42 | /*************************************************************************/ |
||
43 | /***** *****/ |
||
44 | /***** Data and Types *****/ |
||
45 | /***** *****/ |
||
46 | /*************************************************************************/ |
||
47 | /*************************************************************************/ |
||
48 | |||
49 | #define GXV_BSLN_VALUE_COUNT 32 |
||
50 | #define GXV_BSLN_VALUE_EMPTY 0xFFFFU |
||
51 | |||
52 | |||
53 | typedef struct GXV_bsln_DataRec_ |
||
54 | { |
||
55 | FT_Bytes ctlPoints_p; |
||
56 | FT_UShort defaultBaseline; |
||
57 | |||
58 | } GXV_bsln_DataRec, *GXV_bsln_Data; |
||
59 | |||
60 | |||
61 | #define GXV_BSLN_DATA( field ) GXV_TABLE_DATA( bsln, field ) |
||
62 | |||
63 | |||
64 | /*************************************************************************/ |
||
65 | /*************************************************************************/ |
||
66 | /***** *****/ |
||
67 | /***** UTILITY FUNCTIONS *****/ |
||
68 | /***** *****/ |
||
69 | /*************************************************************************/ |
||
70 | /*************************************************************************/ |
||
71 | |||
72 | static void |
||
73 | gxv_bsln_LookupValue_validate( FT_UShort glyph, |
||
74 | GXV_LookupValueCPtr value_p, |
||
75 | GXV_Validator valid ) |
||
76 | { |
||
77 | FT_UShort v = value_p->u; |
||
78 | FT_UShort* ctlPoints; |
||
79 | |||
80 | FT_UNUSED( glyph ); |
||
81 | |||
82 | |||
83 | GXV_NAME_ENTER( "lookup value" ); |
||
84 | |||
85 | if ( v >= GXV_BSLN_VALUE_COUNT ) |
||
86 | FT_INVALID_DATA; |
||
87 | |||
88 | ctlPoints = (FT_UShort*)GXV_BSLN_DATA( ctlPoints_p ); |
||
89 | if ( ctlPoints && ctlPoints[v] == GXV_BSLN_VALUE_EMPTY ) |
||
90 | FT_INVALID_DATA; |
||
91 | |||
92 | GXV_EXIT; |
||
93 | } |
||
94 | |||
95 | |||
96 | /* |
||
97 | +===============+ --------+ |
||
98 | | lookup header | | |
||
99 | +===============+ | |
||
100 | | BinSrchHeader | | |
||
101 | +===============+ | |
||
102 | | lastGlyph[0] | | |
||
103 | +---------------+ | |
||
104 | | firstGlyph[0] | | head of lookup table |
||
105 | +---------------+ | + |
||
106 | | offset[0] | -> | offset [byte] |
||
107 | +===============+ | + |
||
108 | | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] |
||
109 | +---------------+ | |
||
110 | | firstGlyph[1] | | |
||
111 | +---------------+ | |
||
112 | | offset[1] | | |
||
113 | +===============+ | |
||
114 | | |
||
115 | ... | |
||
116 | | |
||
117 | 16bit value array | |
||
118 | +===============+ | |
||
119 | | value | <-------+ |
||
120 | ... |
||
121 | */ |
||
122 | |||
123 | static GXV_LookupValueDesc |
||
124 | gxv_bsln_LookupFmt4_transit( FT_UShort relative_gindex, |
||
125 | GXV_LookupValueCPtr base_value_p, |
||
126 | FT_Bytes lookuptbl_limit, |
||
127 | GXV_Validator valid ) |
||
128 | { |
||
129 | FT_Bytes p; |
||
130 | FT_Bytes limit; |
||
131 | FT_UShort offset; |
||
132 | GXV_LookupValueDesc value; |
||
133 | |||
134 | /* XXX: check range ? */ |
||
135 | offset = (FT_UShort)( base_value_p->u + |
||
136 | ( relative_gindex * sizeof ( FT_UShort ) ) ); |
||
137 | |||
138 | p = valid->lookuptbl_head + offset; |
||
139 | limit = lookuptbl_limit; |
||
140 | GXV_LIMIT_CHECK( 2 ); |
||
141 | |||
142 | value.u = FT_NEXT_USHORT( p ); |
||
143 | |||
144 | return value; |
||
145 | } |
||
146 | |||
147 | |||
148 | static void |
||
149 | gxv_bsln_parts_fmt0_validate( FT_Bytes tables, |
||
150 | FT_Bytes limit, |
||
151 | GXV_Validator valid ) |
||
152 | { |
||
153 | FT_Bytes p = tables; |
||
154 | |||
155 | |||
156 | GXV_NAME_ENTER( "parts format 0" ); |
||
157 | |||
158 | /* deltas */ |
||
159 | GXV_LIMIT_CHECK( 2 * GXV_BSLN_VALUE_COUNT ); |
||
160 | |||
161 | valid->table_data = NULL; /* No ctlPoints here. */ |
||
162 | |||
163 | GXV_EXIT; |
||
164 | } |
||
165 | |||
166 | |||
167 | static void |
||
168 | gxv_bsln_parts_fmt1_validate( FT_Bytes tables, |
||
169 | FT_Bytes limit, |
||
170 | GXV_Validator valid ) |
||
171 | { |
||
172 | FT_Bytes p = tables; |
||
173 | |||
174 | |||
175 | GXV_NAME_ENTER( "parts format 1" ); |
||
176 | |||
177 | /* deltas */ |
||
178 | gxv_bsln_parts_fmt0_validate( p, limit, valid ); |
||
179 | |||
180 | /* mappingData */ |
||
181 | valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; |
||
182 | valid->lookupval_func = gxv_bsln_LookupValue_validate; |
||
183 | valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit; |
||
184 | gxv_LookupTable_validate( p + 2 * GXV_BSLN_VALUE_COUNT, |
||
185 | limit, |
||
186 | valid ); |
||
187 | |||
188 | GXV_EXIT; |
||
189 | } |
||
190 | |||
191 | |||
192 | static void |
||
193 | gxv_bsln_parts_fmt2_validate( FT_Bytes tables, |
||
194 | FT_Bytes limit, |
||
195 | GXV_Validator valid ) |
||
196 | { |
||
197 | FT_Bytes p = tables; |
||
198 | |||
199 | FT_UShort stdGlyph; |
||
200 | FT_UShort ctlPoint; |
||
201 | FT_Int i; |
||
202 | |||
203 | FT_UShort defaultBaseline = GXV_BSLN_DATA( defaultBaseline ); |
||
204 | |||
205 | |||
206 | GXV_NAME_ENTER( "parts format 2" ); |
||
207 | |||
208 | GXV_LIMIT_CHECK( 2 + ( 2 * GXV_BSLN_VALUE_COUNT ) ); |
||
209 | |||
210 | /* stdGlyph */ |
||
211 | stdGlyph = FT_NEXT_USHORT( p ); |
||
212 | GXV_TRACE(( " (stdGlyph = %u)\n", stdGlyph )); |
||
213 | |||
214 | gxv_glyphid_validate( stdGlyph, valid ); |
||
215 | |||
216 | /* Record the position of ctlPoints */ |
||
217 | GXV_BSLN_DATA( ctlPoints_p ) = p; |
||
218 | |||
219 | /* ctlPoints */ |
||
220 | for ( i = 0; i < GXV_BSLN_VALUE_COUNT; i++ ) |
||
221 | { |
||
222 | ctlPoint = FT_NEXT_USHORT( p ); |
||
223 | if ( ctlPoint == GXV_BSLN_VALUE_EMPTY ) |
||
224 | { |
||
225 | if ( i == defaultBaseline ) |
||
226 | FT_INVALID_DATA; |
||
227 | } |
||
228 | else |
||
229 | gxv_ctlPoint_validate( stdGlyph, (FT_Short)ctlPoint, valid ); |
||
230 | } |
||
231 | |||
232 | GXV_EXIT; |
||
233 | } |
||
234 | |||
235 | |||
236 | static void |
||
237 | gxv_bsln_parts_fmt3_validate( FT_Bytes tables, |
||
238 | FT_Bytes limit, |
||
239 | GXV_Validator valid) |
||
240 | { |
||
241 | FT_Bytes p = tables; |
||
242 | |||
243 | |||
244 | GXV_NAME_ENTER( "parts format 3" ); |
||
245 | |||
246 | /* stdGlyph + ctlPoints */ |
||
247 | gxv_bsln_parts_fmt2_validate( p, limit, valid ); |
||
248 | |||
249 | /* mappingData */ |
||
250 | valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; |
||
251 | valid->lookupval_func = gxv_bsln_LookupValue_validate; |
||
252 | valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit; |
||
253 | gxv_LookupTable_validate( p + ( 2 + 2 * GXV_BSLN_VALUE_COUNT ), |
||
254 | limit, |
||
255 | valid ); |
||
256 | |||
257 | GXV_EXIT; |
||
258 | } |
||
259 | |||
260 | |||
261 | /*************************************************************************/ |
||
262 | /*************************************************************************/ |
||
263 | /***** *****/ |
||
264 | /***** bsln TABLE *****/ |
||
265 | /***** *****/ |
||
266 | /*************************************************************************/ |
||
267 | /*************************************************************************/ |
||
268 | |||
269 | FT_LOCAL_DEF( void ) |
||
270 | gxv_bsln_validate( FT_Bytes table, |
||
271 | FT_Face face, |
||
272 | FT_Validator ftvalid ) |
||
273 | { |
||
274 | GXV_ValidatorRec validrec; |
||
275 | GXV_Validator valid = &validrec; |
||
276 | |||
277 | GXV_bsln_DataRec bslnrec; |
||
278 | GXV_bsln_Data bsln = &bslnrec; |
||
279 | |||
280 | FT_Bytes p = table; |
||
281 | FT_Bytes limit = 0; |
||
282 | |||
283 | FT_ULong version; |
||
284 | FT_UShort format; |
||
285 | FT_UShort defaultBaseline; |
||
286 | |||
287 | GXV_Validate_Func fmt_funcs_table [] = |
||
288 | { |
||
289 | gxv_bsln_parts_fmt0_validate, |
||
290 | gxv_bsln_parts_fmt1_validate, |
||
291 | gxv_bsln_parts_fmt2_validate, |
||
292 | gxv_bsln_parts_fmt3_validate, |
||
293 | }; |
||
294 | |||
295 | |||
296 | valid->root = ftvalid; |
||
297 | valid->table_data = bsln; |
||
298 | valid->face = face; |
||
299 | |||
300 | FT_TRACE3(( "validating `bsln' table\n" )); |
||
301 | GXV_INIT; |
||
302 | |||
303 | |||
304 | GXV_LIMIT_CHECK( 4 + 2 + 2 ); |
||
305 | version = FT_NEXT_ULONG( p ); |
||
306 | format = FT_NEXT_USHORT( p ); |
||
307 | defaultBaseline = FT_NEXT_USHORT( p ); |
||
308 | |||
309 | /* only version 1.0 is defined (1996) */ |
||
310 | if ( version != 0x00010000UL ) |
||
311 | FT_INVALID_FORMAT; |
||
312 | |||
313 | /* only format 1, 2, 3 are defined (1996) */ |
||
314 | GXV_TRACE(( " (format = %d)\n", format )); |
||
315 | if ( format > 3 ) |
||
316 | FT_INVALID_FORMAT; |
||
317 | |||
318 | if ( defaultBaseline > 31 ) |
||
319 | FT_INVALID_FORMAT; |
||
320 | |||
321 | bsln->defaultBaseline = defaultBaseline; |
||
322 | |||
323 | fmt_funcs_table[format]( p, limit, valid ); |
||
324 | |||
325 | FT_TRACE4(( "\n" )); |
||
326 | } |
||
327 | |||
328 | |||
329 | /* arch-tag: ebe81143-fdaa-4c68-a4d1-b57227daa3bc |
||
330 | (do not change this comment) */ |
||
331 | |||
332 | |||
333 | /* END */>-------+ |