| OLD | NEW |
| 1 /***************************************************************************/ | 1 /***************************************************************************/ |
| 2 /* */ | 2 /* */ |
| 3 /* psobjs.c */ | 3 /* psobjs.c */ |
| 4 /* */ | 4 /* */ |
| 5 /* Auxiliary functions for PostScript fonts (body). */ | 5 /* Auxiliary functions for PostScript fonts (body). */ |
| 6 /* */ | 6 /* */ |
| 7 /* Copyright 1996-2012 by */ | 7 /* Copyright 1996-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 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 | 106 |
| 107 for ( ; offset < limit; offset++ ) | 107 for ( ; offset < limit; offset++ ) |
| 108 { | 108 { |
| 109 if ( offset[0] ) | 109 if ( offset[0] ) |
| 110 offset[0] += delta; | 110 offset[0] += delta; |
| 111 } | 111 } |
| 112 } | 112 } |
| 113 | 113 |
| 114 | 114 |
| 115 static FT_Error | 115 static FT_Error |
| 116 reallocate_t1_table( PS_Table table, | 116 reallocate_t1_table( PS_Table table, |
| 117 FT_Long new_size ) | 117 FT_Offset new_size ) |
| 118 { | 118 { |
| 119 FT_Memory memory = table->memory; | 119 FT_Memory memory = table->memory; |
| 120 FT_Byte* old_base = table->block; | 120 FT_Byte* old_base = table->block; |
| 121 FT_Error error; | 121 FT_Error error; |
| 122 | 122 |
| 123 | 123 |
| 124 /* allocate new base block */ | 124 /* allocate new base block */ |
| 125 if ( FT_ALLOC( table->block, new_size ) ) | 125 if ( FT_ALLOC( table->block, new_size ) ) |
| 126 { | 126 { |
| 127 table->block = old_base; | 127 table->block = old_base; |
| 128 return error; | 128 return error; |
| 129 } | 129 } |
| 130 | 130 |
| 131 /* copy elements and shift offsets */ | 131 /* copy elements and shift offsets */ |
| 132 if ( old_base ) | 132 if ( old_base ) |
| 133 { | 133 { |
| 134 FT_MEM_COPY( table->block, old_base, table->capacity ); | 134 FT_MEM_COPY( table->block, old_base, table->capacity ); |
| 135 shift_elements( table, old_base ); | 135 shift_elements( table, old_base ); |
| 136 FT_FREE( old_base ); | 136 FT_FREE( old_base ); |
| 137 } | 137 } |
| 138 | 138 |
| 139 table->capacity = new_size; | 139 table->capacity = new_size; |
| 140 | 140 |
| 141 return PSaux_Err_Ok; | 141 return FT_Err_Ok; |
| 142 } | 142 } |
| 143 | 143 |
| 144 | 144 |
| 145 /*************************************************************************/ | 145 /*************************************************************************/ |
| 146 /* */ | 146 /* */ |
| 147 /* <Function> */ | 147 /* <Function> */ |
| 148 /* ps_table_add */ | 148 /* ps_table_add */ |
| 149 /* */ | 149 /* */ |
| 150 /* <Description> */ | 150 /* <Description> */ |
| 151 /* Adds an object to a PS_Table, possibly growing its memory block. */ | 151 /* Adds an object to a PS_Table, possibly growing its memory block. */ |
| (...skipping 14 matching lines...) Expand all Loading... |
| 166 /* */ | 166 /* */ |
| 167 FT_LOCAL_DEF( FT_Error ) | 167 FT_LOCAL_DEF( FT_Error ) |
| 168 ps_table_add( PS_Table table, | 168 ps_table_add( PS_Table table, |
| 169 FT_Int idx, | 169 FT_Int idx, |
| 170 void* object, | 170 void* object, |
| 171 FT_PtrDist length ) | 171 FT_PtrDist length ) |
| 172 { | 172 { |
| 173 if ( idx < 0 || idx >= table->max_elems ) | 173 if ( idx < 0 || idx >= table->max_elems ) |
| 174 { | 174 { |
| 175 FT_ERROR(( "ps_table_add: invalid index\n" )); | 175 FT_ERROR(( "ps_table_add: invalid index\n" )); |
| 176 return PSaux_Err_Invalid_Argument; | 176 return FT_THROW( Invalid_Argument ); |
| 177 } | 177 } |
| 178 | 178 |
| 179 if ( length < 0 ) | 179 if ( length < 0 ) |
| 180 { | 180 { |
| 181 FT_ERROR(( "ps_table_add: invalid length\n" )); | 181 FT_ERROR(( "ps_table_add: invalid length\n" )); |
| 182 return PSaux_Err_Invalid_Argument; | 182 return FT_THROW( Invalid_Argument ); |
| 183 } | 183 } |
| 184 | 184 |
| 185 /* grow the base block if needed */ | 185 /* grow the base block if needed */ |
| 186 if ( table->cursor + length > table->capacity ) | 186 if ( table->cursor + length > table->capacity ) |
| 187 { | 187 { |
| 188 FT_Error error; | 188 FT_Error error; |
| 189 FT_Offset new_size = table->capacity; | 189 FT_Offset new_size = table->capacity; |
| 190 FT_PtrDist in_offset; | 190 FT_PtrDist in_offset; |
| 191 | 191 |
| 192 | 192 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 209 if ( in_offset >= 0 ) | 209 if ( in_offset >= 0 ) |
| 210 object = table->block + in_offset; | 210 object = table->block + in_offset; |
| 211 } | 211 } |
| 212 | 212 |
| 213 /* add the object to the base block and adjust offset */ | 213 /* add the object to the base block and adjust offset */ |
| 214 table->elements[idx] = table->block + table->cursor; | 214 table->elements[idx] = table->block + table->cursor; |
| 215 table->lengths [idx] = length; | 215 table->lengths [idx] = length; |
| 216 FT_MEM_COPY( table->block + table->cursor, object, length ); | 216 FT_MEM_COPY( table->block + table->cursor, object, length ); |
| 217 | 217 |
| 218 table->cursor += length; | 218 table->cursor += length; |
| 219 return PSaux_Err_Ok; | 219 return FT_Err_Ok; |
| 220 } | 220 } |
| 221 | 221 |
| 222 | 222 |
| 223 /*************************************************************************/ | 223 /*************************************************************************/ |
| 224 /* */ | 224 /* */ |
| 225 /* <Function> */ | 225 /* <Function> */ |
| 226 /* ps_table_done */ | 226 /* ps_table_done */ |
| 227 /* */ | 227 /* */ |
| 228 /* <Description> */ | 228 /* <Description> */ |
| 229 /* Finalizes a PS_TableRec (i.e., reallocate it to its current */ | 229 /* Finalizes a PS_TableRec (i.e., reallocate it to its current */ |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 | 334 |
| 335 /* first character must be `('; */ | 335 /* first character must be `('; */ |
| 336 /* *acur is positioned at the character after the closing `)' */ | 336 /* *acur is positioned at the character after the closing `)' */ |
| 337 | 337 |
| 338 static FT_Error | 338 static FT_Error |
| 339 skip_literal_string( FT_Byte* *acur, | 339 skip_literal_string( FT_Byte* *acur, |
| 340 FT_Byte* limit ) | 340 FT_Byte* limit ) |
| 341 { | 341 { |
| 342 FT_Byte* cur = *acur; | 342 FT_Byte* cur = *acur; |
| 343 FT_Int embed = 0; | 343 FT_Int embed = 0; |
| 344 FT_Error error = PSaux_Err_Invalid_File_Format; | 344 FT_Error error = FT_ERR( Invalid_File_Format ); |
| 345 unsigned int i; | 345 unsigned int i; |
| 346 | 346 |
| 347 | 347 |
| 348 while ( cur < limit ) | 348 while ( cur < limit ) |
| 349 { | 349 { |
| 350 FT_Byte c = *cur; | 350 FT_Byte c = *cur; |
| 351 | 351 |
| 352 | 352 |
| 353 ++cur; | 353 ++cur; |
| 354 | 354 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 } | 390 } |
| 391 } | 391 } |
| 392 } | 392 } |
| 393 else if ( c == '(' ) | 393 else if ( c == '(' ) |
| 394 embed++; | 394 embed++; |
| 395 else if ( c == ')' ) | 395 else if ( c == ')' ) |
| 396 { | 396 { |
| 397 embed--; | 397 embed--; |
| 398 if ( embed == 0 ) | 398 if ( embed == 0 ) |
| 399 { | 399 { |
| 400 error = PSaux_Err_Ok; | 400 error = FT_Err_Ok; |
| 401 break; | 401 break; |
| 402 } | 402 } |
| 403 } | 403 } |
| 404 } | 404 } |
| 405 | 405 |
| 406 *acur = cur; | 406 *acur = cur; |
| 407 | 407 |
| 408 return error; | 408 return error; |
| 409 } | 409 } |
| 410 | 410 |
| 411 | 411 |
| 412 /* first character must be `<' */ | 412 /* first character must be `<' */ |
| 413 | 413 |
| 414 static FT_Error | 414 static FT_Error |
| 415 skip_string( FT_Byte* *acur, | 415 skip_string( FT_Byte* *acur, |
| 416 FT_Byte* limit ) | 416 FT_Byte* limit ) |
| 417 { | 417 { |
| 418 FT_Byte* cur = *acur; | 418 FT_Byte* cur = *acur; |
| 419 FT_Error err = PSaux_Err_Ok; | 419 FT_Error err = FT_Err_Ok; |
| 420 | 420 |
| 421 | 421 |
| 422 while ( ++cur < limit ) | 422 while ( ++cur < limit ) |
| 423 { | 423 { |
| 424 /* All whitespace characters are ignored. */ | 424 /* All whitespace characters are ignored. */ |
| 425 skip_spaces( &cur, limit ); | 425 skip_spaces( &cur, limit ); |
| 426 if ( cur >= limit ) | 426 if ( cur >= limit ) |
| 427 break; | 427 break; |
| 428 | 428 |
| 429 if ( !IS_PS_XDIGIT( *cur ) ) | 429 if ( !IS_PS_XDIGIT( *cur ) ) |
| 430 break; | 430 break; |
| 431 } | 431 } |
| 432 | 432 |
| 433 if ( cur < limit && *cur != '>' ) | 433 if ( cur < limit && *cur != '>' ) |
| 434 { | 434 { |
| 435 FT_ERROR(( "skip_string: missing closing delimiter `>'\n" )); | 435 FT_ERROR(( "skip_string: missing closing delimiter `>'\n" )); |
| 436 err = PSaux_Err_Invalid_File_Format; | 436 err = FT_THROW( Invalid_File_Format ); |
| 437 } | 437 } |
| 438 else | 438 else |
| 439 cur++; | 439 cur++; |
| 440 | 440 |
| 441 *acur = cur; | 441 *acur = cur; |
| 442 return err; | 442 return err; |
| 443 } | 443 } |
| 444 | 444 |
| 445 | 445 |
| 446 /* first character must be the opening brace that */ | 446 /* first character must be the opening brace that */ |
| 447 /* starts the procedure */ | 447 /* starts the procedure */ |
| 448 | 448 |
| 449 /* NB: [ and ] need not match: */ | 449 /* NB: [ and ] need not match: */ |
| 450 /* `/foo {[} def' is a valid PostScript fragment, */ | 450 /* `/foo {[} def' is a valid PostScript fragment, */ |
| 451 /* even within a Type1 font */ | 451 /* even within a Type1 font */ |
| 452 | 452 |
| 453 static FT_Error | 453 static FT_Error |
| 454 skip_procedure( FT_Byte* *acur, | 454 skip_procedure( FT_Byte* *acur, |
| 455 FT_Byte* limit ) | 455 FT_Byte* limit ) |
| 456 { | 456 { |
| 457 FT_Byte* cur; | 457 FT_Byte* cur; |
| 458 FT_Int embed = 0; | 458 FT_Int embed = 0; |
| 459 FT_Error error = PSaux_Err_Ok; | 459 FT_Error error = FT_Err_Ok; |
| 460 | 460 |
| 461 | 461 |
| 462 FT_ASSERT( **acur == '{' ); | 462 FT_ASSERT( **acur == '{' ); |
| 463 | 463 |
| 464 for ( cur = *acur; cur < limit && error == PSaux_Err_Ok; ++cur ) | 464 for ( cur = *acur; cur < limit && error == FT_Err_Ok; ++cur ) |
| 465 { | 465 { |
| 466 switch ( *cur ) | 466 switch ( *cur ) |
| 467 { | 467 { |
| 468 case '{': | 468 case '{': |
| 469 ++embed; | 469 ++embed; |
| 470 break; | 470 break; |
| 471 | 471 |
| 472 case '}': | 472 case '}': |
| 473 --embed; | 473 --embed; |
| 474 if ( embed == 0 ) | 474 if ( embed == 0 ) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 487 break; | 487 break; |
| 488 | 488 |
| 489 case '%': | 489 case '%': |
| 490 skip_comment( &cur, limit ); | 490 skip_comment( &cur, limit ); |
| 491 break; | 491 break; |
| 492 } | 492 } |
| 493 } | 493 } |
| 494 | 494 |
| 495 end: | 495 end: |
| 496 if ( embed != 0 ) | 496 if ( embed != 0 ) |
| 497 error = PSaux_Err_Invalid_File_Format; | 497 error = FT_THROW( Invalid_File_Format ); |
| 498 | 498 |
| 499 *acur = cur; | 499 *acur = cur; |
| 500 | 500 |
| 501 return error; | 501 return error; |
| 502 } | 502 } |
| 503 | 503 |
| 504 | 504 |
| 505 /***********************************************************************/ | 505 /***********************************************************************/ |
| 506 /* */ | 506 /* */ |
| 507 /* All exported parsing routines handle leading whitespace and stop at */ | 507 /* All exported parsing routines handle leading whitespace and stop at */ |
| 508 /* the first character which isn't part of the just handled token. */ | 508 /* the first character which isn't part of the just handled token. */ |
| 509 /* */ | 509 /* */ |
| 510 /***********************************************************************/ | 510 /***********************************************************************/ |
| 511 | 511 |
| 512 | 512 |
| 513 FT_LOCAL_DEF( void ) | 513 FT_LOCAL_DEF( void ) |
| 514 ps_parser_skip_PS_token( PS_Parser parser ) | 514 ps_parser_skip_PS_token( PS_Parser parser ) |
| 515 { | 515 { |
| 516 /* Note: PostScript allows any non-delimiting, non-whitespace */ | 516 /* Note: PostScript allows any non-delimiting, non-whitespace */ |
| 517 /* character in a name (PS Ref Manual, 3rd ed, p31). */ | 517 /* character in a name (PS Ref Manual, 3rd ed, p31). */ |
| 518 /* PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */ | 518 /* PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */ |
| 519 | 519 |
| 520 FT_Byte* cur = parser->cursor; | 520 FT_Byte* cur = parser->cursor; |
| 521 FT_Byte* limit = parser->limit; | 521 FT_Byte* limit = parser->limit; |
| 522 FT_Error error = PSaux_Err_Ok; | 522 FT_Error error = FT_Err_Ok; |
| 523 | 523 |
| 524 | 524 |
| 525 skip_spaces( &cur, limit ); /* this also skips comments */ | 525 skip_spaces( &cur, limit ); /* this also skips comments */ |
| 526 if ( cur >= limit ) | 526 if ( cur >= limit ) |
| 527 goto Exit; | 527 goto Exit; |
| 528 | 528 |
| 529 /* self-delimiting, single-character tokens */ | 529 /* self-delimiting, single-character tokens */ |
| 530 if ( *cur == '[' || *cur == ']' ) | 530 if ( *cur == '[' || *cur == ']' ) |
| 531 { | 531 { |
| 532 cur++; | 532 cur++; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 560 goto Exit; | 560 goto Exit; |
| 561 } | 561 } |
| 562 | 562 |
| 563 if ( *cur == '>' ) | 563 if ( *cur == '>' ) |
| 564 { | 564 { |
| 565 cur++; | 565 cur++; |
| 566 if ( cur >= limit || *cur != '>' ) /* >> */ | 566 if ( cur >= limit || *cur != '>' ) /* >> */ |
| 567 { | 567 { |
| 568 FT_ERROR(( "ps_parser_skip_PS_token:" | 568 FT_ERROR(( "ps_parser_skip_PS_token:" |
| 569 " unexpected closing delimiter `>'\n" )); | 569 " unexpected closing delimiter `>'\n" )); |
| 570 error = PSaux_Err_Invalid_File_Format; | 570 error = FT_THROW( Invalid_File_Format ); |
| 571 goto Exit; | 571 goto Exit; |
| 572 } | 572 } |
| 573 cur++; | 573 cur++; |
| 574 goto Exit; | 574 goto Exit; |
| 575 } | 575 } |
| 576 | 576 |
| 577 if ( *cur == '/' ) | 577 if ( *cur == '/' ) |
| 578 cur++; | 578 cur++; |
| 579 | 579 |
| 580 /* anything else */ | 580 /* anything else */ |
| 581 while ( cur < limit ) | 581 while ( cur < limit ) |
| 582 { | 582 { |
| 583 /* *cur might be invalid (e.g., ')' or '}'), but this */ | 583 /* *cur might be invalid (e.g., ')' or '}'), but this */ |
| 584 /* is handled by the test `cur == parser->cursor' below */ | 584 /* is handled by the test `cur == parser->cursor' below */ |
| 585 if ( IS_PS_DELIM( *cur ) ) | 585 if ( IS_PS_DELIM( *cur ) ) |
| 586 break; | 586 break; |
| 587 | 587 |
| 588 cur++; | 588 cur++; |
| 589 } | 589 } |
| 590 | 590 |
| 591 Exit: | 591 Exit: |
| 592 if ( cur < limit && cur == parser->cursor ) | 592 if ( cur < limit && cur == parser->cursor ) |
| 593 { | 593 { |
| 594 FT_ERROR(( "ps_parser_skip_PS_token:" | 594 FT_ERROR(( "ps_parser_skip_PS_token:" |
| 595 " current token is `%c' which is self-delimiting\n" | 595 " current token is `%c' which is self-delimiting\n" |
| 596 " " | 596 " " |
| 597 " but invalid at this point\n", | 597 " but invalid at this point\n", |
| 598 *cur )); | 598 *cur )); |
| 599 | 599 |
| 600 error = PSaux_Err_Invalid_File_Format; | 600 error = FT_THROW( Invalid_File_Format ); |
| 601 } | 601 } |
| 602 | 602 |
| 603 parser->error = error; | 603 parser->error = error; |
| 604 parser->cursor = cur; | 604 parser->cursor = cur; |
| 605 } | 605 } |
| 606 | 606 |
| 607 | 607 |
| 608 FT_LOCAL_DEF( void ) | 608 FT_LOCAL_DEF( void ) |
| 609 ps_parser_skip_spaces( PS_Parser parser ) | 609 ps_parser_skip_spaces( PS_Parser parser ) |
| 610 { | 610 { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 637 if ( cur >= limit ) | 637 if ( cur >= limit ) |
| 638 return; | 638 return; |
| 639 | 639 |
| 640 switch ( *cur ) | 640 switch ( *cur ) |
| 641 { | 641 { |
| 642 /************* check for literal string *****************/ | 642 /************* check for literal string *****************/ |
| 643 case '(': | 643 case '(': |
| 644 token->type = T1_TOKEN_TYPE_STRING; | 644 token->type = T1_TOKEN_TYPE_STRING; |
| 645 token->start = cur; | 645 token->start = cur; |
| 646 | 646 |
| 647 if ( skip_literal_string( &cur, limit ) == PSaux_Err_Ok ) | 647 if ( skip_literal_string( &cur, limit ) == FT_Err_Ok ) |
| 648 token->limit = cur; | 648 token->limit = cur; |
| 649 break; | 649 break; |
| 650 | 650 |
| 651 /************* check for programs/array *****************/ | 651 /************* check for programs/array *****************/ |
| 652 case '{': | 652 case '{': |
| 653 token->type = T1_TOKEN_TYPE_ARRAY; | 653 token->type = T1_TOKEN_TYPE_ARRAY; |
| 654 token->start = cur; | 654 token->start = cur; |
| 655 | 655 |
| 656 if ( skip_procedure( &cur, limit ) == PSaux_Err_Ok ) | 656 if ( skip_procedure( &cur, limit ) == FT_Err_Ok ) |
| 657 token->limit = cur; | 657 token->limit = cur; |
| 658 break; | 658 break; |
| 659 | 659 |
| 660 /************* check for table/array ********************/ | 660 /************* check for table/array ********************/ |
| 661 /* XXX: in theory we should also look for "<<" */ | 661 /* XXX: in theory we should also look for "<<" */ |
| 662 /* since this is semantically equivalent to "["; */ | 662 /* since this is semantically equivalent to "["; */ |
| 663 /* in practice it doesn't matter (?) */ | 663 /* in practice it doesn't matter (?) */ |
| 664 case '[': | 664 case '[': |
| 665 token->type = T1_TOKEN_TYPE_ARRAY; | 665 token->type = T1_TOKEN_TYPE_ARRAY; |
| 666 embed = 1; | 666 embed = 1; |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1020 | 1020 |
| 1021 /* load a simple field (i.e. non-table) into the current list of objects */ | 1021 /* load a simple field (i.e. non-table) into the current list of objects */ |
| 1022 | 1022 |
| 1023 FT_LOCAL_DEF( FT_Error ) | 1023 FT_LOCAL_DEF( FT_Error ) |
| 1024 ps_parser_load_field( PS_Parser parser, | 1024 ps_parser_load_field( PS_Parser parser, |
| 1025 const T1_Field field, | 1025 const T1_Field field, |
| 1026 void** objects, | 1026 void** objects, |
| 1027 FT_UInt max_objects, | 1027 FT_UInt max_objects, |
| 1028 FT_ULong* pflags ) | 1028 FT_ULong* pflags ) |
| 1029 { | 1029 { |
| 1030 T1_TokenRec token; | 1030 T1_TokenRec token; |
| 1031 FT_Byte* cur; | 1031 FT_Byte* cur; |
| 1032 FT_Byte* limit; | 1032 FT_Byte* limit; |
| 1033 FT_UInt count; | 1033 FT_UInt count; |
| 1034 FT_UInt idx; | 1034 FT_UInt idx; |
| 1035 FT_Error error; | 1035 FT_Error error; |
| 1036 T1_FieldType type; |
| 1036 | 1037 |
| 1037 | 1038 |
| 1038 /* this also skips leading whitespace */ | 1039 /* this also skips leading whitespace */ |
| 1039 ps_parser_to_token( parser, &token ); | 1040 ps_parser_to_token( parser, &token ); |
| 1040 if ( !token.type ) | 1041 if ( !token.type ) |
| 1041 goto Fail; | 1042 goto Fail; |
| 1042 | 1043 |
| 1043 count = 1; | 1044 count = 1; |
| 1044 idx = 0; | 1045 idx = 0; |
| 1045 cur = token.start; | 1046 cur = token.start; |
| 1046 limit = token.limit; | 1047 limit = token.limit; |
| 1047 | 1048 |
| 1049 type = field->type; |
| 1050 |
| 1048 /* we must detect arrays in /FontBBox */ | 1051 /* we must detect arrays in /FontBBox */ |
| 1049 if ( field->type == T1_FIELD_TYPE_BBOX ) | 1052 if ( type == T1_FIELD_TYPE_BBOX ) |
| 1050 { | 1053 { |
| 1051 T1_TokenRec token2; | 1054 T1_TokenRec token2; |
| 1052 FT_Byte* old_cur = parser->cursor; | 1055 FT_Byte* old_cur = parser->cursor; |
| 1053 FT_Byte* old_limit = parser->limit; | 1056 FT_Byte* old_limit = parser->limit; |
| 1054 | 1057 |
| 1055 | 1058 |
| 1056 /* don't include delimiters */ | 1059 /* don't include delimiters */ |
| 1057 parser->cursor = token.start + 1; | 1060 parser->cursor = token.start + 1; |
| 1058 parser->limit = token.limit - 1; | 1061 parser->limit = token.limit - 1; |
| 1059 | 1062 |
| 1060 ps_parser_to_token( parser, &token2 ); | 1063 ps_parser_to_token( parser, &token2 ); |
| 1061 parser->cursor = old_cur; | 1064 parser->cursor = old_cur; |
| 1062 parser->limit = old_limit; | 1065 parser->limit = old_limit; |
| 1063 | 1066 |
| 1064 if ( token2.type == T1_TOKEN_TYPE_ARRAY ) | 1067 if ( token2.type == T1_TOKEN_TYPE_ARRAY ) |
| 1068 { |
| 1069 type = T1_FIELD_TYPE_MM_BBOX; |
| 1065 goto FieldArray; | 1070 goto FieldArray; |
| 1071 } |
| 1066 } | 1072 } |
| 1067 else if ( token.type == T1_TOKEN_TYPE_ARRAY ) | 1073 else if ( token.type == T1_TOKEN_TYPE_ARRAY ) |
| 1068 { | 1074 { |
| 1075 count = max_objects; |
| 1076 |
| 1069 FieldArray: | 1077 FieldArray: |
| 1070 /* if this is an array and we have no blend, an error occurs */ | 1078 /* if this is an array and we have no blend, an error occurs */ |
| 1071 if ( max_objects == 0 ) | 1079 if ( max_objects == 0 ) |
| 1072 goto Fail; | 1080 goto Fail; |
| 1073 | 1081 |
| 1074 count = max_objects; | 1082 idx = 1; |
| 1075 idx = 1; | |
| 1076 | 1083 |
| 1077 /* don't include delimiters */ | 1084 /* don't include delimiters */ |
| 1078 cur++; | 1085 cur++; |
| 1079 limit--; | 1086 limit--; |
| 1080 } | 1087 } |
| 1081 | 1088 |
| 1082 for ( ; count > 0; count--, idx++ ) | 1089 for ( ; count > 0; count--, idx++ ) |
| 1083 { | 1090 { |
| 1084 FT_Byte* q = (FT_Byte*)objects[idx] + field->offset; | 1091 FT_Byte* q = (FT_Byte*)objects[idx] + field->offset; |
| 1085 FT_Long val; | 1092 FT_Long val; |
| 1086 FT_String* string; | 1093 FT_String* string; |
| 1087 | 1094 |
| 1088 | 1095 |
| 1089 skip_spaces( &cur, limit ); | 1096 skip_spaces( &cur, limit ); |
| 1090 | 1097 |
| 1091 switch ( field->type ) | 1098 switch ( type ) |
| 1092 { | 1099 { |
| 1093 case T1_FIELD_TYPE_BOOL: | 1100 case T1_FIELD_TYPE_BOOL: |
| 1094 val = ps_tobool( &cur, limit ); | 1101 val = ps_tobool( &cur, limit ); |
| 1095 goto Store_Integer; | 1102 goto Store_Integer; |
| 1096 | 1103 |
| 1097 case T1_FIELD_TYPE_FIXED: | 1104 case T1_FIELD_TYPE_FIXED: |
| 1098 val = PS_Conv_ToFixed( &cur, limit, 0 ); | 1105 val = PS_Conv_ToFixed( &cur, limit, 0 ); |
| 1099 goto Store_Integer; | 1106 goto Store_Integer; |
| 1100 | 1107 |
| 1101 case T1_FIELD_TYPE_FIXED_1000: | 1108 case T1_FIELD_TYPE_FIXED_1000: |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1153 cur++; | 1160 cur++; |
| 1154 len -= 2; | 1161 len -= 2; |
| 1155 } | 1162 } |
| 1156 else | 1163 else |
| 1157 { | 1164 { |
| 1158 FT_ERROR(( "ps_parser_load_field:" | 1165 FT_ERROR(( "ps_parser_load_field:" |
| 1159 " expected a name or string\n" | 1166 " expected a name or string\n" |
| 1160 " " | 1167 " " |
| 1161 " but found token of type %d instead\n", | 1168 " but found token of type %d instead\n", |
| 1162 token.type )); | 1169 token.type )); |
| 1163 error = PSaux_Err_Invalid_File_Format; | 1170 error = FT_THROW( Invalid_File_Format ); |
| 1164 goto Exit; | 1171 goto Exit; |
| 1165 } | 1172 } |
| 1166 | 1173 |
| 1167 /* for this to work (FT_String**)q must have been */ | 1174 /* for this to work (FT_String**)q must have been */ |
| 1168 /* initialized to NULL */ | 1175 /* initialized to NULL */ |
| 1169 if ( *(FT_String**)q != NULL ) | 1176 if ( *(FT_String**)q != NULL ) |
| 1170 { | 1177 { |
| 1171 FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n", | 1178 FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n", |
| 1172 field->ident )); | 1179 field->ident )); |
| 1173 FT_FREE( *(FT_String**)q ); | 1180 FT_FREE( *(FT_String**)q ); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1190 FT_BBox* bbox = (FT_BBox*)q; | 1197 FT_BBox* bbox = (FT_BBox*)q; |
| 1191 FT_Int result; | 1198 FT_Int result; |
| 1192 | 1199 |
| 1193 | 1200 |
| 1194 result = ps_tofixedarray( &cur, limit, 4, temp, 0 ); | 1201 result = ps_tofixedarray( &cur, limit, 4, temp, 0 ); |
| 1195 | 1202 |
| 1196 if ( result < 0 ) | 1203 if ( result < 0 ) |
| 1197 { | 1204 { |
| 1198 FT_ERROR(( "ps_parser_load_field:" | 1205 FT_ERROR(( "ps_parser_load_field:" |
| 1199 " expected four integers in bounding box\n" )); | 1206 " expected four integers in bounding box\n" )); |
| 1200 error = PSaux_Err_Invalid_File_Format; | 1207 error = FT_THROW( Invalid_File_Format ); |
| 1201 goto Exit; | 1208 goto Exit; |
| 1202 } | 1209 } |
| 1203 | 1210 |
| 1204 bbox->xMin = FT_RoundFix( temp[0] ); | 1211 bbox->xMin = FT_RoundFix( temp[0] ); |
| 1205 bbox->yMin = FT_RoundFix( temp[1] ); | 1212 bbox->yMin = FT_RoundFix( temp[1] ); |
| 1206 bbox->xMax = FT_RoundFix( temp[2] ); | 1213 bbox->xMax = FT_RoundFix( temp[2] ); |
| 1207 bbox->yMax = FT_RoundFix( temp[3] ); | 1214 bbox->yMax = FT_RoundFix( temp[3] ); |
| 1208 } | 1215 } |
| 1209 break; | 1216 break; |
| 1210 | 1217 |
| 1218 case T1_FIELD_TYPE_MM_BBOX: |
| 1219 { |
| 1220 FT_Memory memory = parser->memory; |
| 1221 FT_Fixed* temp; |
| 1222 FT_Int result; |
| 1223 FT_UInt i; |
| 1224 |
| 1225 |
| 1226 if ( FT_NEW_ARRAY( temp, max_objects * 4 ) ) |
| 1227 goto Exit; |
| 1228 |
| 1229 for ( i = 0; i < 4; i++ ) |
| 1230 { |
| 1231 result = ps_tofixedarray( &cur, limit, max_objects, |
| 1232 temp + i * max_objects, 0 ); |
| 1233 if ( result < 0 ) |
| 1234 { |
| 1235 FT_ERROR(( "ps_parser_load_field:" |
| 1236 " expected %d integers in the %s subarray\n" |
| 1237 " " |
| 1238 " of /FontBBox in the /Blend dictionary\n", |
| 1239 max_objects, |
| 1240 i == 0 ? "first" |
| 1241 : ( i == 1 ? "second" |
| 1242 : ( i == 2 ? "third" |
| 1243 : "fourth" ) ) )); |
| 1244 error = FT_THROW( Invalid_File_Format ); |
| 1245 goto Exit; |
| 1246 } |
| 1247 |
| 1248 skip_spaces( &cur, limit ); |
| 1249 } |
| 1250 |
| 1251 for ( i = 0; i < max_objects; i++ ) |
| 1252 { |
| 1253 FT_BBox* bbox = (FT_BBox*)objects[i]; |
| 1254 |
| 1255 |
| 1256 bbox->xMin = FT_RoundFix( temp[i ] ); |
| 1257 bbox->yMin = FT_RoundFix( temp[i + max_objects] ); |
| 1258 bbox->xMax = FT_RoundFix( temp[i + 2 * max_objects] ); |
| 1259 bbox->yMax = FT_RoundFix( temp[i + 3 * max_objects] ); |
| 1260 } |
| 1261 |
| 1262 FT_FREE( temp ); |
| 1263 } |
| 1264 break; |
| 1265 |
| 1211 default: | 1266 default: |
| 1212 /* an error occurred */ | 1267 /* an error occurred */ |
| 1213 goto Fail; | 1268 goto Fail; |
| 1214 } | 1269 } |
| 1215 } | 1270 } |
| 1216 | 1271 |
| 1217 #if 0 /* obsolete -- keep for reference */ | 1272 #if 0 /* obsolete -- keep for reference */ |
| 1218 if ( pflags ) | 1273 if ( pflags ) |
| 1219 *pflags |= 1L << field->flag_bit; | 1274 *pflags |= 1L << field->flag_bit; |
| 1220 #else | 1275 #else |
| 1221 FT_UNUSED( pflags ); | 1276 FT_UNUSED( pflags ); |
| 1222 #endif | 1277 #endif |
| 1223 | 1278 |
| 1224 error = PSaux_Err_Ok; | 1279 error = FT_Err_Ok; |
| 1225 | 1280 |
| 1226 Exit: | 1281 Exit: |
| 1227 return error; | 1282 return error; |
| 1228 | 1283 |
| 1229 Fail: | 1284 Fail: |
| 1230 error = PSaux_Err_Invalid_File_Format; | 1285 error = FT_THROW( Invalid_File_Format ); |
| 1231 goto Exit; | 1286 goto Exit; |
| 1232 } | 1287 } |
| 1233 | 1288 |
| 1234 | 1289 |
| 1235 #define T1_MAX_TABLE_ELEMENTS 32 | 1290 #define T1_MAX_TABLE_ELEMENTS 32 |
| 1236 | 1291 |
| 1237 | 1292 |
| 1238 FT_LOCAL_DEF( FT_Error ) | 1293 FT_LOCAL_DEF( FT_Error ) |
| 1239 ps_parser_load_field_table( PS_Parser parser, | 1294 ps_parser_load_field_table( PS_Parser parser, |
| 1240 const T1_Field field, | 1295 const T1_Field field, |
| 1241 void** objects, | 1296 void** objects, |
| 1242 FT_UInt max_objects, | 1297 FT_UInt max_objects, |
| 1243 FT_ULong* pflags ) | 1298 FT_ULong* pflags ) |
| 1244 { | 1299 { |
| 1245 T1_TokenRec elements[T1_MAX_TABLE_ELEMENTS]; | 1300 T1_TokenRec elements[T1_MAX_TABLE_ELEMENTS]; |
| 1246 T1_Token token; | 1301 T1_Token token; |
| 1247 FT_Int num_elements; | 1302 FT_Int num_elements; |
| 1248 FT_Error error = PSaux_Err_Ok; | 1303 FT_Error error = FT_Err_Ok; |
| 1249 FT_Byte* old_cursor; | 1304 FT_Byte* old_cursor; |
| 1250 FT_Byte* old_limit; | 1305 FT_Byte* old_limit; |
| 1251 T1_FieldRec fieldrec = *(T1_Field)field; | 1306 T1_FieldRec fieldrec = *(T1_Field)field; |
| 1252 | 1307 |
| 1253 | 1308 |
| 1254 fieldrec.type = T1_FIELD_TYPE_INTEGER; | 1309 fieldrec.type = T1_FIELD_TYPE_INTEGER; |
| 1255 if ( field->type == T1_FIELD_TYPE_FIXED_ARRAY || | 1310 if ( field->type == T1_FIELD_TYPE_FIXED_ARRAY || |
| 1256 field->type == T1_FIELD_TYPE_BBOX ) | 1311 field->type == T1_FIELD_TYPE_BBOX ) |
| 1257 fieldrec.type = T1_FIELD_TYPE_FIXED; | 1312 fieldrec.type = T1_FIELD_TYPE_FIXED; |
| 1258 | 1313 |
| 1259 ps_parser_to_token_array( parser, elements, | 1314 ps_parser_to_token_array( parser, elements, |
| 1260 T1_MAX_TABLE_ELEMENTS, &num_elements ); | 1315 T1_MAX_TABLE_ELEMENTS, &num_elements ); |
| 1261 if ( num_elements < 0 ) | 1316 if ( num_elements < 0 ) |
| 1262 { | 1317 { |
| 1263 error = PSaux_Err_Ignore; | 1318 error = FT_ERR( Ignore ); |
| 1264 goto Exit; | 1319 goto Exit; |
| 1265 } | 1320 } |
| 1266 if ( (FT_UInt)num_elements > field->array_max ) | 1321 if ( (FT_UInt)num_elements > field->array_max ) |
| 1267 num_elements = field->array_max; | 1322 num_elements = field->array_max; |
| 1268 | 1323 |
| 1269 old_cursor = parser->cursor; | 1324 old_cursor = parser->cursor; |
| 1270 old_limit = parser->limit; | 1325 old_limit = parser->limit; |
| 1271 | 1326 |
| 1272 /* we store the elements count if necessary; */ | 1327 /* we store the elements count if necessary; */ |
| 1273 /* we further assume that `count_offset' can't be zero */ | 1328 /* we further assume that `count_offset' can't be zero */ |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1310 | 1365 |
| 1311 /* first character must be `<' if `delimiters' is non-zero */ | 1366 /* first character must be `<' if `delimiters' is non-zero */ |
| 1312 | 1367 |
| 1313 FT_LOCAL_DEF( FT_Error ) | 1368 FT_LOCAL_DEF( FT_Error ) |
| 1314 ps_parser_to_bytes( PS_Parser parser, | 1369 ps_parser_to_bytes( PS_Parser parser, |
| 1315 FT_Byte* bytes, | 1370 FT_Byte* bytes, |
| 1316 FT_Offset max_bytes, | 1371 FT_Offset max_bytes, |
| 1317 FT_Long* pnum_bytes, | 1372 FT_Long* pnum_bytes, |
| 1318 FT_Bool delimiters ) | 1373 FT_Bool delimiters ) |
| 1319 { | 1374 { |
| 1320 FT_Error error = PSaux_Err_Ok; | 1375 FT_Error error = FT_Err_Ok; |
| 1321 FT_Byte* cur; | 1376 FT_Byte* cur; |
| 1322 | 1377 |
| 1323 | 1378 |
| 1324 ps_parser_skip_spaces( parser ); | 1379 ps_parser_skip_spaces( parser ); |
| 1325 cur = parser->cursor; | 1380 cur = parser->cursor; |
| 1326 | 1381 |
| 1327 if ( cur >= parser->limit ) | 1382 if ( cur >= parser->limit ) |
| 1328 goto Exit; | 1383 goto Exit; |
| 1329 | 1384 |
| 1330 if ( delimiters ) | 1385 if ( delimiters ) |
| 1331 { | 1386 { |
| 1332 if ( *cur != '<' ) | 1387 if ( *cur != '<' ) |
| 1333 { | 1388 { |
| 1334 FT_ERROR(( "ps_parser_to_bytes: Missing starting delimiter `<'\n" )); | 1389 FT_ERROR(( "ps_parser_to_bytes: Missing starting delimiter `<'\n" )); |
| 1335 error = PSaux_Err_Invalid_File_Format; | 1390 error = FT_THROW( Invalid_File_Format ); |
| 1336 goto Exit; | 1391 goto Exit; |
| 1337 } | 1392 } |
| 1338 | 1393 |
| 1339 cur++; | 1394 cur++; |
| 1340 } | 1395 } |
| 1341 | 1396 |
| 1342 *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur, | 1397 *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur, |
| 1343 parser->limit, | 1398 parser->limit, |
| 1344 bytes, | 1399 bytes, |
| 1345 max_bytes ); | 1400 max_bytes ); |
| 1346 | 1401 |
| 1347 if ( delimiters ) | 1402 if ( delimiters ) |
| 1348 { | 1403 { |
| 1349 if ( cur < parser->limit && *cur != '>' ) | 1404 if ( cur < parser->limit && *cur != '>' ) |
| 1350 { | 1405 { |
| 1351 FT_ERROR(( "ps_parser_to_bytes: Missing closing delimiter `>'\n" )); | 1406 FT_ERROR(( "ps_parser_to_bytes: Missing closing delimiter `>'\n" )); |
| 1352 error = PSaux_Err_Invalid_File_Format; | 1407 error = FT_THROW( Invalid_File_Format ); |
| 1353 goto Exit; | 1408 goto Exit; |
| 1354 } | 1409 } |
| 1355 | 1410 |
| 1356 cur++; | 1411 cur++; |
| 1357 } | 1412 } |
| 1358 | 1413 |
| 1359 parser->cursor = cur; | 1414 parser->cursor = cur; |
| 1360 | 1415 |
| 1361 Exit: | 1416 Exit: |
| 1362 return error; | 1417 return error; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1412 | 1467 |
| 1413 #endif /* 0 */ | 1468 #endif /* 0 */ |
| 1414 | 1469 |
| 1415 | 1470 |
| 1416 FT_LOCAL_DEF( void ) | 1471 FT_LOCAL_DEF( void ) |
| 1417 ps_parser_init( PS_Parser parser, | 1472 ps_parser_init( PS_Parser parser, |
| 1418 FT_Byte* base, | 1473 FT_Byte* base, |
| 1419 FT_Byte* limit, | 1474 FT_Byte* limit, |
| 1420 FT_Memory memory ) | 1475 FT_Memory memory ) |
| 1421 { | 1476 { |
| 1422 parser->error = PSaux_Err_Ok; | 1477 parser->error = FT_Err_Ok; |
| 1423 parser->base = base; | 1478 parser->base = base; |
| 1424 parser->limit = limit; | 1479 parser->limit = limit; |
| 1425 parser->cursor = base; | 1480 parser->cursor = base; |
| 1426 parser->memory = memory; | 1481 parser->memory = memory; |
| 1427 parser->funcs = ps_parser_funcs; | 1482 parser->funcs = ps_parser_funcs; |
| 1428 } | 1483 } |
| 1429 | 1484 |
| 1430 | 1485 |
| 1431 FT_LOCAL_DEF( void ) | 1486 FT_LOCAL_DEF( void ) |
| 1432 ps_parser_done( PS_Parser parser ) | 1487 ps_parser_done( PS_Parser parser ) |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1585 t1_builder_add_contour( T1_Builder builder ) | 1640 t1_builder_add_contour( T1_Builder builder ) |
| 1586 { | 1641 { |
| 1587 FT_Outline* outline = builder->current; | 1642 FT_Outline* outline = builder->current; |
| 1588 FT_Error error; | 1643 FT_Error error; |
| 1589 | 1644 |
| 1590 | 1645 |
| 1591 /* this might happen in invalid fonts */ | 1646 /* this might happen in invalid fonts */ |
| 1592 if ( !outline ) | 1647 if ( !outline ) |
| 1593 { | 1648 { |
| 1594 FT_ERROR(( "t1_builder_add_contour: no outline to add points to\n" )); | 1649 FT_ERROR(( "t1_builder_add_contour: no outline to add points to\n" )); |
| 1595 return PSaux_Err_Invalid_File_Format; | 1650 return FT_THROW( Invalid_File_Format ); |
| 1596 } | 1651 } |
| 1597 | 1652 |
| 1598 if ( !builder->load_points ) | 1653 if ( !builder->load_points ) |
| 1599 { | 1654 { |
| 1600 outline->n_contours++; | 1655 outline->n_contours++; |
| 1601 return PSaux_Err_Ok; | 1656 return FT_Err_Ok; |
| 1602 } | 1657 } |
| 1603 | 1658 |
| 1604 error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); | 1659 error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); |
| 1605 if ( !error ) | 1660 if ( !error ) |
| 1606 { | 1661 { |
| 1607 if ( outline->n_contours > 0 ) | 1662 if ( outline->n_contours > 0 ) |
| 1608 outline->contours[outline->n_contours - 1] = | 1663 outline->contours[outline->n_contours - 1] = |
| 1609 (short)( outline->n_points - 1 ); | 1664 (short)( outline->n_points - 1 ); |
| 1610 | 1665 |
| 1611 outline->n_contours++; | 1666 outline->n_contours++; |
| 1612 } | 1667 } |
| 1613 | 1668 |
| 1614 return error; | 1669 return error; |
| 1615 } | 1670 } |
| 1616 | 1671 |
| 1617 | 1672 |
| 1618 /* if a path was begun, add its first on-curve point */ | 1673 /* if a path was begun, add its first on-curve point */ |
| 1619 FT_LOCAL_DEF( FT_Error ) | 1674 FT_LOCAL_DEF( FT_Error ) |
| 1620 t1_builder_start_point( T1_Builder builder, | 1675 t1_builder_start_point( T1_Builder builder, |
| 1621 FT_Pos x, | 1676 FT_Pos x, |
| 1622 FT_Pos y ) | 1677 FT_Pos y ) |
| 1623 { | 1678 { |
| 1624 FT_Error error = PSaux_Err_Invalid_File_Format; | 1679 FT_Error error = FT_ERR( Invalid_File_Format ); |
| 1625 | 1680 |
| 1626 | 1681 |
| 1627 /* test whether we are building a new contour */ | 1682 /* test whether we are building a new contour */ |
| 1628 | 1683 |
| 1629 if ( builder->parse_state == T1_Parse_Have_Path ) | 1684 if ( builder->parse_state == T1_Parse_Have_Path ) |
| 1630 error = PSaux_Err_Ok; | 1685 error = FT_Err_Ok; |
| 1631 else | 1686 else |
| 1632 { | 1687 { |
| 1633 builder->parse_state = T1_Parse_Have_Path; | 1688 builder->parse_state = T1_Parse_Have_Path; |
| 1634 error = t1_builder_add_contour( builder ); | 1689 error = t1_builder_add_contour( builder ); |
| 1635 if ( !error ) | 1690 if ( !error ) |
| 1636 error = t1_builder_add_point1( builder, x, y ); | 1691 error = t1_builder_add_point1( builder, x, y ); |
| 1637 } | 1692 } |
| 1638 | 1693 |
| 1639 return error; | 1694 return error; |
| 1640 } | 1695 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1701 { | 1756 { |
| 1702 PS_Conv_EexecDecode( &buffer, | 1757 PS_Conv_EexecDecode( &buffer, |
| 1703 buffer + length, | 1758 buffer + length, |
| 1704 buffer, | 1759 buffer, |
| 1705 length, | 1760 length, |
| 1706 &seed ); | 1761 &seed ); |
| 1707 } | 1762 } |
| 1708 | 1763 |
| 1709 | 1764 |
| 1710 /* END */ | 1765 /* END */ |
| OLD | NEW |