blob: ff4ab71f1ce728fe679b7451698c2dfa5cc92065 [file] [log] [blame]
David Turner19ed8af2000-12-08 02:42:29 +00001/***************************************************************************/
2/* */
3/* cffparse.c */
4/* */
5/* CFF token stream parser (body) */
6/* */
7/* Copyright 1996-2000 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
Werner Lembergcc069be2000-12-08 16:17:16 +000018
David Turner19ed8af2000-12-08 02:42:29 +000019#include <ft2build.h>
David Turner170c0d42000-12-13 19:55:11 +000020#include FT_SOURCE_FILE(cff,cffparse.h)
David Turner19ed8af2000-12-08 02:42:29 +000021#include FT_INTERNAL_CFF_ERRORS_H
22#include FT_INTERNAL_STREAM_H
23
Werner Lembergcc069be2000-12-08 16:17:16 +000024
David Turner19ed8af2000-12-08 02:42:29 +000025 /*************************************************************************/
26 /* */
27 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
28 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
29 /* messages during execution. */
30 /* */
31#undef FT_COMPONENT
32#define FT_COMPONENT trace_t2parse
33
34
Werner Lembergcc069be2000-12-08 16:17:16 +000035#define T2_Err_Stack_Underflow FT_Err_Invalid_Argument
36#define T2_Err_Syntax_Error FT_Err_Invalid_Argument
David Turner19ed8af2000-12-08 02:42:29 +000037
38
39 enum
40 {
41 cff_kind_none = 0,
42 cff_kind_num,
43 cff_kind_fixed,
44 cff_kind_string,
45 cff_kind_bool,
46 cff_kind_delta,
47 cff_kind_callback,
48
49 cff_kind_max /* do not remove */
50 };
51
52
53 /* now generate handlers for the most simple fields */
54 typedef FT_Error (*CFF_Field_Reader)( CFF_Parser* parser );
55
56 typedef struct CFF_Field_Handler_
57 {
58 int kind;
59 int code;
60 FT_UInt offset;
61 FT_Byte size;
62 CFF_Field_Reader reader;
63 FT_UInt array_max;
64 FT_UInt count_offset;
65
66 } CFF_Field_Handler;
67
68
Werner Lembergcc069be2000-12-08 16:17:16 +000069 FT_LOCAL_DEF
70 void CFF_Parser_Init( CFF_Parser* parser,
71 FT_UInt code,
72 void* object )
David Turner19ed8af2000-12-08 02:42:29 +000073 {
74 MEM_Set( parser, 0, sizeof ( *parser ) );
75
76 parser->top = parser->stack;
77 parser->object_code = code;
78 parser->object = object;
79 }
80
81
Werner Lembergcc069be2000-12-08 16:17:16 +000082 /* read an integer */
83 static
84 FT_Long cff_parse_integer( FT_Byte* start,
85 FT_Byte* limit )
David Turner19ed8af2000-12-08 02:42:29 +000086 {
87 FT_Byte* p = start;
88 FT_Int v = *p++;
89 FT_Long val = 0;
90
91
92 if ( v == 28 )
93 {
94 if ( p + 2 > limit )
95 goto Bad;
96
97 val = (FT_Short)( ( (FT_Int)p[0] << 8 ) | p[1] );
98 p += 2;
99 }
100 else if ( v == 29 )
101 {
102 if ( p + 4 > limit )
103 goto Bad;
104
105 val = ( (FT_Long)p[0] << 24 ) |
106 ( (FT_Long)p[1] << 16 ) |
107 ( (FT_Long)p[2] << 8 ) |
108 p[3];
109 p += 4;
110 }
111 else if ( v < 247 )
112 {
113 val = v - 139;
114 }
115 else if ( v < 251 )
116 {
117 if ( p + 1 > limit )
118 goto Bad;
119
120 val = ( v - 247 ) * 256 + p[0] + 108;
121 p++;
122 }
123 else
124 {
125 if ( p + 1 > limit )
126 goto Bad;
127
128 val = -( v - 251 ) * 256 - p[0] - 108;
129 p++;
130 }
131
132 Exit:
133 return val;
134
135 Bad:
136 val = 0;
137 goto Exit;
138 }
139
140
141 /* read a real */
Werner Lembergcc069be2000-12-08 16:17:16 +0000142 static
143 FT_Fixed cff_parse_real( FT_Byte* start,
144 FT_Byte* limit,
145 FT_Int power_ten )
David Turner19ed8af2000-12-08 02:42:29 +0000146 {
147 FT_Byte* p = start;
148 FT_Long num, divider, result, exp;
149 FT_Int sign = 0, exp_sign = 0;
150 FT_Byte nib;
151 FT_Byte phase;
152
153
154 result = 0;
155 num = 0;
156 divider = 1;
157
158 /* first of all, read the integer part */
159 phase = 4;
160
161 for (;;)
162 {
David Turner19ed8af2000-12-08 02:42:29 +0000163 /* If we entered this iteration with phase == 4, we need to */
164 /* read a new byte. This also skips past the intial 0x1E. */
165 if ( phase )
166 {
167 p++;
168
169 /* Make sure we don't read past the end. */
170 if ( p >= limit )
171 goto Bad;
172 }
173
174 /* Get the nibble. */
175 nib = ( p[0] >> phase ) & 0xF;
176 phase = 4 - phase;
177
178 if ( nib == 0xE )
179 sign = 1;
180 else if ( nib > 9 )
181 break;
182 else
183 result = result * 10 + nib;
184 }
185
186 /* read decimal part, if any */
187 if ( nib == 0xa )
188 for (;;)
189 {
David Turner19ed8af2000-12-08 02:42:29 +0000190 /* If we entered this iteration with phase == 4, we need */
191 /* to read a new byte. */
192 if ( phase )
Werner Lembergcc069be2000-12-08 16:17:16 +0000193 {
David Turner19ed8af2000-12-08 02:42:29 +0000194 p++;
195
196 /* Make sure we don't read past the end. */
197 if ( p >= limit )
198 goto Bad;
Werner Lembergcc069be2000-12-08 16:17:16 +0000199 }
David Turner19ed8af2000-12-08 02:42:29 +0000200
201 /* Get the nibble. */
202 nib = ( p[0] >> phase ) & 0xF;
203 phase = 4 - phase;
204 if ( nib >= 10 )
205 break;
206
Werner Lembergcc069be2000-12-08 16:17:16 +0000207 if ( divider < 10000000L )
David Turner19ed8af2000-12-08 02:42:29 +0000208 {
209 num = num * 10 + nib;
210 divider *= 10;
211 }
212 }
213
214 /* read exponent, if any */
215 if ( nib == 12 )
216 {
217 exp_sign = 1;
218 nib = 11;
219 }
220
221 if ( nib == 11 )
222 {
223 exp = 0;
224
225 for (;;)
226 {
227 /* If we entered this iteration with phase == 4, we need */
228 /* to read a new byte. */
229 if ( phase )
Werner Lembergcc069be2000-12-08 16:17:16 +0000230 {
David Turner19ed8af2000-12-08 02:42:29 +0000231 p++;
232
233 /* Make sure we don't read past the end. */
234 if ( p >= limit )
235 goto Bad;
Werner Lembergcc069be2000-12-08 16:17:16 +0000236 }
David Turner19ed8af2000-12-08 02:42:29 +0000237
238 /* Get the nibble. */
239 nib = ( p[0] >> phase ) & 0xF;
240 phase = 4 - phase;
241 if ( nib >= 10 )
242 break;
243
244 exp = exp * 10 + nib;
245 }
246
247 if ( exp_sign )
248 exp = -exp;
249
250 power_ten += exp;
251 }
252
253 /* raise to power of ten if needed */
254 while ( power_ten > 0 )
255 {
256 result = result * 10;
257 num = num * 10;
258
259 power_ten--;
260 }
261
262 while ( power_ten < 0 )
263 {
264 result = result / 10;
265 divider = divider * 10;
266
267 power_ten++;
268 }
269
270 if ( num )
271 result += FT_DivFix( num, divider );
272
273 if ( sign )
274 result = -result;
275
276 Exit:
277 return result;
278
279 Bad:
280 result = 0;
281 goto Exit;
282 }
283
284
285 /* read a number, either integer or real */
Werner Lembergcc069be2000-12-08 16:17:16 +0000286 static
287 FT_Long cff_parse_num( FT_Byte** d )
David Turner19ed8af2000-12-08 02:42:29 +0000288 {
289 return ( **d == 30 ? ( cff_parse_real ( d[0], d[1], 0 ) >> 16 )
290 : cff_parse_integer( d[0], d[1] ) );
291 }
292
293
Werner Lembergcc069be2000-12-08 16:17:16 +0000294 /* read a floating point number, either integer or real */
295 static
296 FT_Fixed cff_parse_fixed( FT_Byte** d )
David Turner19ed8af2000-12-08 02:42:29 +0000297 {
298 return ( **d == 30 ? cff_parse_real ( d[0], d[1], 0 )
299 : cff_parse_integer( d[0], d[1] ) << 16 );
300 }
301
302
Werner Lembergcc069be2000-12-08 16:17:16 +0000303 static
304 FT_Error cff_parse_font_matrix( CFF_Parser* parser )
David Turner19ed8af2000-12-08 02:42:29 +0000305 {
306 CFF_Font_Dict* dict = (CFF_Font_Dict*)parser->object;
307 FT_Matrix* matrix = &dict->font_matrix;
308 FT_Vector* offset = &dict->font_offset;
309 FT_Byte** data = parser->stack;
310 FT_Error error;
Tom Kacvinskya05c02c2000-12-24 09:57:28 +0000311 FT_Fixed temp;
David Turner19ed8af2000-12-08 02:42:29 +0000312
313 error = T2_Err_Stack_Underflow;
314
315 if ( parser->top >= parser->stack + 6 )
316 {
317 matrix->xx = cff_parse_fixed( data++ );
318 matrix->yx = cff_parse_fixed( data++ );
319 matrix->xy = cff_parse_fixed( data++ );
320 matrix->yy = cff_parse_fixed( data++ );
321 offset->x = cff_parse_fixed( data++ );
322 offset->y = cff_parse_fixed( data );
Tom Kacvinskya05c02c2000-12-24 09:57:28 +0000323
324 temp = ABS( matrix->yy );
325
326 if ( temp != 0x10000L )
327 {
328 matrix->xx = FT_DivFix( matrix->xx, temp );
329 matrix->yx = FT_DivFix( matrix->yx, temp );
330 matrix->xy = FT_DivFix( matrix->xy, temp );
331 matrix->yy = FT_DivFix( matrix->yy, temp );
332 offset->x = FT_DivFix( offset->x, temp );
333 offset->y = FT_DivFix( offset->y, temp );
334 }
335
336 /* note that the offsets must be expressed in integer font units */
337 offset->x >>= 16;
338 offset->y >>= 16;
339
David Turner19ed8af2000-12-08 02:42:29 +0000340 error = T2_Err_Ok;
341 }
342
343 return error;
344 }
345
346
Werner Lembergcc069be2000-12-08 16:17:16 +0000347 static
348 FT_Error cff_parse_font_bbox( CFF_Parser* parser )
David Turner19ed8af2000-12-08 02:42:29 +0000349 {
350 CFF_Font_Dict* dict = (CFF_Font_Dict*)parser->object;
351 FT_BBox* bbox = &dict->font_bbox;
352 FT_Byte** data = parser->stack;
353 FT_Error error;
354
355
356 error = T2_Err_Stack_Underflow;
357
358 if ( parser->top >= parser->stack + 4 )
359 {
360 bbox->xMin = cff_parse_num( data++ );
361 bbox->yMin = cff_parse_num( data++ );
362 bbox->xMax = cff_parse_num( data++ );
363 bbox->yMax = cff_parse_num( data );
364 error = T2_Err_Ok;
365 }
366
367 return error;
368 }
369
370
Werner Lembergcc069be2000-12-08 16:17:16 +0000371 static
372 FT_Error cff_parse_private_dict( CFF_Parser* parser )
David Turner19ed8af2000-12-08 02:42:29 +0000373 {
374 CFF_Font_Dict* dict = (CFF_Font_Dict*)parser->object;
375 FT_Byte** data = parser->stack;
376 FT_Error error;
377
378
379 error = T2_Err_Stack_Underflow;
380
381 if ( parser->top >= parser->stack + 2 )
382 {
383 dict->private_size = cff_parse_num( data++ );
384 dict->private_offset = cff_parse_num( data );
385 error = T2_Err_Ok;
386 }
387
388 return error;
389 }
390
391
Werner Lembergcc069be2000-12-08 16:17:16 +0000392 static
393 FT_Error cff_parse_cid_ros( CFF_Parser* parser )
David Turner19ed8af2000-12-08 02:42:29 +0000394 {
395 CFF_Font_Dict* dict = (CFF_Font_Dict*)parser->object;
396 FT_Byte** data = parser->stack;
397 FT_Error error;
398
399
400 error = T2_Err_Stack_Underflow;
401
402 if ( parser->top >= parser->stack + 3 )
403 {
404 dict->cid_registry = (FT_UInt)cff_parse_num ( data++ );
405 dict->cid_ordering = (FT_UInt)cff_parse_num ( data++ );
406 dict->cid_supplement = (FT_ULong)cff_parse_num( data );
407 error = T2_Err_Ok;
408 }
409
410 return error;
411 }
412
413
414#define CFF_FIELD_NUM( code, name ) \
415 CFF_FIELD( code, name, cff_kind_num )
416#define CFF_FIELD_FIXED( code, name ) \
417 CFF_FIELD( code, name, cff_kind_fixed )
418#define CFF_FIELD_STRING( code, name ) \
419 CFF_FIELD( code, name, cff_kind_string )
420#define CFF_FIELD_BOOL( code, name ) \
421 CFF_FIELD( code, name, cff_kind_bool )
422#define CFF_FIELD_DELTA( code, name, max ) \
423 CFF_FIELD( code, name, cff_kind_delta )
424
425#define CFF_FIELD_CALLBACK( code, name ) \
426 { \
427 cff_kind_callback, \
428 code | CFFCODE, \
429 0, 0, \
430 cff_parse_ ## name, \
431 0, 0 \
432 },
433
434#undef CFF_FIELD
435#define CFF_FIELD( code, name, kind ) \
436 { \
437 kind, \
438 code | CFFCODE, \
439 FT_FIELD_OFFSET( name ), \
440 FT_FIELD_SIZE( name ), \
441 0, 0, 0 \
442 },
443
444#undef CFF_FIELD_DELTA
445#define CFF_FIELD_DELTA( code, name, max ) \
446 { \
447 cff_kind_delta, \
448 code | CFFCODE, \
449 FT_FIELD_OFFSET( name ), \
450 FT_FIELD_SIZE_DELTA( name ), \
451 0, \
452 max, \
453 FT_FIELD_OFFSET( num_ ## name ) \
454 },
455
456#define CFFCODE_TOPDICT 0x1000
457#define CFFCODE_PRIVATE 0x2000
458
459 static const CFF_Field_Handler cff_field_handlers[] =
460 {
461
Werner Lemberg63408a12000-12-13 23:44:37 +0000462#include FT_SOURCE_FILE(cff,cfftoken.h)
David Turner19ed8af2000-12-08 02:42:29 +0000463
464 { 0, 0, 0, 0, 0, 0, 0 }
465 };
466
467
Werner Lembergcc069be2000-12-08 16:17:16 +0000468 FT_LOCAL_DEF
469 FT_Error CFF_Parser_Run( CFF_Parser* parser,
470 FT_Byte* start,
471 FT_Byte* limit )
David Turner19ed8af2000-12-08 02:42:29 +0000472 {
473 FT_Byte* p = start;
474 FT_Error error = T2_Err_Ok;
475
476
477 parser->top = parser->stack;
478 parser->start = start;
479 parser->limit = limit;
480 parser->cursor = start;
481
482 while ( p < limit )
483 {
484 FT_Byte v = *p;
485
486
487 if ( v >= 27 && v != 31 )
488 {
489 /* it's a number; we will push its position on the stack */
490 if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH )
491 goto Stack_Overflow;
492
493 *parser->top ++ = p;
494
495 /* now, skip it */
496 if ( v == 30 )
497 {
498 /* skip real number */
499 p++;
500 for (;;)
501 {
502 if ( p >= limit )
503 goto Syntax_Error;
504 v = p[0] >> 4;
505 if ( v == 15 )
506 break;
507 v = p[0] & 0xF;
508 if ( v == 15 )
509 break;
510 p++;
511 }
512 }
513 else if ( v == 28 )
514 p += 2;
515 else if ( v == 29 )
516 p += 4;
517 else if ( v > 246 )
518 p += 1;
519 }
520 else
521 {
522 /* This is not a number, hence it's an operator. Compute its code */
523 /* and look for it in our current list. */
524
Werner Lembergcc069be2000-12-08 16:17:16 +0000525 FT_UInt code;
526 FT_UInt num_args = (FT_UInt)
527 ( parser->top - parser->stack );
David Turner19ed8af2000-12-08 02:42:29 +0000528 const CFF_Field_Handler* field;
529
530
531 /* first of all, a trivial check */
532 if ( num_args < 1 )
533 goto Stack_Underflow;
534
535 *parser->top = p;
536 code = v;
537 if ( v == 12 )
538 {
539 /* two byte operator */
540 p++;
541 code = 0x100 | p[0];
542 }
543 code = code | parser->object_code;
544
545 for ( field = cff_field_handlers; field->kind; field++ )
546 {
547 if ( field->code == (FT_Int)code )
548 {
549 /* we found our field's handler; read it */
550 FT_Long val;
551 FT_Byte* q = (FT_Byte*)parser->object + field->offset;
552
Werner Lembergcc069be2000-12-08 16:17:16 +0000553
David Turner19ed8af2000-12-08 02:42:29 +0000554 switch ( field->kind )
555 {
556 case cff_kind_bool:
557 case cff_kind_string:
558 case cff_kind_num:
559 val = cff_parse_num( parser->stack );
560 goto Store_Number;
561
562 case cff_kind_fixed:
563 val = cff_parse_fixed( parser->stack );
564
565 Store_Number:
566 switch ( field->size )
567 {
568 case 1:
569 *(FT_Byte*)q = (FT_Byte)val;
570 break;
571
572 case 2:
573 *(FT_Short*)q = (FT_Short)val;
574 break;
575
576 case 4:
577 *(FT_Int32*)q = (FT_Int)val;
578 break;
579
580 default: /* for 64-bit systems where long is 8 bytes */
581 *(FT_Long*)q = val;
582 }
583 break;
584
585 case cff_kind_delta:
586 {
587 FT_Byte* qcount = (FT_Byte*)parser->object +
588 field->count_offset;
589
590 FT_Byte** data = parser->stack;
591
592
593 if ( num_args > field->array_max )
594 num_args = field->array_max;
595
596 /* store count */
597 *qcount = (FT_Byte)num_args;
598
599 val = 0;
600 while ( num_args > 0 )
601 {
602 val += cff_parse_num( data++ );
603 switch ( field->size )
604 {
605 case 1:
606 *(FT_Byte*)q = (FT_Byte)val;
607 break;
608
609 case 2:
610 *(FT_Short*)q = (FT_Short)val;
611 break;
612
613 case 4:
614 *(FT_Int32*)q = (FT_Int)val;
615 break;
616
617 default: /* for 64-bit systems */
618 *(FT_Long*)q = val;
619 }
620
621 q += field->size;
622 num_args--;
623 }
624 }
625 break;
626
627 default: /* callback */
628 error = field->reader( parser );
629 if ( error )
630 goto Exit;
631 }
632 goto Found;
633 }
634 }
635
636 /* this is an unknown operator, or it is unsupported; */
637 /* we will ignore it for now. */
638
639 Found:
640 /* clear stack */
641 parser->top = parser->stack;
642 }
643 p++;
644 }
645
646 Exit:
647 return error;
648
649 Stack_Overflow:
650 error = T2_Err_Invalid_Argument;
651 goto Exit;
652
653 Stack_Underflow:
654 error = T2_Err_Invalid_Argument;
655 goto Exit;
656
657 Syntax_Error:
658 error = T2_Err_Invalid_Argument;
659 goto Exit;
660 }
661
662
663/* END */