Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(663)

Side by Side Diff: src/cff/cffparse.c

Issue 89753003: Update freetype to latest version of ASOP. (Closed) Base URL: https://chromium.googlesource.com/chromium/src/third_party/freetype.git@master
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/cff/cffobjs.c ('k') | src/cff/cffpic.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /***************************************************************************/ 1 /***************************************************************************/
2 /* */ 2 /* */
3 /* cffparse.c */ 3 /* cffparse.c */
4 /* */ 4 /* */
5 /* CFF token stream parser (body) */ 5 /* CFF token stream parser (body) */
6 /* */ 6 /* */
7 /* Copyright 1996-2004, 2007-2011 by */ 7 /* Copyright 1996-2004, 2007-2013 by */
8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ 8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
9 /* */ 9 /* */
10 /* This file is part of the FreeType project, and may only be used, */ 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 */ 11 /* modified, and distributed under the terms of the FreeType project */
12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */
13 /* this file you indicate that you have read the license and */ 13 /* this file you indicate that you have read the license and */
14 /* understand and accept it fully. */ 14 /* understand and accept it fully. */
15 /* */ 15 /* */
16 /***************************************************************************/ 16 /***************************************************************************/
17 17
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 FT_Byte* p = start; 58 FT_Byte* p = start;
59 FT_Int v = *p++; 59 FT_Int v = *p++;
60 FT_Long val = 0; 60 FT_Long val = 0;
61 61
62 62
63 if ( v == 28 ) 63 if ( v == 28 )
64 { 64 {
65 if ( p + 2 > limit ) 65 if ( p + 2 > limit )
66 goto Bad; 66 goto Bad;
67 67
68 val = (FT_Short)( ( (FT_Int)p[0] << 8 ) | p[1] ); 68 val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] );
69 p += 2; 69 p += 2;
70 } 70 }
71 else if ( v == 29 ) 71 else if ( v == 29 )
72 { 72 {
73 if ( p + 4 > limit ) 73 if ( p + 4 > limit )
74 goto Bad; 74 goto Bad;
75 75
76 val = ( (FT_Long)p[0] << 24 ) | 76 val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) |
77 ( (FT_Long)p[1] << 16 ) | 77 ( (FT_ULong)p[1] << 16 ) |
78 ( (FT_Long)p[2] << 8 ) | 78 ( (FT_ULong)p[2] << 8 ) |
79 p[3]; 79 (FT_ULong)p[3] );
80 p += 4; 80 p += 4;
81 } 81 }
82 else if ( v < 247 ) 82 else if ( v < 247 )
83 { 83 {
84 val = v - 139; 84 val = v - 139;
85 } 85 }
86 else if ( v < 251 ) 86 else if ( v < 251 )
87 { 87 {
88 if ( p + 1 > limit ) 88 if ( p + 1 > limit )
89 goto Bad; 89 goto Bad;
90 90
91 val = ( v - 247 ) * 256 + p[0] + 108; 91 val = ( v - 247 ) * 256 + p[0] + 108;
92 p++; 92 p++;
93 } 93 }
94 else 94 else
95 { 95 {
96 if ( p + 1 > limit ) 96 if ( p + 1 > limit )
97 goto Bad; 97 goto Bad;
98 98
99 val = -( v - 251 ) * 256 - p[0] - 108; 99 val = -( v - 251 ) * 256 - p[0] - 108;
100 p++; 100 p++;
101 } 101 }
102 102
103 Exit: 103 Exit:
104 return val; 104 return val;
105 105
106 Bad: 106 Bad:
107 val = 0; 107 val = 0;
108 FT_TRACE4(( "!!!END OF DATA:!!!" ));
108 goto Exit; 109 goto Exit;
109 } 110 }
110 111
111 112
112 static const FT_Long power_tens[] = 113 static const FT_Long power_tens[] =
113 { 114 {
114 1L, 115 1L,
115 10L, 116 10L,
116 100L, 117 100L,
117 1000L, 118 1000L,
(...skipping 11 matching lines...) Expand all
129 cff_parse_real( FT_Byte* start, 130 cff_parse_real( FT_Byte* start,
130 FT_Byte* limit, 131 FT_Byte* limit,
131 FT_Long power_ten, 132 FT_Long power_ten,
132 FT_Long* scaling ) 133 FT_Long* scaling )
133 { 134 {
134 FT_Byte* p = start; 135 FT_Byte* p = start;
135 FT_UInt nib; 136 FT_UInt nib;
136 FT_UInt phase; 137 FT_UInt phase;
137 138
138 FT_Long result, number, exponent; 139 FT_Long result, number, exponent;
139 FT_Int sign = 0, exponent_sign = 0; 140 FT_Int sign = 0, exponent_sign = 0, have_overflow = 0;
140 FT_Long exponent_add, integer_length, fraction_length; 141 FT_Long exponent_add, integer_length, fraction_length;
141 142
142 143
143 if ( scaling ) 144 if ( scaling )
144 *scaling = 0; 145 *scaling = 0;
145 146
146 result = 0; 147 result = 0;
147 148
148 number = 0; 149 number = 0;
149 exponent = 0; 150 exponent = 0;
150 151
151 exponent_add = 0; 152 exponent_add = 0;
152 integer_length = 0; 153 integer_length = 0;
153 fraction_length = 0; 154 fraction_length = 0;
154 155
155 /* First of all, read the integer part. */ 156 /* First of all, read the integer part. */
156 phase = 4; 157 phase = 4;
157 158
158 for (;;) 159 for (;;)
159 { 160 {
160 /* If we entered this iteration with phase == 4, we need to */ 161 /* If we entered this iteration with phase == 4, we need to */
161 /* read a new byte. This also skips past the initial 0x1E. */ 162 /* read a new byte. This also skips past the initial 0x1E. */
162 if ( phase ) 163 if ( phase )
163 { 164 {
164 p++; 165 p++;
165 166
166 /* Make sure we don't read past the end. */ 167 /* Make sure we don't read past the end. */
167 if ( p >= limit ) 168 if ( p >= limit )
168 goto Exit; 169 goto Bad;
169 } 170 }
170 171
171 /* Get the nibble. */ 172 /* Get the nibble. */
172 nib = ( p[0] >> phase ) & 0xF; 173 nib = ( p[0] >> phase ) & 0xF;
173 phase = 4 - phase; 174 phase = 4 - phase;
174 175
175 if ( nib == 0xE ) 176 if ( nib == 0xE )
176 sign = 1; 177 sign = 1;
177 else if ( nib > 9 ) 178 else if ( nib > 9 )
178 break; 179 break;
(...skipping 16 matching lines...) Expand all
195 for (;;) 196 for (;;)
196 { 197 {
197 /* If we entered this iteration with phase == 4, we need */ 198 /* If we entered this iteration with phase == 4, we need */
198 /* to read a new byte. */ 199 /* to read a new byte. */
199 if ( phase ) 200 if ( phase )
200 { 201 {
201 p++; 202 p++;
202 203
203 /* Make sure we don't read past the end. */ 204 /* Make sure we don't read past the end. */
204 if ( p >= limit ) 205 if ( p >= limit )
205 goto Exit; 206 goto Bad;
206 } 207 }
207 208
208 /* Get the nibble. */ 209 /* Get the nibble. */
209 nib = ( p[0] >> phase ) & 0xF; 210 nib = ( p[0] >> phase ) & 0xF;
210 phase = 4 - phase; 211 phase = 4 - phase;
211 if ( nib >= 10 ) 212 if ( nib >= 10 )
212 break; 213 break;
213 214
214 /* Skip leading zeros if possible. */ 215 /* Skip leading zeros if possible. */
215 if ( !nib && !number ) 216 if ( !nib && !number )
(...skipping 18 matching lines...) Expand all
234 for (;;) 235 for (;;)
235 { 236 {
236 /* If we entered this iteration with phase == 4, */ 237 /* If we entered this iteration with phase == 4, */
237 /* we need to read a new byte. */ 238 /* we need to read a new byte. */
238 if ( phase ) 239 if ( phase )
239 { 240 {
240 p++; 241 p++;
241 242
242 /* Make sure we don't read past the end. */ 243 /* Make sure we don't read past the end. */
243 if ( p >= limit ) 244 if ( p >= limit )
244 goto Exit; 245 goto Bad;
245 } 246 }
246 247
247 /* Get the nibble. */ 248 /* Get the nibble. */
248 nib = ( p[0] >> phase ) & 0xF; 249 nib = ( p[0] >> phase ) & 0xF;
249 phase = 4 - phase; 250 phase = 4 - phase;
250 if ( nib >= 10 ) 251 if ( nib >= 10 )
251 break; 252 break;
252 253
253 exponent = exponent * 10 + nib;
254
255 /* Arbitrarily limit exponent. */ 254 /* Arbitrarily limit exponent. */
256 if ( exponent > 1000 ) 255 if ( exponent > 1000 )
257 goto Exit; 256 have_overflow = 1;
257 else
258 exponent = exponent * 10 + nib;
258 } 259 }
259 260
260 if ( exponent_sign ) 261 if ( exponent_sign )
261 exponent = -exponent; 262 exponent = -exponent;
262 } 263 }
263 264
265 if ( !number )
266 goto Exit;
267
268 if ( have_overflow )
269 {
270 if ( exponent_sign )
271 goto Underflow;
272 else
273 goto Overflow;
274 }
275
264 /* We don't check `power_ten' and `exponent_add'. */ 276 /* We don't check `power_ten' and `exponent_add'. */
265 exponent += power_ten + exponent_add; 277 exponent += power_ten + exponent_add;
266 278
267 if ( scaling ) 279 if ( scaling )
268 { 280 {
269 /* Only use `fraction_length'. */ 281 /* Only use `fraction_length'. */
270 fraction_length += integer_length; 282 fraction_length += integer_length;
271 exponent += integer_length; 283 exponent += integer_length;
272 284
273 if ( fraction_length <= 5 ) 285 if ( fraction_length <= 5 )
274 { 286 {
275 if ( number > 0x7FFFL ) 287 if ( number > 0x7FFFL )
276 { 288 {
277 result = FT_DivFix( number, 10 ); 289 result = FT_DivFix( number, 10 );
278 *scaling = exponent - fraction_length + 1; 290 *scaling = exponent - fraction_length + 1;
279 } 291 }
280 else 292 else
281 { 293 {
282 if ( exponent > 0 ) 294 if ( exponent > 0 )
283 { 295 {
284 FT_Long new_fraction_length, shift; 296 FT_Long new_fraction_length, shift;
285 297
286 298
287 /* Make `scaling' as small as possible. */ 299 /* Make `scaling' as small as possible. */
288 new_fraction_length = FT_MIN( exponent, 5 ); 300 new_fraction_length = FT_MIN( exponent, 5 );
289 exponent -= new_fraction_length;
290 shift = new_fraction_length - fraction_length; 301 shift = new_fraction_length - fraction_length;
291 302
292 number *= power_tens[shift]; 303 if ( shift > 0 )
293 if ( number > 0x7FFFL )
294 { 304 {
295 number /= 10; 305 exponent -= new_fraction_length;
296 exponent += 1; 306 number *= power_tens[shift];
307 if ( number > 0x7FFFL )
308 {
309 number /= 10;
310 exponent += 1;
311 }
297 } 312 }
313 else
314 exponent -= fraction_length;
298 } 315 }
299 else 316 else
300 exponent -= fraction_length; 317 exponent -= fraction_length;
301 318
302 result = number << 16; 319 result = (FT_Long)( (FT_ULong)number << 16 );
303 *scaling = exponent; 320 *scaling = exponent;
304 } 321 }
305 } 322 }
306 else 323 else
307 { 324 {
308 if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL ) 325 if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL )
309 { 326 {
310 result = FT_DivFix( number, power_tens[fraction_length - 4] ); 327 result = FT_DivFix( number, power_tens[fraction_length - 4] );
311 *scaling = exponent - 4; 328 *scaling = exponent - 4;
312 } 329 }
313 else 330 else
314 { 331 {
315 result = FT_DivFix( number, power_tens[fraction_length - 5] ); 332 result = FT_DivFix( number, power_tens[fraction_length - 5] );
316 *scaling = exponent - 5; 333 *scaling = exponent - 5;
317 } 334 }
318 } 335 }
319 } 336 }
320 else 337 else
321 { 338 {
322 integer_length += exponent; 339 integer_length += exponent;
323 fraction_length -= exponent; 340 fraction_length -= exponent;
324 341
325 /* Check for overflow and underflow. */ 342 if ( integer_length > 5 )
326 if ( FT_ABS( integer_length ) > 5 ) 343 goto Overflow;
327 goto Exit; 344 if ( integer_length < -5 )
345 goto Underflow;
328 346
329 /* Remove non-significant digits. */ 347 /* Remove non-significant digits. */
330 if ( integer_length < 0 ) 348 if ( integer_length < 0 )
331 { 349 {
332 number /= power_tens[-integer_length]; 350 number /= power_tens[-integer_length];
333 fraction_length += integer_length; 351 fraction_length += integer_length;
334 } 352 }
335 353
336 /* this can only happen if exponent was non-zero */ 354 /* this can only happen if exponent was non-zero */
337 if ( fraction_length == 10 ) 355 if ( fraction_length == 10 )
338 { 356 {
339 number /= 10; 357 number /= 10;
340 fraction_length -= 1; 358 fraction_length -= 1;
341 } 359 }
342 360
343 /* Convert into 16.16 format. */ 361 /* Convert into 16.16 format. */
344 if ( fraction_length > 0 ) 362 if ( fraction_length > 0 )
345 { 363 {
346 if ( ( number / power_tens[fraction_length] ) > 0x7FFFL ) 364 if ( ( number / power_tens[fraction_length] ) > 0x7FFFL )
347 goto Exit; 365 goto Exit;
348 366
349 result = FT_DivFix( number, power_tens[fraction_length] ); 367 result = FT_DivFix( number, power_tens[fraction_length] );
350 } 368 }
351 else 369 else
352 { 370 {
353 number *= power_tens[-fraction_length]; 371 number *= power_tens[-fraction_length];
354 372
355 if ( number > 0x7FFFL ) 373 if ( number > 0x7FFFL )
356 goto Exit; 374 goto Overflow;
357 375
358 result = number << 16; 376 result = (FT_Long)( (FT_ULong)number << 16 );
359 } 377 }
360 } 378 }
361 379
380 Exit:
362 if ( sign ) 381 if ( sign )
363 result = -result; 382 result = -result;
364 383
365 Exit:
366 return result; 384 return result;
385
386 Overflow:
387 result = 0x7FFFFFFFL;
388 FT_TRACE4(( "!!!OVERFLOW:!!!" ));
389 goto Exit;
390
391 Underflow:
392 result = 0;
393 FT_TRACE4(( "!!!UNDERFLOW:!!!" ));
394 goto Exit;
395
396 Bad:
397 result = 0;
398 FT_TRACE4(( "!!!END OF DATA:!!!" ));
399 goto Exit;
367 } 400 }
368 401
369 402
370 /* read a number, either integer or real */ 403 /* read a number, either integer or real */
371 static FT_Long 404 static FT_Long
372 cff_parse_num( FT_Byte** d ) 405 cff_parse_num( FT_Byte** d )
373 { 406 {
374 return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 ) 407 return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 )
375 : cff_parse_integer( d[0], d[1] ); 408 : cff_parse_integer( d[0], d[1] );
376 } 409 }
377 410
378 411
379 /* read a floating point number, either integer or real */ 412 /* read a floating point number, either integer or real */
380 static FT_Fixed 413 static FT_Fixed
414 do_fixed( FT_Byte** d,
415 FT_Long scaling )
416 {
417 if ( **d == 30 )
418 return cff_parse_real( d[0], d[1], scaling, NULL );
419 else
420 {
421 FT_Long val = cff_parse_integer( d[0], d[1] );
422
423
424 if ( scaling )
425 val *= power_tens[scaling];
426
427 if ( val > 0x7FFF )
428 {
429 val = 0x7FFFFFFFL;
430 goto Overflow;
431 }
432 else if ( val < -0x7FFF )
433 {
434 val = -0x7FFFFFFFL;
435 goto Overflow;
436 }
437
438 return (FT_Long)( (FT_ULong)val << 16 );
439
440 Overflow:
441 FT_TRACE4(( "!!!OVERFLOW:!!!" ));
442 return val;
443 }
444 }
445
446
447 /* read a floating point number, either integer or real */
448 static FT_Fixed
381 cff_parse_fixed( FT_Byte** d ) 449 cff_parse_fixed( FT_Byte** d )
382 { 450 {
383 return **d == 30 ? cff_parse_real( d[0], d[1], 0, NULL ) 451 return do_fixed( d, 0 );
384 : cff_parse_integer( d[0], d[1] ) << 16;
385 } 452 }
386 453
387 454
388 /* read a floating point number, either integer or real, */ 455 /* read a floating point number, either integer or real, */
389 /* but return `10^scaling' times the number read in */ 456 /* but return `10^scaling' times the number read in */
390 static FT_Fixed 457 static FT_Fixed
391 cff_parse_fixed_scaled( FT_Byte** d, 458 cff_parse_fixed_scaled( FT_Byte** d,
392 FT_Long scaling ) 459 FT_Long scaling )
393 { 460 {
394 return **d == 30 ? cff_parse_real( d[0], d[1], scaling, NULL ) 461 return do_fixed( d, scaling );
395 : ( cff_parse_integer( d[0], d[1] ) *
396 power_tens[scaling] ) << 16;
397 } 462 }
398 463
399 464
400 /* read a floating point number, either integer or real, */ 465 /* read a floating point number, either integer or real, */
401 /* and return it as precise as possible -- `scaling' returns */ 466 /* and return it as precise as possible -- `scaling' returns */
402 /* the scaling factor (as a power of 10) */ 467 /* the scaling factor (as a power of 10) */
403 static FT_Fixed 468 static FT_Fixed
404 cff_parse_fixed_dynamic( FT_Byte** d, 469 cff_parse_fixed_dynamic( FT_Byte** d,
405 FT_Long* scaling ) 470 FT_Long* scaling )
406 { 471 {
(...skipping 22 matching lines...) Expand all
429 } 494 }
430 else 495 else
431 { 496 {
432 *scaling = integer_length - 5; 497 *scaling = integer_length - 5;
433 return FT_DivFix( number, power_tens[integer_length - 5] ); 498 return FT_DivFix( number, power_tens[integer_length - 5] );
434 } 499 }
435 } 500 }
436 else 501 else
437 { 502 {
438 *scaling = 0; 503 *scaling = 0;
439 return number << 16; 504 return (FT_Long)( (FT_ULong)number << 16 );
440 } 505 }
441 } 506 }
442 } 507 }
443 508
444 509
445 static FT_Error 510 static FT_Error
446 cff_parse_font_matrix( CFF_Parser parser ) 511 cff_parse_font_matrix( CFF_Parser parser )
447 { 512 {
448 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 513 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
449 FT_Matrix* matrix = &dict->font_matrix; 514 FT_Matrix* matrix = &dict->font_matrix;
450 FT_Vector* offset = &dict->font_offset; 515 FT_Vector* offset = &dict->font_offset;
451 FT_ULong* upm = &dict->units_per_em; 516 FT_ULong* upm = &dict->units_per_em;
452 FT_Byte** data = parser->stack; 517 FT_Byte** data = parser->stack;
453 FT_Error error = CFF_Err_Stack_Underflow; 518 FT_Error error = FT_ERR( Stack_Underflow );
454 519
455 520
456 if ( parser->top >= parser->stack + 6 ) 521 if ( parser->top >= parser->stack + 6 )
457 { 522 {
458 FT_Long scaling; 523 FT_Long scaling;
459 524
460 525
461 error = CFF_Err_Ok; 526 error = FT_Err_Ok;
462 527
463 dict->has_font_matrix = TRUE; 528 dict->has_font_matrix = TRUE;
464 529
465 /* We expect a well-formed font matrix, this is, the matrix elements */ 530 /* We expect a well-formed font matrix, this is, the matrix elements */
466 /* `xx' and `yy' are of approximately the same magnitude. To avoid */ 531 /* `xx' and `yy' are of approximately the same magnitude. To avoid */
467 /* loss of precision, we use the magnitude of element `xx' to scale */ 532 /* loss of precision, we use the magnitude of element `xx' to scale */
468 /* all other elements. The scaling factor is then contained in the */ 533 /* all other elements. The scaling factor is then contained in the */
469 /* `units_per_em' value. */ 534 /* `units_per_em' value. */
470 535
471 matrix->xx = cff_parse_fixed_dynamic( data++, &scaling ); 536 matrix->xx = cff_parse_fixed_dynamic( data++, &scaling );
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 581
517 static FT_Error 582 static FT_Error
518 cff_parse_font_bbox( CFF_Parser parser ) 583 cff_parse_font_bbox( CFF_Parser parser )
519 { 584 {
520 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 585 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
521 FT_BBox* bbox = &dict->font_bbox; 586 FT_BBox* bbox = &dict->font_bbox;
522 FT_Byte** data = parser->stack; 587 FT_Byte** data = parser->stack;
523 FT_Error error; 588 FT_Error error;
524 589
525 590
526 error = CFF_Err_Stack_Underflow; 591 error = FT_ERR( Stack_Underflow );
527 592
528 if ( parser->top >= parser->stack + 4 ) 593 if ( parser->top >= parser->stack + 4 )
529 { 594 {
530 bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) ); 595 bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) );
531 bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) ); 596 bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) );
532 bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) ); 597 bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) );
533 bbox->yMax = FT_RoundFix( cff_parse_fixed( data ) ); 598 bbox->yMax = FT_RoundFix( cff_parse_fixed( data ) );
534 error = CFF_Err_Ok; 599 error = FT_Err_Ok;
535 600
536 FT_TRACE4(( " [%d %d %d %d]\n", 601 FT_TRACE4(( " [%d %d %d %d]\n",
537 bbox->xMin / 65536, 602 bbox->xMin / 65536,
538 bbox->yMin / 65536, 603 bbox->yMin / 65536,
539 bbox->xMax / 65536, 604 bbox->xMax / 65536,
540 bbox->yMax / 65536 )); 605 bbox->yMax / 65536 ));
541 } 606 }
542 607
543 return error; 608 return error;
544 } 609 }
545 610
546 611
547 static FT_Error 612 static FT_Error
548 cff_parse_private_dict( CFF_Parser parser ) 613 cff_parse_private_dict( CFF_Parser parser )
549 { 614 {
550 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 615 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
551 FT_Byte** data = parser->stack; 616 FT_Byte** data = parser->stack;
552 FT_Error error; 617 FT_Error error;
553 618
554 619
555 error = CFF_Err_Stack_Underflow; 620 error = FT_ERR( Stack_Underflow );
556 621
557 if ( parser->top >= parser->stack + 2 ) 622 if ( parser->top >= parser->stack + 2 )
558 { 623 {
559 dict->private_size = cff_parse_num( data++ ); 624 dict->private_size = cff_parse_num( data++ );
560 dict->private_offset = cff_parse_num( data ); 625 dict->private_offset = cff_parse_num( data );
561 FT_TRACE4(( " %lu %lu\n", 626 FT_TRACE4(( " %lu %lu\n",
562 dict->private_size, dict->private_offset )); 627 dict->private_size, dict->private_offset ));
563 628
564 error = CFF_Err_Ok; 629 error = FT_Err_Ok;
565 } 630 }
566 631
567 return error; 632 return error;
568 } 633 }
569 634
570 635
571 static FT_Error 636 static FT_Error
572 cff_parse_cid_ros( CFF_Parser parser ) 637 cff_parse_cid_ros( CFF_Parser parser )
573 { 638 {
574 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; 639 CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
575 FT_Byte** data = parser->stack; 640 FT_Byte** data = parser->stack;
576 FT_Error error; 641 FT_Error error;
577 642
578 643
579 error = CFF_Err_Stack_Underflow; 644 error = FT_ERR( Stack_Underflow );
580 645
581 if ( parser->top >= parser->stack + 3 ) 646 if ( parser->top >= parser->stack + 3 )
582 { 647 {
583 dict->cid_registry = (FT_UInt)cff_parse_num( data++ ); 648 dict->cid_registry = (FT_UInt)cff_parse_num( data++ );
584 dict->cid_ordering = (FT_UInt)cff_parse_num( data++ ); 649 dict->cid_ordering = (FT_UInt)cff_parse_num( data++ );
585 if ( **data == 30 ) 650 if ( **data == 30 )
586 FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" )); 651 FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" ));
587 dict->cid_supplement = cff_parse_num( data ); 652 dict->cid_supplement = cff_parse_num( data );
588 if ( dict->cid_supplement < 0 ) 653 if ( dict->cid_supplement < 0 )
589 FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n", 654 FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n",
590 dict->cid_supplement )); 655 dict->cid_supplement ));
591 error = CFF_Err_Ok; 656 error = FT_Err_Ok;
592 657
593 FT_TRACE4(( " %d %d %d\n", 658 FT_TRACE4(( " %d %d %d\n",
594 dict->cid_registry, 659 dict->cid_registry,
595 dict->cid_ordering, 660 dict->cid_ordering,
596 dict->cid_supplement )); 661 dict->cid_supplement ));
597 } 662 }
598 663
599 return error; 664 return error;
600 } 665 }
601 666
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
723 788
724 if ( clazz ) 789 if ( clazz )
725 FT_FREE( clazz ); 790 FT_FREE( clazz );
726 } 791 }
727 792
728 793
729 FT_Error 794 FT_Error
730 FT_Create_Class_cff_field_handlers( FT_Library library, 795 FT_Create_Class_cff_field_handlers( FT_Library library,
731 CFF_Field_Handler** output_class ) 796 CFF_Field_Handler** output_class )
732 { 797 {
733 CFF_Field_Handler* clazz; 798 CFF_Field_Handler* clazz = NULL;
734 FT_Error error; 799 FT_Error error;
735 FT_Memory memory = library->memory; 800 FT_Memory memory = library->memory;
736 801
737 int i = 0; 802 int i = 0;
738 803
739 804
740 #undef CFF_FIELD 805 #undef CFF_FIELD
741 #define CFF_FIELD( code, name, id, kind ) i++; 806 #define CFF_FIELD( code, name, id, kind ) i++;
742 #undef CFF_FIELD_DELTA 807 #undef CFF_FIELD_DELTA
743 #define CFF_FIELD_DELTA( code, name, max, id ) i++; 808 #define CFF_FIELD_DELTA( code, name, max, id ) i++;
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
850 clazz[i].array_max = 0; 915 clazz[i].array_max = 0;
851 clazz[i].count_offset = 0; 916 clazz[i].count_offset = 0;
852 clazz[i].id = 0; 917 clazz[i].id = 0;
853 918
854 919
855 #endif /* FT_DEBUG_LEVEL_TRACE */ 920 #endif /* FT_DEBUG_LEVEL_TRACE */
856 921
857 922
858 *output_class = clazz; 923 *output_class = clazz;
859 924
860 return CFF_Err_Ok; 925 return FT_Err_Ok;
861 } 926 }
862 927
863 928
864 #endif /* FT_CONFIG_OPTION_PIC */ 929 #endif /* FT_CONFIG_OPTION_PIC */
865 930
866 931
867 FT_LOCAL_DEF( FT_Error ) 932 FT_LOCAL_DEF( FT_Error )
868 cff_parser_run( CFF_Parser parser, 933 cff_parser_run( CFF_Parser parser,
869 FT_Byte* start, 934 FT_Byte* start,
870 FT_Byte* limit ) 935 FT_Byte* limit )
871 { 936 {
872 FT_Byte* p = start; 937 FT_Byte* p = start;
873 FT_Error error = CFF_Err_Ok; 938 FT_Error error = FT_Err_Ok;
874 FT_Library library = parser->library; 939 FT_Library library = parser->library;
875 FT_UNUSED( library ); 940 FT_UNUSED( library );
876 941
877 942
878 parser->top = parser->stack; 943 parser->top = parser->stack;
879 parser->start = start; 944 parser->start = start;
880 parser->limit = limit; 945 parser->limit = limit;
881 parser->cursor = start; 946 parser->cursor = start;
882 947
883 while ( p < limit ) 948 while ( p < limit )
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
937 { 1002 {
938 /* two byte operator */ 1003 /* two byte operator */
939 p++; 1004 p++;
940 if ( p >= limit ) 1005 if ( p >= limit )
941 goto Syntax_Error; 1006 goto Syntax_Error;
942 1007
943 code = 0x100 | p[0]; 1008 code = 0x100 | p[0];
944 } 1009 }
945 code = code | parser->object_code; 1010 code = code | parser->object_code;
946 1011
947 for ( field = FT_CFF_FIELD_HANDLERS_GET; field->kind; field++ ) 1012 for ( field = CFF_FIELD_HANDLERS_GET; field->kind; field++ )
948 { 1013 {
949 if ( field->code == (FT_Int)code ) 1014 if ( field->code == (FT_Int)code )
950 { 1015 {
951 /* we found our field's handler; read it */ 1016 /* we found our field's handler; read it */
952 FT_Long val; 1017 FT_Long val;
953 FT_Byte* q = (FT_Byte*)parser->object + field->offset; 1018 FT_Byte* q = (FT_Byte*)parser->object + field->offset;
954 1019
955 1020
956 #ifdef FT_DEBUG_LEVEL_TRACE 1021 #ifdef FT_DEBUG_LEVEL_TRACE
957 FT_TRACE4(( " %s", field->id )); 1022 FT_TRACE4(( " %s", field->id ));
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
1089 /* clear stack */ 1154 /* clear stack */
1090 parser->top = parser->stack; 1155 parser->top = parser->stack;
1091 } 1156 }
1092 p++; 1157 p++;
1093 } 1158 }
1094 1159
1095 Exit: 1160 Exit:
1096 return error; 1161 return error;
1097 1162
1098 Stack_Overflow: 1163 Stack_Overflow:
1099 error = CFF_Err_Invalid_Argument; 1164 error = FT_THROW( Invalid_Argument );
1100 goto Exit; 1165 goto Exit;
1101 1166
1102 Stack_Underflow: 1167 Stack_Underflow:
1103 error = CFF_Err_Invalid_Argument; 1168 error = FT_THROW( Invalid_Argument );
1104 goto Exit; 1169 goto Exit;
1105 1170
1106 Syntax_Error: 1171 Syntax_Error:
1107 error = CFF_Err_Invalid_Argument; 1172 error = FT_THROW( Invalid_Argument );
1108 goto Exit; 1173 goto Exit;
1109 } 1174 }
1110 1175
1111 1176
1112 /* END */ 1177 /* END */
OLDNEW
« no previous file with comments | « src/cff/cffobjs.c ('k') | src/cff/cffpic.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698