Changeset e2da2cb0c94079b214901e3725e3add851459675

Show
Ignore:
Timestamp:
24/08/07 08:46:49 (1 year ago)
Author:
Bernie Purcell <bitmap@videolan.org>
git-committer:
Bernie Purcell <bitmap@videolan.org> 1187938009 +0000
git-parent:

[69b82164520ed115be45a42d528fee45f3ca02de]

git-author:
Bernie Purcell <bitmap@videolan.org> 1187938009 +0000
Message:

RGB and alpha --> ARGB - similar to freetype.c
Remove an imbrication in XML parsing, again similar to freetype.c

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • modules/misc/quartztext.c

    r69b8216 re2da2cb  
    6464                       ATSUStyle *pp_styles ); 
    6565static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size, 
    66                               int i_font_color, int i_font_alpha
     66                              uint32_t i_font_color
    6767                              vlc_bool_t b_bold, vlc_bool_t b_italic, 
    6868                              vlc_bool_t b_uline ); 
     
    9292    char          *psz_name; 
    9393    int            i_size; 
    94     int            i_color; 
    95     int            i_alpha; 
     94    uint32_t       i_color; 
    9695 
    9796    font_stack_t  *p_next; 
     
    383382    { 
    384383        ATSUStyle p_style = CreateStyle( p_sys->psz_font_name, i_font_size, 
    385                                          i_font_color, i_font_alpha, 
     384                                         (i_font_color & 0xfffffff) | 
     385                                         ((i_font_alpha & 0xff) << 24), 
    386386                                         VLC_FALSE, VLC_FALSE, VLC_FALSE ); 
    387387        if( p_style ) 
     
    399399 
    400400 
    401 static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size, int i_font_color, int i_font_alpha
     401static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size, uint32_t i_font_color
    402402                              vlc_bool_t b_bold, vlc_bool_t b_italic, vlc_bool_t b_uline ) 
    403403{ 
     
    409409    float f_green = (float)(( i_font_color & 0x0000FF00 ) >>  8) / 255.0; 
    410410    float f_blue  = (float)(  i_font_color & 0x000000FF        ) / 255.0; 
    411     float f_alpha = ( 255.0 - (float)i_font_alpha) / 255.0; 
     411    float f_alpha = ( 255.0 - (float)(( i_font_color & 0xFF000000 ) >> 24)) / 255.0; 
    412412 
    413413    ATSUFontID           font; 
     
    452452 
    453453static int PushFont( font_stack_t **p_font, const char *psz_name, int i_size, 
    454                      int i_color, int i_alpha
     454                     uint32_t i_color
    455455{ 
    456456    font_stack_t *p_new; 
     
    472472    p_new->i_size   = i_size; 
    473473    p_new->i_color  = i_color; 
    474     p_new->i_alpha  = i_alpha; 
    475474 
    476475    if( !*p_font ) 
     
    519518 
    520519static int PeekFont( font_stack_t **p_font, char **psz_name, int *i_size, 
    521                      int *i_color, int *i_alpha
     520                     uint32_t *i_color
    522521{ 
    523522    font_stack_t *p_last; 
     
    534533    *i_size   = p_last->i_size; 
    535534    *i_color  = p_last->i_color; 
    536     *i_alpha  = p_last->i_alpha; 
    537535 
    538536    return VLC_SUCCESS; 
     
    544542    ATSUStyle   p_style = NULL; 
    545543 
    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, 
    554551                               b_bold, b_italic, b_uline ); 
    555552    } 
     
    557554} 
    558555 
    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) 
     556static 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 
     631static 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 ) 
    563640{ 
    564641    filter_sys_t *p_sys          = p_filter->p_sys; 
     
    578655               p_font_style->psz_fontname, 
    579656               p_font_style->i_font_size, 
    580                p_font_style->i_font_color, 
    581                   p_font_style->i_font_alpha ); 
     657               (p_font_style->i_font_color & 0xffffff) | 
     658                  ((p_font_style->i_font_alpha & 0xff) << 24) ); 
    582659 
    583660        if( p_font_style->i_style_flags & STYLE_BOLD ) 
     
    593670                       p_sys->psz_font_name, 
    594671                       p_sys->i_font_size, 
    595                        p_sys->i_font_color, 0 ); 
     672                       p_sys->i_font_color ); 
    596673    } 
    597674    if( rv != VLC_SUCCESS ) 
     
    626703                { 
    627704                    if( !strcasecmp( "font", psz_node ) ) 
    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 ); 
    688706                    else if( !strcasecmp( "b", psz_node ) ) 
    689                     { 
    690707                        b_bold = VLC_TRUE; 
    691                     } 
    692708                    else if( !strcasecmp( "i", psz_node ) ) 
    693                     { 
    694709                        b_italic = VLC_TRUE; 
    695                     } 
    696710                    else if( !strcasecmp( "u", psz_node ) ) 
    697                     { 
    698711                        b_uline = VLC_TRUE; 
    699                     } 
    700712                    else if( !strcasecmp( "br", psz_node ) ) 
    701713                    {