1 | /***************************************************************************/ |
2 | /* */ |
3 | /* cffparse.c */ |
4 | /* */ |
5 | /* CFF token stream parser (body) */ |
6 | /* */ |
7 | /* Copyright 1996-2018 by */ |
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 | #include <ft2build.h> |
20 | #include "cffparse.h" |
21 | #include FT_INTERNAL_STREAM_H |
22 | #include FT_INTERNAL_DEBUG_H |
23 | #include FT_INTERNAL_CALC_H |
24 | #include FT_INTERNAL_POSTSCRIPT_AUX_H |
25 | |
26 | #include "cfferrs.h" |
27 | #include "cffpic.h" |
28 | #include "cffload.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_cffparse |
39 | |
40 | |
41 | FT_LOCAL_DEF( FT_Error ) |
42 | cff_parser_init( CFF_Parser parser, |
43 | FT_UInt code, |
44 | void* object, |
45 | FT_Library library, |
46 | FT_UInt stackSize, |
47 | FT_UShort num_designs, |
48 | FT_UShort num_axes ) |
49 | { |
50 | FT_Memory memory = library->memory; /* for FT_NEW_ARRAY */ |
51 | FT_Error error; /* for FT_NEW_ARRAY */ |
52 | |
53 | |
54 | FT_ZERO( parser ); |
55 | |
56 | #if 0 |
57 | parser->top = parser->stack; |
58 | #endif |
59 | parser->object_code = code; |
60 | parser->object = object; |
61 | parser->library = library; |
62 | parser->num_designs = num_designs; |
63 | parser->num_axes = num_axes; |
64 | |
65 | /* allocate the stack buffer */ |
66 | if ( FT_NEW_ARRAY( parser->stack, stackSize ) ) |
67 | { |
68 | FT_FREE( parser->stack ); |
69 | goto Exit; |
70 | } |
71 | |
72 | parser->stackSize = stackSize; |
73 | parser->top = parser->stack; /* empty stack */ |
74 | |
75 | Exit: |
76 | return error; |
77 | } |
78 | |
79 | |
80 | FT_LOCAL_DEF( void ) |
81 | cff_parser_done( CFF_Parser parser ) |
82 | { |
83 | FT_Memory memory = parser->library->memory; /* for FT_FREE */ |
84 | |
85 | |
86 | FT_FREE( parser->stack ); |
87 | } |
88 | |
89 | |
90 | /* read an integer */ |
91 | static FT_Long |
92 | cff_parse_integer( FT_Byte* start, |
93 | FT_Byte* limit ) |
94 | { |
95 | FT_Byte* p = start; |
96 | FT_Int v = *p++; |
97 | FT_Long val = 0; |
98 | |
99 | |
100 | if ( v == 28 ) |
101 | { |
102 | if ( p + 2 > limit ) |
103 | goto Bad; |
104 | |
105 | val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] ); |
106 | } |
107 | else if ( v == 29 ) |
108 | { |
109 | if ( p + 4 > limit ) |
110 | goto Bad; |
111 | |
112 | val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) | |
113 | ( (FT_ULong)p[1] << 16 ) | |
114 | ( (FT_ULong)p[2] << 8 ) | |
115 | (FT_ULong)p[3] ); |
116 | } |
117 | else if ( v < 247 ) |
118 | { |
119 | val = v - 139; |
120 | } |
121 | else if ( v < 251 ) |
122 | { |
123 | if ( p + 1 > limit ) |
124 | goto Bad; |
125 | |
126 | val = ( v - 247 ) * 256 + p[0] + 108; |
127 | } |
128 | else |
129 | { |
130 | if ( p + 1 > limit ) |
131 | goto Bad; |
132 | |
133 | val = -( v - 251 ) * 256 - p[0] - 108; |
134 | } |
135 | |
136 | Exit: |
137 | return val; |
138 | |
139 | Bad: |
140 | val = 0; |
141 | FT_TRACE4(( "!!!END OF DATA:!!!" )); |
142 | goto Exit; |
143 | } |
144 | |
145 | |
146 | static const FT_Long power_tens[] = |
147 | { |
148 | 1L, |
149 | 10L, |
150 | 100L, |
151 | 1000L, |
152 | 10000L, |
153 | 100000L, |
154 | 1000000L, |
155 | 10000000L, |
156 | 100000000L, |
157 | 1000000000L |
158 | }; |
159 | |
160 | /* maximum values allowed for multiplying */ |
161 | /* with the corresponding `power_tens' element */ |
162 | static const FT_Long power_ten_limits[] = |
163 | { |
164 | FT_LONG_MAX / 1L, |
165 | FT_LONG_MAX / 10L, |
166 | FT_LONG_MAX / 100L, |
167 | FT_LONG_MAX / 1000L, |
168 | FT_LONG_MAX / 10000L, |
169 | FT_LONG_MAX / 100000L, |
170 | FT_LONG_MAX / 1000000L, |
171 | FT_LONG_MAX / 10000000L, |
172 | FT_LONG_MAX / 100000000L, |
173 | FT_LONG_MAX / 1000000000L, |
174 | }; |
175 | |
176 | |
177 | /* read a real */ |
178 | static FT_Fixed |
179 | cff_parse_real( FT_Byte* start, |
180 | FT_Byte* limit, |
181 | FT_Long power_ten, |
182 | FT_Long* scaling ) |
183 | { |
184 | FT_Byte* p = start; |
185 | FT_Int nib; |
186 | FT_UInt phase; |
187 | |
188 | FT_Long result, number, exponent; |
189 | FT_Int sign = 0, exponent_sign = 0, have_overflow = 0; |
190 | FT_Long exponent_add, integer_length, fraction_length; |
191 | |
192 | |
193 | if ( scaling ) |
194 | *scaling = 0; |
195 | |
196 | result = 0; |
197 | |
198 | number = 0; |
199 | exponent = 0; |
200 | |
201 | exponent_add = 0; |
202 | integer_length = 0; |
203 | fraction_length = 0; |
204 | |
205 | /* First of all, read the integer part. */ |
206 | phase = 4; |
207 | |
208 | for (;;) |
209 | { |
210 | /* If we entered this iteration with phase == 4, we need to */ |
211 | /* read a new byte. This also skips past the initial 0x1E. */ |
212 | if ( phase ) |
213 | { |
214 | p++; |
215 | |
216 | /* Make sure we don't read past the end. */ |
217 | if ( p >= limit ) |
218 | goto Bad; |
219 | } |
220 | |
221 | /* Get the nibble. */ |
222 | nib = (FT_Int)( p[0] >> phase ) & 0xF; |
223 | phase = 4 - phase; |
224 | |
225 | if ( nib == 0xE ) |
226 | sign = 1; |
227 | else if ( nib > 9 ) |
228 | break; |
229 | else |
230 | { |
231 | /* Increase exponent if we can't add the digit. */ |
232 | if ( number >= 0xCCCCCCCL ) |
233 | exponent_add++; |
234 | /* Skip leading zeros. */ |
235 | else if ( nib || number ) |
236 | { |
237 | integer_length++; |
238 | number = number * 10 + nib; |
239 | } |
240 | } |
241 | } |
242 | |
243 | /* Read fraction part, if any. */ |
244 | if ( nib == 0xA ) |
245 | for (;;) |
246 | { |
247 | /* If we entered this iteration with phase == 4, we need */ |
248 | /* to read a new byte. */ |
249 | if ( phase ) |
250 | { |
251 | p++; |
252 | |
253 | /* Make sure we don't read past the end. */ |
254 | if ( p >= limit ) |
255 | goto Bad; |
256 | } |
257 | |
258 | /* Get the nibble. */ |
259 | nib = ( p[0] >> phase ) & 0xF; |
260 | phase = 4 - phase; |
261 | if ( nib >= 10 ) |
262 | break; |
263 | |
264 | /* Skip leading zeros if possible. */ |
265 | if ( !nib && !number ) |
266 | exponent_add--; |
267 | /* Only add digit if we don't overflow. */ |
268 | else if ( number < 0xCCCCCCCL && fraction_length < 9 ) |
269 | { |
270 | fraction_length++; |
271 | number = number * 10 + nib; |
272 | } |
273 | } |
274 | |
275 | /* Read exponent, if any. */ |
276 | if ( nib == 12 ) |
277 | { |
278 | exponent_sign = 1; |
279 | nib = 11; |
280 | } |
281 | |
282 | if ( nib == 11 ) |
283 | { |
284 | for (;;) |
285 | { |
286 | /* If we entered this iteration with phase == 4, */ |
287 | /* we need to read a new byte. */ |
288 | if ( phase ) |
289 | { |
290 | p++; |
291 | |
292 | /* Make sure we don't read past the end. */ |
293 | if ( p >= limit ) |
294 | goto Bad; |
295 | } |
296 | |
297 | /* Get the nibble. */ |
298 | nib = ( p[0] >> phase ) & 0xF; |
299 | phase = 4 - phase; |
300 | if ( nib >= 10 ) |
301 | break; |
302 | |
303 | /* Arbitrarily limit exponent. */ |
304 | if ( exponent > 1000 ) |
305 | have_overflow = 1; |
306 | else |
307 | exponent = exponent * 10 + nib; |
308 | } |
309 | |
310 | if ( exponent_sign ) |
311 | exponent = -exponent; |
312 | } |
313 | |
314 | if ( !number ) |
315 | goto Exit; |
316 | |
317 | if ( have_overflow ) |
318 | { |
319 | if ( exponent_sign ) |
320 | goto Underflow; |
321 | else |
322 | goto Overflow; |
323 | } |
324 | |
325 | /* We don't check `power_ten' and `exponent_add'. */ |
326 | exponent += power_ten + exponent_add; |
327 | |
328 | if ( scaling ) |
329 | { |
330 | /* Only use `fraction_length'. */ |
331 | fraction_length += integer_length; |
332 | exponent += integer_length; |
333 | |
334 | if ( fraction_length <= 5 ) |
335 | { |
336 | if ( number > 0x7FFFL ) |
337 | { |
338 | result = FT_DivFix( number, 10 ); |
339 | *scaling = exponent - fraction_length + 1; |
340 | } |
341 | else |
342 | { |
343 | if ( exponent > 0 ) |
344 | { |
345 | FT_Long new_fraction_length, shift; |
346 | |
347 | |
348 | /* Make `scaling' as small as possible. */ |
349 | new_fraction_length = FT_MIN( exponent, 5 ); |
350 | shift = new_fraction_length - fraction_length; |
351 | |
352 | if ( shift > 0 ) |
353 | { |
354 | exponent -= new_fraction_length; |
355 | number *= power_tens[shift]; |
356 | if ( number > 0x7FFFL ) |
357 | { |
358 | number /= 10; |
359 | exponent += 1; |
360 | } |
361 | } |
362 | else |
363 | exponent -= fraction_length; |
364 | } |
365 | else |
366 | exponent -= fraction_length; |
367 | |
368 | result = (FT_Long)( (FT_ULong)number << 16 ); |
369 | *scaling = exponent; |
370 | } |
371 | } |
372 | else |
373 | { |
374 | if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL ) |
375 | { |
376 | result = FT_DivFix( number, power_tens[fraction_length - 4] ); |
377 | *scaling = exponent - 4; |
378 | } |
379 | else |
380 | { |
381 | result = FT_DivFix( number, power_tens[fraction_length - 5] ); |
382 | *scaling = exponent - 5; |
383 | } |
384 | } |
385 | } |
386 | else |
387 | { |
388 | integer_length += exponent; |
389 | fraction_length -= exponent; |
390 | |
391 | if ( integer_length > 5 ) |
392 | goto Overflow; |
393 | if ( integer_length < -5 ) |
394 | goto Underflow; |
395 | |
396 | /* Remove non-significant digits. */ |
397 | if ( integer_length < 0 ) |
398 | { |
399 | number /= power_tens[-integer_length]; |
400 | fraction_length += integer_length; |
401 | } |
402 | |
403 | /* this can only happen if exponent was non-zero */ |
404 | if ( fraction_length == 10 ) |
405 | { |
406 | number /= 10; |
407 | fraction_length -= 1; |
408 | } |
409 | |
410 | /* Convert into 16.16 format. */ |
411 | if ( fraction_length > 0 ) |
412 | { |
413 | if ( ( number / power_tens[fraction_length] ) > 0x7FFFL ) |
414 | goto Exit; |
415 | |
416 | result = FT_DivFix( number, power_tens[fraction_length] ); |
417 | } |
418 | else |
419 | { |
420 | number *= power_tens[-fraction_length]; |
421 | |
422 | if ( number > 0x7FFFL ) |
423 | goto Overflow; |
424 | |
425 | result = (FT_Long)( (FT_ULong)number << 16 ); |
426 | } |
427 | } |
428 | |
429 | Exit: |
430 | if ( sign ) |
431 | result = -result; |
432 | |
433 | return result; |
434 | |
435 | Overflow: |
436 | result = 0x7FFFFFFFL; |
437 | FT_TRACE4(( "!!!OVERFLOW:!!!" )); |
438 | goto Exit; |
439 | |
440 | Underflow: |
441 | result = 0; |
442 | FT_TRACE4(( "!!!UNDERFLOW:!!!" )); |
443 | goto Exit; |
444 | |
445 | Bad: |
446 | result = 0; |
447 | FT_TRACE4(( "!!!END OF DATA:!!!" )); |
448 | goto Exit; |
449 | } |
450 | |
451 | |
452 | /* read a number, either integer or real */ |
453 | FT_LOCAL_DEF( FT_Long ) |
454 | cff_parse_num( CFF_Parser parser, |
455 | FT_Byte** d ) |
456 | { |
457 | if ( **d == 30 ) |
458 | { |
459 | /* binary-coded decimal is truncated to integer */ |
460 | return cff_parse_real( *d, parser->limit, 0, NULL ) >> 16; |
461 | } |
462 | |
463 | else if ( **d == 255 ) |
464 | { |
465 | /* 16.16 fixed point is used internally for CFF2 blend results. */ |
466 | /* Since these are trusted values, a limit check is not needed. */ |
467 | |
468 | /* After the 255, 4 bytes give the number. */ |
469 | /* The blend value is converted to integer, with rounding; */ |
470 | /* due to the right-shift we don't need the lowest byte. */ |
471 | #if 0 |
472 | return (FT_Short)( |
473 | ( ( ( (FT_UInt32)*( d[0] + 1 ) << 24 ) | |
474 | ( (FT_UInt32)*( d[0] + 2 ) << 16 ) | |
475 | ( (FT_UInt32)*( d[0] + 3 ) << 8 ) | |
476 | (FT_UInt32)*( d[0] + 4 ) ) + 0x8000U ) >> 16 ); |
477 | #else |
478 | return (FT_Short)( |
479 | ( ( ( (FT_UInt32)*( d[0] + 1 ) << 16 ) | |
480 | ( (FT_UInt32)*( d[0] + 2 ) << 8 ) | |
481 | (FT_UInt32)*( d[0] + 3 ) ) + 0x80U ) >> 8 ); |
482 | #endif |
483 | } |
484 | |
485 | else |
486 | return cff_parse_integer( *d, parser->limit ); |
487 | } |
488 | |
489 | |
490 | /* read a floating point number, either integer or real */ |
491 | static FT_Fixed |
492 | do_fixed( CFF_Parser parser, |
493 | FT_Byte** d, |
494 | FT_Long scaling ) |
495 | { |
496 | if ( **d == 30 ) |
497 | return cff_parse_real( *d, parser->limit, scaling, NULL ); |
498 | else |
499 | { |
500 | FT_Long val = cff_parse_integer( *d, parser->limit ); |
501 | |
502 | |
503 | if ( scaling ) |
504 | { |
505 | if ( FT_ABS( val ) > power_ten_limits[scaling] ) |
506 | { |
507 | val = val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL; |
508 | goto Overflow; |
509 | } |
510 | |
511 | val *= power_tens[scaling]; |
512 | } |
513 | |
514 | if ( val > 0x7FFF ) |
515 | { |
516 | val = 0x7FFFFFFFL; |
517 | goto Overflow; |
518 | } |
519 | else if ( val < -0x7FFF ) |
520 | { |
521 | val = -0x7FFFFFFFL; |
522 | goto Overflow; |
523 | } |
524 | |
525 | return (FT_Long)( (FT_ULong)val << 16 ); |
526 | |
527 | Overflow: |
528 | FT_TRACE4(( "!!!OVERFLOW:!!!" )); |
529 | return val; |
530 | } |
531 | } |
532 | |
533 | |
534 | /* read a floating point number, either integer or real */ |
535 | static FT_Fixed |
536 | cff_parse_fixed( CFF_Parser parser, |
537 | FT_Byte** d ) |
538 | { |
539 | return do_fixed( parser, d, 0 ); |
540 | } |
541 | |
542 | |
543 | /* read a floating point number, either integer or real, */ |
544 | /* but return `10^scaling' times the number read in */ |
545 | static FT_Fixed |
546 | cff_parse_fixed_scaled( CFF_Parser parser, |
547 | FT_Byte** d, |
548 | FT_Long scaling ) |
549 | { |
550 | return do_fixed( parser, d, scaling ); |
551 | } |
552 | |
553 | |
554 | /* read a floating point number, either integer or real, */ |
555 | /* and return it as precise as possible -- `scaling' returns */ |
556 | /* the scaling factor (as a power of 10) */ |
557 | static FT_Fixed |
558 | cff_parse_fixed_dynamic( CFF_Parser parser, |
559 | FT_Byte** d, |
560 | FT_Long* scaling ) |
561 | { |
562 | FT_ASSERT( scaling ); |
563 | |
564 | if ( **d == 30 ) |
565 | return cff_parse_real( *d, parser->limit, 0, scaling ); |
566 | else |
567 | { |
568 | FT_Long number; |
569 | FT_Int integer_length; |
570 | |
571 | |
572 | number = cff_parse_integer( d[0], d[1] ); |
573 | |
574 | if ( number > 0x7FFFL ) |
575 | { |
576 | for ( integer_length = 5; integer_length < 10; integer_length++ ) |
577 | if ( number < power_tens[integer_length] ) |
578 | break; |
579 | |
580 | if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL ) |
581 | { |
582 | *scaling = integer_length - 4; |
583 | return FT_DivFix( number, power_tens[integer_length - 4] ); |
584 | } |
585 | else |
586 | { |
587 | *scaling = integer_length - 5; |
588 | return FT_DivFix( number, power_tens[integer_length - 5] ); |
589 | } |
590 | } |
591 | else |
592 | { |
593 | *scaling = 0; |
594 | return (FT_Long)( (FT_ULong)number << 16 ); |
595 | } |
596 | } |
597 | } |
598 | |
599 | |
600 | static FT_Error |
601 | cff_parse_font_matrix( CFF_Parser parser ) |
602 | { |
603 | CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; |
604 | FT_Matrix* matrix = &dict->font_matrix; |
605 | FT_Vector* offset = &dict->font_offset; |
606 | FT_ULong* upm = &dict->units_per_em; |
607 | FT_Byte** data = parser->stack; |
608 | FT_Error error = FT_ERR( Stack_Underflow ); |
609 | |
610 | |
611 | if ( parser->top >= parser->stack + 6 ) |
612 | { |
613 | FT_Fixed values[6]; |
614 | FT_Long scalings[6]; |
615 | |
616 | FT_Long min_scaling, max_scaling; |
617 | int i; |
618 | |
619 | |
620 | error = FT_Err_Ok; |
621 | |
622 | dict->has_font_matrix = TRUE; |
623 | |
624 | /* We expect a well-formed font matrix, this is, the matrix elements */ |
625 | /* `xx' and `yy' are of approximately the same magnitude. To avoid */ |
626 | /* loss of precision, we use the magnitude of the largest matrix */ |
627 | /* element to scale all other elements. The scaling factor is then */ |
628 | /* contained in the `units_per_em' value. */ |
629 | |
630 | max_scaling = FT_LONG_MIN; |
631 | min_scaling = FT_LONG_MAX; |
632 | |
633 | for ( i = 0; i < 6; i++ ) |
634 | { |
635 | values[i] = cff_parse_fixed_dynamic( parser, data++, &scalings[i] ); |
636 | if ( values[i] ) |
637 | { |
638 | if ( scalings[i] > max_scaling ) |
639 | max_scaling = scalings[i]; |
640 | if ( scalings[i] < min_scaling ) |
641 | min_scaling = scalings[i]; |
642 | } |
643 | } |
644 | |
645 | if ( max_scaling < -9 || |
646 | max_scaling > 0 || |
647 | ( max_scaling - min_scaling ) < 0 || |
648 | ( max_scaling - min_scaling ) > 9 ) |
649 | { |
650 | /* Return default matrix in case of unlikely values. */ |
651 | |
652 | FT_TRACE1(( "cff_parse_font_matrix:" |
653 | " strange scaling values (minimum %d, maximum %d),\n" |
654 | " " |
655 | " using default matrix\n" , min_scaling, max_scaling )); |
656 | |
657 | matrix->xx = 0x10000L; |
658 | matrix->yx = 0; |
659 | matrix->xy = 0; |
660 | matrix->yy = 0x10000L; |
661 | offset->x = 0; |
662 | offset->y = 0; |
663 | *upm = 1; |
664 | |
665 | goto Exit; |
666 | } |
667 | |
668 | for ( i = 0; i < 6; i++ ) |
669 | { |
670 | FT_Fixed value = values[i]; |
671 | FT_Long divisor, half_divisor; |
672 | |
673 | |
674 | if ( !value ) |
675 | continue; |
676 | |
677 | divisor = power_tens[max_scaling - scalings[i]]; |
678 | half_divisor = divisor >> 1; |
679 | |
680 | if ( value < 0 ) |
681 | { |
682 | if ( FT_LONG_MIN + half_divisor < value ) |
683 | values[i] = ( value - half_divisor ) / divisor; |
684 | else |
685 | values[i] = FT_LONG_MIN / divisor; |
686 | } |
687 | else |
688 | { |
689 | if ( FT_LONG_MAX - half_divisor > value ) |
690 | values[i] = ( value + half_divisor ) / divisor; |
691 | else |
692 | values[i] = FT_LONG_MAX / divisor; |
693 | } |
694 | } |
695 | |
696 | matrix->xx = values[0]; |
697 | matrix->yx = values[1]; |
698 | matrix->xy = values[2]; |
699 | matrix->yy = values[3]; |
700 | offset->x = values[4]; |
701 | offset->y = values[5]; |
702 | |
703 | *upm = (FT_ULong)power_tens[-max_scaling]; |
704 | |
705 | FT_TRACE4(( " [%f %f %f %f %f %f]\n" , |
706 | (double)matrix->xx / *upm / 65536, |
707 | (double)matrix->xy / *upm / 65536, |
708 | (double)matrix->yx / *upm / 65536, |
709 | (double)matrix->yy / *upm / 65536, |
710 | (double)offset->x / *upm / 65536, |
711 | (double)offset->y / *upm / 65536 )); |
712 | } |
713 | |
714 | Exit: |
715 | return error; |
716 | } |
717 | |
718 | |
719 | static FT_Error |
720 | cff_parse_font_bbox( CFF_Parser parser ) |
721 | { |
722 | CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; |
723 | FT_BBox* bbox = &dict->font_bbox; |
724 | FT_Byte** data = parser->stack; |
725 | FT_Error error; |
726 | |
727 | |
728 | error = FT_ERR( Stack_Underflow ); |
729 | |
730 | if ( parser->top >= parser->stack + 4 ) |
731 | { |
732 | bbox->xMin = FT_RoundFix( cff_parse_fixed( parser, data++ ) ); |
733 | bbox->yMin = FT_RoundFix( cff_parse_fixed( parser, data++ ) ); |
734 | bbox->xMax = FT_RoundFix( cff_parse_fixed( parser, data++ ) ); |
735 | bbox->yMax = FT_RoundFix( cff_parse_fixed( parser, data ) ); |
736 | error = FT_Err_Ok; |
737 | |
738 | FT_TRACE4(( " [%d %d %d %d]\n" , |
739 | bbox->xMin / 65536, |
740 | bbox->yMin / 65536, |
741 | bbox->xMax / 65536, |
742 | bbox->yMax / 65536 )); |
743 | } |
744 | |
745 | return error; |
746 | } |
747 | |
748 | |
749 | static FT_Error |
750 | cff_parse_private_dict( CFF_Parser parser ) |
751 | { |
752 | CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; |
753 | FT_Byte** data = parser->stack; |
754 | FT_Error error; |
755 | |
756 | |
757 | error = FT_ERR( Stack_Underflow ); |
758 | |
759 | if ( parser->top >= parser->stack + 2 ) |
760 | { |
761 | FT_Long tmp; |
762 | |
763 | |
764 | tmp = cff_parse_num( parser, data++ ); |
765 | if ( tmp < 0 ) |
766 | { |
767 | FT_ERROR(( "cff_parse_private_dict: Invalid dictionary size\n" )); |
768 | error = FT_THROW( Invalid_File_Format ); |
769 | goto Fail; |
770 | } |
771 | dict->private_size = (FT_ULong)tmp; |
772 | |
773 | tmp = cff_parse_num( parser, data ); |
774 | if ( tmp < 0 ) |
775 | { |
776 | FT_ERROR(( "cff_parse_private_dict: Invalid dictionary offset\n" )); |
777 | error = FT_THROW( Invalid_File_Format ); |
778 | goto Fail; |
779 | } |
780 | dict->private_offset = (FT_ULong)tmp; |
781 | |
782 | FT_TRACE4(( " %lu %lu\n" , |
783 | dict->private_size, dict->private_offset )); |
784 | |
785 | error = FT_Err_Ok; |
786 | } |
787 | |
788 | Fail: |
789 | return error; |
790 | } |
791 | |
792 | |
793 | /* The `MultipleMaster' operator comes before any */ |
794 | /* top DICT operators that contain T2 charstrings. */ |
795 | |
796 | static FT_Error |
797 | cff_parse_multiple_master( CFF_Parser parser ) |
798 | { |
799 | CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; |
800 | FT_Error error; |
801 | |
802 | |
803 | #ifdef FT_DEBUG_LEVEL_TRACE |
804 | /* beautify tracing message */ |
805 | if ( ft_trace_levels[FT_COMPONENT] < 4 ) |
806 | FT_TRACE1(( "Multiple Master CFFs not supported yet," |
807 | " handling first master design only\n" )); |
808 | else |
809 | FT_TRACE1(( " (not supported yet," |
810 | " handling first master design only)\n" )); |
811 | #endif |
812 | |
813 | error = FT_ERR( Stack_Underflow ); |
814 | |
815 | /* currently, we handle only the first argument */ |
816 | if ( parser->top >= parser->stack + 5 ) |
817 | { |
818 | FT_Long num_designs = cff_parse_num( parser, parser->stack ); |
819 | |
820 | |
821 | if ( num_designs > 16 || num_designs < 2 ) |
822 | { |
823 | FT_ERROR(( "cff_parse_multiple_master:" |
824 | " Invalid number of designs\n" )); |
825 | error = FT_THROW( Invalid_File_Format ); |
826 | } |
827 | else |
828 | { |
829 | dict->num_designs = (FT_UShort)num_designs; |
830 | dict->num_axes = (FT_UShort)( parser->top - parser->stack - 4 ); |
831 | |
832 | parser->num_designs = dict->num_designs; |
833 | parser->num_axes = dict->num_axes; |
834 | |
835 | error = FT_Err_Ok; |
836 | } |
837 | } |
838 | |
839 | return error; |
840 | } |
841 | |
842 | |
843 | static FT_Error |
844 | cff_parse_cid_ros( CFF_Parser parser ) |
845 | { |
846 | CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; |
847 | FT_Byte** data = parser->stack; |
848 | FT_Error error; |
849 | |
850 | |
851 | error = FT_ERR( Stack_Underflow ); |
852 | |
853 | if ( parser->top >= parser->stack + 3 ) |
854 | { |
855 | dict->cid_registry = (FT_UInt)cff_parse_num( parser, data++ ); |
856 | dict->cid_ordering = (FT_UInt)cff_parse_num( parser, data++ ); |
857 | if ( **data == 30 ) |
858 | FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" )); |
859 | dict->cid_supplement = cff_parse_num( parser, data ); |
860 | if ( dict->cid_supplement < 0 ) |
861 | FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n" , |
862 | dict->cid_supplement )); |
863 | error = FT_Err_Ok; |
864 | |
865 | FT_TRACE4(( " %d %d %d\n" , |
866 | dict->cid_registry, |
867 | dict->cid_ordering, |
868 | dict->cid_supplement )); |
869 | } |
870 | |
871 | return error; |
872 | } |
873 | |
874 | |
875 | static FT_Error |
876 | cff_parse_vsindex( CFF_Parser parser ) |
877 | { |
878 | /* vsindex operator can only be used in a Private DICT */ |
879 | CFF_Private priv = (CFF_Private)parser->object; |
880 | FT_Byte** data = parser->stack; |
881 | CFF_Blend blend; |
882 | FT_Error error; |
883 | |
884 | |
885 | if ( !priv || !priv->subfont ) |
886 | { |
887 | error = FT_THROW( Invalid_File_Format ); |
888 | goto Exit; |
889 | } |
890 | |
891 | blend = &priv->subfont->blend; |
892 | |
893 | if ( blend->usedBV ) |
894 | { |
895 | FT_ERROR(( " cff_parse_vsindex: vsindex not allowed after blend\n" )); |
896 | error = FT_THROW( Syntax_Error ); |
897 | goto Exit; |
898 | } |
899 | |
900 | priv->vsindex = (FT_UInt)cff_parse_num( parser, data++ ); |
901 | |
902 | FT_TRACE4(( " %d\n" , priv->vsindex )); |
903 | |
904 | error = FT_Err_Ok; |
905 | |
906 | Exit: |
907 | return error; |
908 | } |
909 | |
910 | |
911 | static FT_Error |
912 | cff_parse_blend( CFF_Parser parser ) |
913 | { |
914 | /* blend operator can only be used in a Private DICT */ |
915 | CFF_Private priv = (CFF_Private)parser->object; |
916 | CFF_SubFont subFont; |
917 | CFF_Blend blend; |
918 | FT_UInt numBlends; |
919 | FT_Error error; |
920 | |
921 | |
922 | if ( !priv || !priv->subfont ) |
923 | { |
924 | error = FT_THROW( Invalid_File_Format ); |
925 | goto Exit; |
926 | } |
927 | |
928 | subFont = priv->subfont; |
929 | blend = &subFont->blend; |
930 | |
931 | if ( cff_blend_check_vector( blend, |
932 | priv->vsindex, |
933 | subFont->lenNDV, |
934 | subFont->NDV ) ) |
935 | { |
936 | error = cff_blend_build_vector( blend, |
937 | priv->vsindex, |
938 | subFont->lenNDV, |
939 | subFont->NDV ); |
940 | if ( error ) |
941 | goto Exit; |
942 | } |
943 | |
944 | numBlends = (FT_UInt)cff_parse_num( parser, parser->top - 1 ); |
945 | if ( numBlends > parser->stackSize ) |
946 | { |
947 | FT_ERROR(( "cff_parse_blend: Invalid number of blends\n" )); |
948 | error = FT_THROW( Invalid_File_Format ); |
949 | goto Exit; |
950 | } |
951 | |
952 | FT_TRACE4(( " %d value%s blended\n" , |
953 | numBlends, |
954 | numBlends == 1 ? "" : "s" )); |
955 | |
956 | error = cff_blend_doBlend( subFont, parser, numBlends ); |
957 | |
958 | blend->usedBV = TRUE; |
959 | |
960 | Exit: |
961 | return error; |
962 | } |
963 | |
964 | |
965 | /* maxstack operator increases parser and operand stacks for CFF2 */ |
966 | static FT_Error |
967 | cff_parse_maxstack( CFF_Parser parser ) |
968 | { |
969 | /* maxstack operator can only be used in a Top DICT */ |
970 | CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; |
971 | FT_Byte** data = parser->stack; |
972 | FT_Error error = FT_Err_Ok; |
973 | |
974 | |
975 | if ( !dict ) |
976 | { |
977 | error = FT_THROW( Invalid_File_Format ); |
978 | goto Exit; |
979 | } |
980 | |
981 | dict->maxstack = (FT_UInt)cff_parse_num( parser, data++ ); |
982 | if ( dict->maxstack > CFF2_MAX_STACK ) |
983 | dict->maxstack = CFF2_MAX_STACK; |
984 | if ( dict->maxstack < CFF2_DEFAULT_STACK ) |
985 | dict->maxstack = CFF2_DEFAULT_STACK; |
986 | |
987 | FT_TRACE4(( " %d\n" , dict->maxstack )); |
988 | |
989 | Exit: |
990 | return error; |
991 | } |
992 | |
993 | |
994 | #define CFF_FIELD_NUM( code, name, id ) \ |
995 | CFF_FIELD( code, name, id, cff_kind_num ) |
996 | #define CFF_FIELD_FIXED( code, name, id ) \ |
997 | CFF_FIELD( code, name, id, cff_kind_fixed ) |
998 | #define CFF_FIELD_FIXED_1000( code, name, id ) \ |
999 | CFF_FIELD( code, name, id, cff_kind_fixed_thousand ) |
1000 | #define CFF_FIELD_STRING( code, name, id ) \ |
1001 | CFF_FIELD( code, name, id, cff_kind_string ) |
1002 | #define CFF_FIELD_BOOL( code, name, id ) \ |
1003 | CFF_FIELD( code, name, id, cff_kind_bool ) |
1004 | |
1005 | |
1006 | #ifndef FT_CONFIG_OPTION_PIC |
1007 | |
1008 | |
1009 | #undef CFF_FIELD |
1010 | #undef CFF_FIELD_DELTA |
1011 | |
1012 | |
1013 | #ifndef FT_DEBUG_LEVEL_TRACE |
1014 | |
1015 | |
1016 | #define CFF_FIELD_CALLBACK( code, name, id ) \ |
1017 | { \ |
1018 | cff_kind_callback, \ |
1019 | code | CFFCODE, \ |
1020 | 0, 0, \ |
1021 | cff_parse_ ## name, \ |
1022 | 0, 0 \ |
1023 | }, |
1024 | |
1025 | #define CFF_FIELD_BLEND( code, id ) \ |
1026 | { \ |
1027 | cff_kind_blend, \ |
1028 | code | CFFCODE, \ |
1029 | 0, 0, \ |
1030 | cff_parse_blend, \ |
1031 | 0, 0 \ |
1032 | }, |
1033 | |
1034 | #define CFF_FIELD( code, name, id, kind ) \ |
1035 | { \ |
1036 | kind, \ |
1037 | code | CFFCODE, \ |
1038 | FT_FIELD_OFFSET( name ), \ |
1039 | FT_FIELD_SIZE( name ), \ |
1040 | 0, 0, 0 \ |
1041 | }, |
1042 | |
1043 | #define CFF_FIELD_DELTA( code, name, max, id ) \ |
1044 | { \ |
1045 | cff_kind_delta, \ |
1046 | code | CFFCODE, \ |
1047 | FT_FIELD_OFFSET( name ), \ |
1048 | FT_FIELD_SIZE_DELTA( name ), \ |
1049 | 0, \ |
1050 | max, \ |
1051 | FT_FIELD_OFFSET( num_ ## name ) \ |
1052 | }, |
1053 | |
1054 | static const CFF_Field_Handler cff_field_handlers[] = |
1055 | { |
1056 | |
1057 | #include "cfftoken.h" |
1058 | |
1059 | { 0, 0, 0, 0, 0, 0, 0 } |
1060 | }; |
1061 | |
1062 | |
1063 | #else /* FT_DEBUG_LEVEL_TRACE */ |
1064 | |
1065 | |
1066 | |
1067 | #define CFF_FIELD_CALLBACK( code, name, id ) \ |
1068 | { \ |
1069 | cff_kind_callback, \ |
1070 | code | CFFCODE, \ |
1071 | 0, 0, \ |
1072 | cff_parse_ ## name, \ |
1073 | 0, 0, \ |
1074 | id \ |
1075 | }, |
1076 | |
1077 | #define CFF_FIELD_BLEND( code, id ) \ |
1078 | { \ |
1079 | cff_kind_blend, \ |
1080 | code | CFFCODE, \ |
1081 | 0, 0, \ |
1082 | cff_parse_blend, \ |
1083 | 0, 0, \ |
1084 | id \ |
1085 | }, |
1086 | |
1087 | #define CFF_FIELD( code, name, id, kind ) \ |
1088 | { \ |
1089 | kind, \ |
1090 | code | CFFCODE, \ |
1091 | FT_FIELD_OFFSET( name ), \ |
1092 | FT_FIELD_SIZE( name ), \ |
1093 | 0, 0, 0, \ |
1094 | id \ |
1095 | }, |
1096 | |
1097 | #define CFF_FIELD_DELTA( code, name, max, id ) \ |
1098 | { \ |
1099 | cff_kind_delta, \ |
1100 | code | CFFCODE, \ |
1101 | FT_FIELD_OFFSET( name ), \ |
1102 | FT_FIELD_SIZE_DELTA( name ), \ |
1103 | 0, \ |
1104 | max, \ |
1105 | FT_FIELD_OFFSET( num_ ## name ), \ |
1106 | id \ |
1107 | }, |
1108 | |
1109 | static const CFF_Field_Handler cff_field_handlers[] = |
1110 | { |
1111 | |
1112 | #include "cfftoken.h" |
1113 | |
1114 | { 0, 0, 0, 0, 0, 0, 0, 0 } |
1115 | }; |
1116 | |
1117 | |
1118 | #endif /* FT_DEBUG_LEVEL_TRACE */ |
1119 | |
1120 | |
1121 | #else /* FT_CONFIG_OPTION_PIC */ |
1122 | |
1123 | |
1124 | void |
1125 | FT_Destroy_Class_cff_field_handlers( FT_Library library, |
1126 | CFF_Field_Handler* clazz ) |
1127 | { |
1128 | FT_Memory memory = library->memory; |
1129 | |
1130 | |
1131 | if ( clazz ) |
1132 | FT_FREE( clazz ); |
1133 | } |
1134 | |
1135 | |
1136 | FT_Error |
1137 | FT_Create_Class_cff_field_handlers( FT_Library library, |
1138 | CFF_Field_Handler** output_class ) |
1139 | { |
1140 | CFF_Field_Handler* clazz = NULL; |
1141 | FT_Error error; |
1142 | FT_Memory memory = library->memory; |
1143 | |
1144 | int i = 0; |
1145 | |
1146 | |
1147 | #undef CFF_FIELD |
1148 | #define CFF_FIELD( code, name, id, kind ) i++; |
1149 | #undef CFF_FIELD_DELTA |
1150 | #define CFF_FIELD_DELTA( code, name, max, id ) i++; |
1151 | #undef CFF_FIELD_CALLBACK |
1152 | #define CFF_FIELD_CALLBACK( code, name, id ) i++; |
1153 | #undef CFF_FIELD_BLEND |
1154 | #define CFF_FIELD_BLEND( code, id ) i++; |
1155 | |
1156 | #include "cfftoken.h" |
1157 | |
1158 | i++; /* { 0, 0, 0, 0, 0, 0, 0 } */ |
1159 | |
1160 | if ( FT_ALLOC( clazz, sizeof ( CFF_Field_Handler ) * i ) ) |
1161 | return error; |
1162 | |
1163 | i = 0; |
1164 | |
1165 | |
1166 | #ifndef FT_DEBUG_LEVEL_TRACE |
1167 | |
1168 | |
1169 | #undef CFF_FIELD_CALLBACK |
1170 | #define CFF_FIELD_CALLBACK( code_, name_, id_ ) \ |
1171 | clazz[i].kind = cff_kind_callback; \ |
1172 | clazz[i].code = code_ | CFFCODE; \ |
1173 | clazz[i].offset = 0; \ |
1174 | clazz[i].size = 0; \ |
1175 | clazz[i].reader = cff_parse_ ## name_; \ |
1176 | clazz[i].array_max = 0; \ |
1177 | clazz[i].count_offset = 0; \ |
1178 | i++; |
1179 | |
1180 | #undef CFF_FIELD |
1181 | #define CFF_FIELD( code_, name_, id_, kind_ ) \ |
1182 | clazz[i].kind = kind_; \ |
1183 | clazz[i].code = code_ | CFFCODE; \ |
1184 | clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ |
1185 | clazz[i].size = FT_FIELD_SIZE( name_ ); \ |
1186 | clazz[i].reader = 0; \ |
1187 | clazz[i].array_max = 0; \ |
1188 | clazz[i].count_offset = 0; \ |
1189 | i++; \ |
1190 | |
1191 | #undef CFF_FIELD_DELTA |
1192 | #define CFF_FIELD_DELTA( code_, name_, max_, id_ ) \ |
1193 | clazz[i].kind = cff_kind_delta; \ |
1194 | clazz[i].code = code_ | CFFCODE; \ |
1195 | clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ |
1196 | clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \ |
1197 | clazz[i].reader = 0; \ |
1198 | clazz[i].array_max = max_; \ |
1199 | clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \ |
1200 | i++; |
1201 | |
1202 | #undef CFF_FIELD_BLEND |
1203 | #define CFF_FIELD_BLEND( code_, id_ ) \ |
1204 | clazz[i].kind = cff_kind_blend; \ |
1205 | clazz[i].code = code_ | CFFCODE; \ |
1206 | clazz[i].offset = 0; \ |
1207 | clazz[i].size = 0; \ |
1208 | clazz[i].reader = cff_parse_blend; \ |
1209 | clazz[i].array_max = 0; \ |
1210 | clazz[i].count_offset = 0; \ |
1211 | i++; |
1212 | |
1213 | #include "cfftoken.h" |
1214 | |
1215 | clazz[i].kind = 0; |
1216 | clazz[i].code = 0; |
1217 | clazz[i].offset = 0; |
1218 | clazz[i].size = 0; |
1219 | clazz[i].reader = 0; |
1220 | clazz[i].array_max = 0; |
1221 | clazz[i].count_offset = 0; |
1222 | |
1223 | |
1224 | #else /* FT_DEBUG_LEVEL_TRACE */ |
1225 | |
1226 | |
1227 | #undef CFF_FIELD_CALLBACK |
1228 | #define CFF_FIELD_CALLBACK( code_, name_, id_ ) \ |
1229 | clazz[i].kind = cff_kind_callback; \ |
1230 | clazz[i].code = code_ | CFFCODE; \ |
1231 | clazz[i].offset = 0; \ |
1232 | clazz[i].size = 0; \ |
1233 | clazz[i].reader = cff_parse_ ## name_; \ |
1234 | clazz[i].array_max = 0; \ |
1235 | clazz[i].count_offset = 0; \ |
1236 | clazz[i].id = id_; \ |
1237 | i++; |
1238 | |
1239 | #undef CFF_FIELD |
1240 | #define CFF_FIELD( code_, name_, id_, kind_ ) \ |
1241 | clazz[i].kind = kind_; \ |
1242 | clazz[i].code = code_ | CFFCODE; \ |
1243 | clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ |
1244 | clazz[i].size = FT_FIELD_SIZE( name_ ); \ |
1245 | clazz[i].reader = 0; \ |
1246 | clazz[i].array_max = 0; \ |
1247 | clazz[i].count_offset = 0; \ |
1248 | clazz[i].id = id_; \ |
1249 | i++; \ |
1250 | |
1251 | #undef CFF_FIELD_DELTA |
1252 | #define CFF_FIELD_DELTA( code_, name_, max_, id_ ) \ |
1253 | clazz[i].kind = cff_kind_delta; \ |
1254 | clazz[i].code = code_ | CFFCODE; \ |
1255 | clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ |
1256 | clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \ |
1257 | clazz[i].reader = 0; \ |
1258 | clazz[i].array_max = max_; \ |
1259 | clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \ |
1260 | clazz[i].id = id_; \ |
1261 | i++; |
1262 | |
1263 | #undef CFF_FIELD_BLEND |
1264 | #define CFF_FIELD_BLEND( code_, id_ ) \ |
1265 | clazz[i].kind = cff_kind_blend; \ |
1266 | clazz[i].code = code_ | CFFCODE; \ |
1267 | clazz[i].offset = 0; \ |
1268 | clazz[i].size = 0; \ |
1269 | clazz[i].reader = cff_parse_blend; \ |
1270 | clazz[i].array_max = 0; \ |
1271 | clazz[i].count_offset = 0; \ |
1272 | clazz[i].id = id_; \ |
1273 | i++; |
1274 | |
1275 | #include "cfftoken.h" |
1276 | |
1277 | clazz[i].kind = 0; |
1278 | clazz[i].code = 0; |
1279 | clazz[i].offset = 0; |
1280 | clazz[i].size = 0; |
1281 | clazz[i].reader = 0; |
1282 | clazz[i].array_max = 0; |
1283 | clazz[i].count_offset = 0; |
1284 | clazz[i].id = 0; |
1285 | |
1286 | |
1287 | #endif /* FT_DEBUG_LEVEL_TRACE */ |
1288 | |
1289 | |
1290 | *output_class = clazz; |
1291 | |
1292 | return FT_Err_Ok; |
1293 | } |
1294 | |
1295 | |
1296 | #endif /* FT_CONFIG_OPTION_PIC */ |
1297 | |
1298 | |
1299 | FT_LOCAL_DEF( FT_Error ) |
1300 | cff_parser_run( CFF_Parser parser, |
1301 | FT_Byte* start, |
1302 | FT_Byte* limit ) |
1303 | { |
1304 | #ifdef CFF_CONFIG_OPTION_OLD_ENGINE |
1305 | PSAux_Service psaux; |
1306 | #endif |
1307 | |
1308 | FT_Byte* p = start; |
1309 | FT_Error error = FT_Err_Ok; |
1310 | FT_Library library = parser->library; |
1311 | |
1312 | FT_UNUSED( library ); |
1313 | |
1314 | |
1315 | parser->top = parser->stack; |
1316 | parser->start = start; |
1317 | parser->limit = limit; |
1318 | parser->cursor = start; |
1319 | |
1320 | while ( p < limit ) |
1321 | { |
1322 | FT_UInt v = *p; |
1323 | |
1324 | /* Opcode 31 is legacy MM T2 operator, not a number. */ |
1325 | /* Opcode 255 is reserved and should not appear in fonts; */ |
1326 | /* it is used internally for CFF2 blends. */ |
1327 | if ( v >= 27 && v != 31 && v != 255 ) |
1328 | { |
1329 | /* it's a number; we will push its position on the stack */ |
1330 | if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize ) |
1331 | goto Stack_Overflow; |
1332 | |
1333 | *parser->top++ = p; |
1334 | |
1335 | /* now, skip it */ |
1336 | if ( v == 30 ) |
1337 | { |
1338 | /* skip real number */ |
1339 | p++; |
1340 | for (;;) |
1341 | { |
1342 | /* An unterminated floating point number at the */ |
1343 | /* end of a dictionary is invalid but harmless. */ |
1344 | if ( p >= limit ) |
1345 | goto Exit; |
1346 | v = p[0] >> 4; |
1347 | if ( v == 15 ) |
1348 | break; |
1349 | v = p[0] & 0xF; |
1350 | if ( v == 15 ) |
1351 | break; |
1352 | p++; |
1353 | } |
1354 | } |
1355 | else if ( v == 28 ) |
1356 | p += 2; |
1357 | else if ( v == 29 ) |
1358 | p += 4; |
1359 | else if ( v > 246 ) |
1360 | p += 1; |
1361 | } |
1362 | #ifdef CFF_CONFIG_OPTION_OLD_ENGINE |
1363 | else if ( v == 31 ) |
1364 | { |
1365 | /* a Type 2 charstring */ |
1366 | |
1367 | CFF_Decoder decoder; |
1368 | CFF_FontRec cff_rec; |
1369 | FT_Byte* charstring_base; |
1370 | FT_ULong charstring_len; |
1371 | |
1372 | FT_Fixed* stack; |
1373 | FT_Byte* q; |
1374 | |
1375 | |
1376 | charstring_base = ++p; |
1377 | |
1378 | /* search `endchar' operator */ |
1379 | for (;;) |
1380 | { |
1381 | if ( p >= limit ) |
1382 | goto Exit; |
1383 | if ( *p == 14 ) |
1384 | break; |
1385 | p++; |
1386 | } |
1387 | |
1388 | charstring_len = (FT_ULong)( p - charstring_base ) + 1; |
1389 | |
1390 | /* construct CFF_Decoder object */ |
1391 | FT_ZERO( &decoder ); |
1392 | FT_ZERO( &cff_rec ); |
1393 | |
1394 | cff_rec.top_font.font_dict.num_designs = parser->num_designs; |
1395 | cff_rec.top_font.font_dict.num_axes = parser->num_axes; |
1396 | decoder.cff = &cff_rec; |
1397 | |
1398 | psaux = (PSAux_Service)FT_Get_Module_Interface( library, "psaux" ); |
1399 | if ( !psaux ) |
1400 | { |
1401 | FT_ERROR(( "cff_parser_run: cannot access `psaux' module\n" )); |
1402 | error = FT_THROW( Missing_Module ); |
1403 | goto Exit; |
1404 | } |
1405 | |
1406 | error = psaux->cff_decoder_funcs->parse_charstrings_old( |
1407 | &decoder, charstring_base, charstring_len, 1 ); |
1408 | |
1409 | /* Now copy the stack data in the temporary decoder object, */ |
1410 | /* converting it back to charstring number representations */ |
1411 | /* (this is ugly, I know). */ |
1412 | /* */ |
1413 | /* We overwrite the original top DICT charstring under the */ |
1414 | /* assumption that the charstring representation of the result */ |
1415 | /* of `cff_decoder_parse_charstrings' is shorter, which should */ |
1416 | /* be always true. */ |
1417 | |
1418 | q = charstring_base - 1; |
1419 | stack = decoder.stack; |
1420 | |
1421 | while ( stack < decoder.top ) |
1422 | { |
1423 | FT_ULong num; |
1424 | FT_Bool neg; |
1425 | |
1426 | |
1427 | if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize ) |
1428 | goto Stack_Overflow; |
1429 | |
1430 | *parser->top++ = q; |
1431 | |
1432 | if ( *stack < 0 ) |
1433 | { |
1434 | num = (FT_ULong)-*stack; |
1435 | neg = 1; |
1436 | } |
1437 | else |
1438 | { |
1439 | num = (FT_ULong)*stack; |
1440 | neg = 0; |
1441 | } |
1442 | |
1443 | if ( num & 0xFFFFU ) |
1444 | { |
1445 | if ( neg ) |
1446 | num = (FT_ULong)-num; |
1447 | |
1448 | *q++ = 255; |
1449 | *q++ = ( num & 0xFF000000U ) >> 24; |
1450 | *q++ = ( num & 0x00FF0000U ) >> 16; |
1451 | *q++ = ( num & 0x0000FF00U ) >> 8; |
1452 | *q++ = num & 0x000000FFU; |
1453 | } |
1454 | else |
1455 | { |
1456 | num >>= 16; |
1457 | |
1458 | if ( neg ) |
1459 | { |
1460 | if ( num <= 107 ) |
1461 | *q++ = (FT_Byte)( 139 - num ); |
1462 | else if ( num <= 1131 ) |
1463 | { |
1464 | *q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 251 ); |
1465 | *q++ = (FT_Byte)( ( num - 108 ) & 0xFF ); |
1466 | } |
1467 | else |
1468 | { |
1469 | num = (FT_ULong)-num; |
1470 | |
1471 | *q++ = 28; |
1472 | *q++ = (FT_Byte)( num >> 8 ); |
1473 | *q++ = (FT_Byte)( num & 0xFF ); |
1474 | } |
1475 | } |
1476 | else |
1477 | { |
1478 | if ( num <= 107 ) |
1479 | *q++ = (FT_Byte)( num + 139 ); |
1480 | else if ( num <= 1131 ) |
1481 | { |
1482 | *q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 247 ); |
1483 | *q++ = (FT_Byte)( ( num - 108 ) & 0xFF ); |
1484 | } |
1485 | else |
1486 | { |
1487 | *q++ = 28; |
1488 | *q++ = (FT_Byte)( num >> 8 ); |
1489 | *q++ = (FT_Byte)( num & 0xFF ); |
1490 | } |
1491 | } |
1492 | } |
1493 | |
1494 | stack++; |
1495 | } |
1496 | } |
1497 | #endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ |
1498 | else |
1499 | { |
1500 | /* This is not a number, hence it's an operator. Compute its code */ |
1501 | /* and look for it in our current list. */ |
1502 | |
1503 | FT_UInt code; |
1504 | FT_UInt num_args; |
1505 | const CFF_Field_Handler* field; |
1506 | |
1507 | |
1508 | if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize ) |
1509 | goto Stack_Overflow; |
1510 | |
1511 | num_args = (FT_UInt)( parser->top - parser->stack ); |
1512 | *parser->top = p; |
1513 | code = v; |
1514 | |
1515 | if ( v == 12 ) |
1516 | { |
1517 | /* two byte operator */ |
1518 | p++; |
1519 | if ( p >= limit ) |
1520 | goto Syntax_Error; |
1521 | |
1522 | code = 0x100 | p[0]; |
1523 | } |
1524 | code = code | parser->object_code; |
1525 | |
1526 | for ( field = CFF_FIELD_HANDLERS_GET; field->kind; field++ ) |
1527 | { |
1528 | if ( field->code == (FT_Int)code ) |
1529 | { |
1530 | /* we found our field's handler; read it */ |
1531 | FT_Long val; |
1532 | FT_Byte* q = (FT_Byte*)parser->object + field->offset; |
1533 | |
1534 | |
1535 | #ifdef FT_DEBUG_LEVEL_TRACE |
1536 | FT_TRACE4(( " %s" , field->id )); |
1537 | #endif |
1538 | |
1539 | /* check that we have enough arguments -- except for */ |
1540 | /* delta encoded arrays, which can be empty */ |
1541 | if ( field->kind != cff_kind_delta && num_args < 1 ) |
1542 | goto Stack_Underflow; |
1543 | |
1544 | switch ( field->kind ) |
1545 | { |
1546 | case cff_kind_bool: |
1547 | case cff_kind_string: |
1548 | case cff_kind_num: |
1549 | val = cff_parse_num( parser, parser->stack ); |
1550 | goto Store_Number; |
1551 | |
1552 | case cff_kind_fixed: |
1553 | val = cff_parse_fixed( parser, parser->stack ); |
1554 | goto Store_Number; |
1555 | |
1556 | case cff_kind_fixed_thousand: |
1557 | val = cff_parse_fixed_scaled( parser, parser->stack, 3 ); |
1558 | |
1559 | Store_Number: |
1560 | switch ( field->size ) |
1561 | { |
1562 | case (8 / FT_CHAR_BIT): |
1563 | *(FT_Byte*)q = (FT_Byte)val; |
1564 | break; |
1565 | |
1566 | case (16 / FT_CHAR_BIT): |
1567 | *(FT_Short*)q = (FT_Short)val; |
1568 | break; |
1569 | |
1570 | case (32 / FT_CHAR_BIT): |
1571 | *(FT_Int32*)q = (FT_Int)val; |
1572 | break; |
1573 | |
1574 | default: /* for 64-bit systems */ |
1575 | *(FT_Long*)q = val; |
1576 | } |
1577 | |
1578 | #ifdef FT_DEBUG_LEVEL_TRACE |
1579 | switch ( field->kind ) |
1580 | { |
1581 | case cff_kind_bool: |
1582 | FT_TRACE4(( " %s\n" , val ? "true" : "false" )); |
1583 | break; |
1584 | |
1585 | case cff_kind_string: |
1586 | FT_TRACE4(( " %ld (SID)\n" , val )); |
1587 | break; |
1588 | |
1589 | case cff_kind_num: |
1590 | FT_TRACE4(( " %ld\n" , val )); |
1591 | break; |
1592 | |
1593 | case cff_kind_fixed: |
1594 | FT_TRACE4(( " %f\n" , (double)val / 65536 )); |
1595 | break; |
1596 | |
1597 | case cff_kind_fixed_thousand: |
1598 | FT_TRACE4(( " %f\n" , (double)val / 65536 / 1000 )); |
1599 | |
1600 | default: |
1601 | ; /* never reached */ |
1602 | } |
1603 | #endif |
1604 | |
1605 | break; |
1606 | |
1607 | case cff_kind_delta: |
1608 | { |
1609 | FT_Byte* qcount = (FT_Byte*)parser->object + |
1610 | field->count_offset; |
1611 | |
1612 | FT_Byte** data = parser->stack; |
1613 | |
1614 | |
1615 | if ( num_args > field->array_max ) |
1616 | num_args = field->array_max; |
1617 | |
1618 | FT_TRACE4(( " [" )); |
1619 | |
1620 | /* store count */ |
1621 | *qcount = (FT_Byte)num_args; |
1622 | |
1623 | val = 0; |
1624 | while ( num_args > 0 ) |
1625 | { |
1626 | val = ADD_LONG( val, cff_parse_num( parser, data++ ) ); |
1627 | switch ( field->size ) |
1628 | { |
1629 | case (8 / FT_CHAR_BIT): |
1630 | *(FT_Byte*)q = (FT_Byte)val; |
1631 | break; |
1632 | |
1633 | case (16 / FT_CHAR_BIT): |
1634 | *(FT_Short*)q = (FT_Short)val; |
1635 | break; |
1636 | |
1637 | case (32 / FT_CHAR_BIT): |
1638 | *(FT_Int32*)q = (FT_Int)val; |
1639 | break; |
1640 | |
1641 | default: /* for 64-bit systems */ |
1642 | *(FT_Long*)q = val; |
1643 | } |
1644 | |
1645 | FT_TRACE4(( " %ld" , val )); |
1646 | |
1647 | q += field->size; |
1648 | num_args--; |
1649 | } |
1650 | |
1651 | FT_TRACE4(( "]\n" )); |
1652 | } |
1653 | break; |
1654 | |
1655 | default: /* callback or blend */ |
1656 | error = field->reader( parser ); |
1657 | if ( error ) |
1658 | goto Exit; |
1659 | } |
1660 | goto Found; |
1661 | } |
1662 | } |
1663 | |
1664 | /* this is an unknown operator, or it is unsupported; */ |
1665 | /* we will ignore it for now. */ |
1666 | |
1667 | Found: |
1668 | /* clear stack */ |
1669 | /* TODO: could clear blend stack here, */ |
1670 | /* but we don't have access to subFont */ |
1671 | if ( field->kind != cff_kind_blend ) |
1672 | parser->top = parser->stack; |
1673 | } |
1674 | p++; |
1675 | } |
1676 | |
1677 | Exit: |
1678 | return error; |
1679 | |
1680 | Stack_Overflow: |
1681 | error = FT_THROW( Invalid_Argument ); |
1682 | goto Exit; |
1683 | |
1684 | Stack_Underflow: |
1685 | error = FT_THROW( Invalid_Argument ); |
1686 | goto Exit; |
1687 | |
1688 | Syntax_Error: |
1689 | error = FT_THROW( Invalid_Argument ); |
1690 | goto Exit; |
1691 | } |
1692 | |
1693 | |
1694 | /* END */ |
1695 | |