| 546 | | char *psz_fontname = NULL; |
|---|
| 547 | | int i_font_color = p_sys->i_font_color; |
|---|
| 548 | | int i_font_alpha = 0; |
|---|
| 549 | | int i_font_size = p_sys->i_font_size; |
|---|
| 550 | | |
|---|
| 551 | | if( VLC_SUCCESS == PeekFont( p_fonts, &psz_fontname, &i_font_size, &i_font_color, &i_font_alpha ) ) |
|---|
| 552 | | { |
|---|
| 553 | | p_style = CreateStyle( psz_fontname, i_font_size, i_font_color, i_font_alpha, |
|---|
| | 544 | char *psz_fontname = NULL; |
|---|
| | 545 | uint32_t i_font_color = p_sys->i_font_color; |
|---|
| | 546 | int i_font_size = p_sys->i_font_size; |
|---|
| | 547 | |
|---|
| | 548 | if( VLC_SUCCESS == PeekFont( p_fonts, &psz_fontname, &i_font_size, &i_font_color ) ) |
|---|
| | 549 | { |
|---|
| | 550 | p_style = CreateStyle( psz_fontname, i_font_size, i_font_color, |
|---|
| 559 | | static int ProcessNodes( filter_t *p_filter, xml_reader_t *p_xml_reader, |
|---|
| 560 | | text_style_t *p_font_style, UniChar *psz_text, int *pi_len, |
|---|
| 561 | | uint32_t *pi_runs, uint32_t **ppi_run_lengths, |
|---|
| 562 | | ATSUStyle **ppp_styles) |
|---|
| | 556 | static int HandleFontAttributes( xml_reader_t *p_xml_reader, |
|---|
| | 557 | font_stack_t **p_fonts ) |
|---|
| | 558 | { |
|---|
| | 559 | int rv; |
|---|
| | 560 | char *psz_fontname = NULL; |
|---|
| | 561 | uint32_t i_font_color = 0xffffff; |
|---|
| | 562 | int i_font_alpha = 0; |
|---|
| | 563 | int i_font_size = 24; |
|---|
| | 564 | |
|---|
| | 565 | // Default all attributes to the top font in the stack -- in case not |
|---|
| | 566 | // all attributes are specified in the sub-font |
|---|
| | 567 | if( VLC_SUCCESS == PeekFont( p_fonts, |
|---|
| | 568 | &psz_fontname, |
|---|
| | 569 | &i_font_size, |
|---|
| | 570 | &i_font_color )) |
|---|
| | 571 | { |
|---|
| | 572 | psz_fontname = strdup( psz_fontname ); |
|---|
| | 573 | } |
|---|
| | 574 | i_font_alpha = (i_font_color >> 24) & 0xff; |
|---|
| | 575 | i_font_color &= 0x00ffffff; |
|---|
| | 576 | |
|---|
| | 577 | while ( xml_ReaderNextAttr( p_xml_reader ) == VLC_SUCCESS ) |
|---|
| | 578 | { |
|---|
| | 579 | char *psz_name = xml_ReaderName( p_xml_reader ); |
|---|
| | 580 | char *psz_value = xml_ReaderValue( p_xml_reader ); |
|---|
| | 581 | |
|---|
| | 582 | if( psz_name && psz_value ) |
|---|
| | 583 | { |
|---|
| | 584 | if( !strcasecmp( "face", psz_name ) ) |
|---|
| | 585 | { |
|---|
| | 586 | if( psz_fontname ) free( psz_fontname ); |
|---|
| | 587 | psz_fontname = strdup( psz_value ); |
|---|
| | 588 | } |
|---|
| | 589 | else if( !strcasecmp( "size", psz_name ) ) |
|---|
| | 590 | { |
|---|
| | 591 | if( ( *psz_value == '+' ) || ( *psz_value == '-' ) ) |
|---|
| | 592 | { |
|---|
| | 593 | int i_value = atoi( psz_value ); |
|---|
| | 594 | |
|---|
| | 595 | if( ( i_value >= -5 ) && ( i_value <= 5 ) ) |
|---|
| | 596 | i_font_size += ( i_value * i_font_size ) / 10; |
|---|
| | 597 | else if( i_value < -5 ) |
|---|
| | 598 | i_font_size = - i_value; |
|---|
| | 599 | else if( i_value > 5 ) |
|---|
| | 600 | i_font_size = i_value; |
|---|
| | 601 | } |
|---|
| | 602 | else |
|---|
| | 603 | i_font_size = atoi( psz_value ); |
|---|
| | 604 | } |
|---|
| | 605 | else if( !strcasecmp( "color", psz_name ) && |
|---|
| | 606 | ( psz_value[0] == '#' ) ) |
|---|
| | 607 | { |
|---|
| | 608 | i_font_color = strtol( psz_value + 1, NULL, 16 ); |
|---|
| | 609 | i_font_color &= 0x00ffffff; |
|---|
| | 610 | } |
|---|
| | 611 | else if( !strcasecmp( "alpha", psz_name ) && |
|---|
| | 612 | ( psz_value[0] == '#' ) ) |
|---|
| | 613 | { |
|---|
| | 614 | i_font_alpha = strtol( psz_value + 1, NULL, 16 ); |
|---|
| | 615 | i_font_alpha &= 0xff; |
|---|
| | 616 | } |
|---|
| | 617 | free( psz_name ); |
|---|
| | 618 | free( psz_value ); |
|---|
| | 619 | } |
|---|
| | 620 | } |
|---|
| | 621 | rv = PushFont( p_fonts, |
|---|
| | 622 | psz_fontname, |
|---|
| | 623 | i_font_size, |
|---|
| | 624 | (i_font_color & 0xffffff) | ((i_font_alpha & 0xff) << 24)); |
|---|
| | 625 | |
|---|
| | 626 | free( psz_fontname ); |
|---|
| | 627 | |
|---|
| | 628 | return rv; |
|---|
| | 629 | } |
|---|
| | 630 | |
|---|
| | 631 | static int ProcessNodes( filter_t *p_filter, |
|---|
| | 632 | xml_reader_t *p_xml_reader, |
|---|
| | 633 | text_style_t *p_font_style, |
|---|
| | 634 | UniChar *psz_text, |
|---|
| | 635 | int *pi_len, |
|---|
| | 636 | |
|---|
| | 637 | uint32_t *pi_runs, |
|---|
| | 638 | uint32_t **ppi_run_lengths, |
|---|
| | 639 | ATSUStyle **ppp_styles ) |
|---|
| 628 | | { |
|---|
| 629 | | char *psz_fontname = NULL; |
|---|
| 630 | | int i_font_color = 0xffffff; |
|---|
| 631 | | int i_font_alpha = 0; |
|---|
| 632 | | int i_font_size = 24; |
|---|
| 633 | | |
|---|
| 634 | | // Default all attributes to the top font in the stack -- in case not |
|---|
| 635 | | // all attributes are specified in the sub-font |
|---|
| 636 | | if( VLC_SUCCESS == PeekFont( &p_fonts, &psz_fontname, &i_font_size, &i_font_color, &i_font_alpha )) |
|---|
| 637 | | { |
|---|
| 638 | | psz_fontname = strdup( psz_fontname ); |
|---|
| 639 | | } |
|---|
| 640 | | |
|---|
| 641 | | while ( xml_ReaderNextAttr( p_xml_reader ) == VLC_SUCCESS ) |
|---|
| 642 | | { |
|---|
| 643 | | char *psz_name = xml_ReaderName ( p_xml_reader ); |
|---|
| 644 | | char *psz_value = xml_ReaderValue ( p_xml_reader ); |
|---|
| 645 | | |
|---|
| 646 | | if( psz_name && psz_value ) |
|---|
| 647 | | { |
|---|
| 648 | | if( !strcasecmp( "face", psz_name ) ) |
|---|
| 649 | | { |
|---|
| 650 | | if( psz_fontname ) free( psz_fontname ); |
|---|
| 651 | | psz_fontname = strdup( psz_value ); |
|---|
| 652 | | } |
|---|
| 653 | | else if( !strcasecmp( "size", psz_name ) ) |
|---|
| 654 | | { |
|---|
| 655 | | if( ( *psz_value == '+' ) || ( *psz_value == '-' ) ) |
|---|
| 656 | | { |
|---|
| 657 | | int i_value = atoi( psz_value ); |
|---|
| 658 | | |
|---|
| 659 | | if( ( i_value >= -5 ) && ( i_value <= 5 ) ) |
|---|
| 660 | | i_font_size += ( i_value * i_font_size ) / 10; |
|---|
| 661 | | else if( i_value < -5 ) |
|---|
| 662 | | i_font_size = - i_value; |
|---|
| 663 | | else if( i_value > 5 ) |
|---|
| 664 | | i_font_size = i_value; |
|---|
| 665 | | } |
|---|
| 666 | | else |
|---|
| 667 | | i_font_size = atoi( psz_value ); |
|---|
| 668 | | } |
|---|
| 669 | | else if( !strcasecmp( "color", psz_name ) && |
|---|
| 670 | | ( psz_value[0] == '#' ) ) |
|---|
| 671 | | { |
|---|
| 672 | | i_font_color = strtol( psz_value+1, NULL, 16 ); |
|---|
| 673 | | i_font_color &= 0x00ffffff; |
|---|
| 674 | | } |
|---|
| 675 | | else if( !strcasecmp( "alpha", psz_name ) && |
|---|
| 676 | | ( psz_value[0] == '#' ) ) |
|---|
| 677 | | { |
|---|
| 678 | | i_font_alpha = strtol( psz_value+1, NULL, 16 ); |
|---|
| 679 | | i_font_alpha &= 0xff; |
|---|
| 680 | | } |
|---|
| 681 | | free( psz_name ); |
|---|
| 682 | | free( psz_value ); |
|---|
| 683 | | } |
|---|
| 684 | | } |
|---|
| 685 | | PushFont( &p_fonts, psz_fontname, i_font_size, i_font_color, i_font_alpha ); |
|---|
| 686 | | free( psz_fontname ); |
|---|
| 687 | | } |
|---|
| | 705 | rv = HandleFontAttributes( p_xml_reader, &p_fonts ); |
|---|