diff --git a/include/vlc_text_style.h b/include/vlc_text_style.h index 9996002a0288..f64c521ef9e0 100644 --- a/include/vlc_text_style.h +++ b/include/vlc_text_style.h @@ -198,6 +198,191 @@ VLC_API void text_segment_ChainDelete( text_segment_t * ); */ VLC_API text_segment_t * text_segment_Copy( text_segment_t * ); +static const struct { + const char *psz_name; + uint32_t i_value; +} p_html_colors[] = { + /* Official html colors */ + { "Aqua", 0x00FFFF }, + { "Black", 0x000000 }, + { "Blue", 0x0000FF }, + { "Fuchsia", 0xFF00FF }, + { "Gray", 0x808080 }, + { "Green", 0x008000 }, + { "Lime", 0x00FF00 }, + { "Maroon", 0x800000 }, + { "Navy", 0x000080 }, + { "Olive", 0x808000 }, + { "Purple", 0x800080 }, + { "Red", 0xFF0000 }, + { "Silver", 0xC0C0C0 }, + { "Teal", 0x008080 }, + { "White", 0xFFFFFF }, + { "Yellow", 0xFFFF00 }, + + /* Common ones */ + { "AliceBlue", 0xF0F8FF }, + { "AntiqueWhite", 0xFAEBD7 }, + { "Aqua", 0x00FFFF }, + { "Aquamarine", 0x7FFFD4 }, + { "Azure", 0xF0FFFF }, + { "Beige", 0xF5F5DC }, + { "Bisque", 0xFFE4C4 }, + { "Black", 0x000000 }, + { "BlanchedAlmond", 0xFFEBCD }, + { "Blue", 0x0000FF }, + { "BlueViolet", 0x8A2BE2 }, + { "Brown", 0xA52A2A }, + { "BurlyWood", 0xDEB887 }, + { "CadetBlue", 0x5F9EA0 }, + { "Chartreuse", 0x7FFF00 }, + { "Chocolate", 0xD2691E }, + { "Coral", 0xFF7F50 }, + { "CornflowerBlue", 0x6495ED }, + { "Cornsilk", 0xFFF8DC }, + { "Crimson", 0xDC143C }, + { "Cyan", 0x00FFFF }, + { "DarkBlue", 0x00008B }, + { "DarkCyan", 0x008B8B }, + { "DarkGoldenRod", 0xB8860B }, + { "DarkGray", 0xA9A9A9 }, + { "DarkGrey", 0xA9A9A9 }, + { "DarkGreen", 0x006400 }, + { "DarkKhaki", 0xBDB76B }, + { "DarkMagenta", 0x8B008B }, + { "DarkOliveGreen", 0x556B2F }, + { "Darkorange", 0xFF8C00 }, + { "DarkOrchid", 0x9932CC }, + { "DarkRed", 0x8B0000 }, + { "DarkSalmon", 0xE9967A }, + { "DarkSeaGreen", 0x8FBC8F }, + { "DarkSlateBlue", 0x483D8B }, + { "DarkSlateGray", 0x2F4F4F }, + { "DarkSlateGrey", 0x2F4F4F }, + { "DarkTurquoise", 0x00CED1 }, + { "DarkViolet", 0x9400D3 }, + { "DeepPink", 0xFF1493 }, + { "DeepSkyBlue", 0x00BFFF }, + { "DimGray", 0x696969 }, + { "DimGrey", 0x696969 }, + { "DodgerBlue", 0x1E90FF }, + { "FireBrick", 0xB22222 }, + { "FloralWhite", 0xFFFAF0 }, + { "ForestGreen", 0x228B22 }, + { "Fuchsia", 0xFF00FF }, + { "Gainsboro", 0xDCDCDC }, + { "GhostWhite", 0xF8F8FF }, + { "Gold", 0xFFD700 }, + { "GoldenRod", 0xDAA520 }, + { "Gray", 0x808080 }, + { "Grey", 0x808080 }, + { "Green", 0x008000 }, + { "GreenYellow", 0xADFF2F }, + { "HoneyDew", 0xF0FFF0 }, + { "HotPink", 0xFF69B4 }, + { "IndianRed", 0xCD5C5C }, + { "Indigo", 0x4B0082 }, + { "Ivory", 0xFFFFF0 }, + { "Khaki", 0xF0E68C }, + { "Lavender", 0xE6E6FA }, + { "LavenderBlush", 0xFFF0F5 }, + { "LawnGreen", 0x7CFC00 }, + { "LemonChiffon", 0xFFFACD }, + { "LightBlue", 0xADD8E6 }, + { "LightCoral", 0xF08080 }, + { "LightCyan", 0xE0FFFF }, + { "LightGoldenRodYellow", 0xFAFAD2 }, + { "LightGray", 0xD3D3D3 }, + { "LightGrey", 0xD3D3D3 }, + { "LightGreen", 0x90EE90 }, + { "LightPink", 0xFFB6C1 }, + { "LightSalmon", 0xFFA07A }, + { "LightSeaGreen", 0x20B2AA }, + { "LightSkyBlue", 0x87CEFA }, + { "LightSlateGray", 0x778899 }, + { "LightSlateGrey", 0x778899 }, + { "LightSteelBlue", 0xB0C4DE }, + { "LightYellow", 0xFFFFE0 }, + { "Lime", 0x00FF00 }, + { "LimeGreen", 0x32CD32 }, + { "Linen", 0xFAF0E6 }, + { "Magenta", 0xFF00FF }, + { "Maroon", 0x800000 }, + { "MediumAquaMarine", 0x66CDAA }, + { "MediumBlue", 0x0000CD }, + { "MediumOrchid", 0xBA55D3 }, + { "MediumPurple", 0x9370D8 }, + { "MediumSeaGreen", 0x3CB371 }, + { "MediumSlateBlue", 0x7B68EE }, + { "MediumSpringGreen", 0x00FA9A }, + { "MediumTurquoise", 0x48D1CC }, + { "MediumVioletRed", 0xC71585 }, + { "MidnightBlue", 0x191970 }, + { "MintCream", 0xF5FFFA }, + { "MistyRose", 0xFFE4E1 }, + { "Moccasin", 0xFFE4B5 }, + { "NavajoWhite", 0xFFDEAD }, + { "Navy", 0x000080 }, + { "OldLace", 0xFDF5E6 }, + { "Olive", 0x808000 }, + { "OliveDrab", 0x6B8E23 }, + { "Orange", 0xFFA500 }, + { "OrangeRed", 0xFF4500 }, + { "Orchid", 0xDA70D6 }, + { "PaleGoldenRod", 0xEEE8AA }, + { "PaleGreen", 0x98FB98 }, + { "PaleTurquoise", 0xAFEEEE }, + { "PaleVioletRed", 0xD87093 }, + { "PapayaWhip", 0xFFEFD5 }, + { "PeachPuff", 0xFFDAB9 }, + { "Peru", 0xCD853F }, + { "Pink", 0xFFC0CB }, + { "Plum", 0xDDA0DD }, + { "PowderBlue", 0xB0E0E6 }, + { "Purple", 0x800080 }, + { "Red", 0xFF0000 }, + { "RosyBrown", 0xBC8F8F }, + { "RoyalBlue", 0x4169E1 }, + { "SaddleBrown", 0x8B4513 }, + { "Salmon", 0xFA8072 }, + { "SandyBrown", 0xF4A460 }, + { "SeaGreen", 0x2E8B57 }, + { "SeaShell", 0xFFF5EE }, + { "Sienna", 0xA0522D }, + { "Silver", 0xC0C0C0 }, + { "SkyBlue", 0x87CEEB }, + { "SlateBlue", 0x6A5ACD }, + { "SlateGray", 0x708090 }, + { "SlateGrey", 0x708090 }, + { "Snow", 0xFFFAFA }, + { "SpringGreen", 0x00FF7F }, + { "SteelBlue", 0x4682B4 }, + { "Tan", 0xD2B48C }, + { "Teal", 0x008080 }, + { "Thistle", 0xD8BFD8 }, + { "Tomato", 0xFF6347 }, + { "Turquoise", 0x40E0D0 }, + { "Violet", 0xEE82EE }, + { "Wheat", 0xF5DEB3 }, + { "White", 0xFFFFFF }, + { "WhiteSmoke", 0xF5F5F5 }, + { "Yellow", 0xFFFF00 }, + { "YellowGreen", 0x9ACD32 }, + + { NULL, 0 } +}; + +/** + * Returns an integer representation of an HTML color. + * + * @param psz_value An HTML color, which can be either: + * - A standard HTML color (red, cyan, ...) as defined in p_html_colors + * - An hexadecimal color, of the form [#][AA]RRGGBB + * @param ok If non-null, true will be stored in this pointer to signal + * a successful conversion + */ +VLC_API unsigned int vlc_html_color( const char *psz_value, bool* ok ); + #ifdef __cplusplus } #endif diff --git a/modules/codec/subsdec.c b/modules/codec/subsdec.c index 1c9df6f2056c..22037f7e169c 100644 --- a/modules/codec/subsdec.c +++ b/modules/codec/subsdec.c @@ -162,181 +162,6 @@ static const char *const ppsz_encoding_names[] = { N_("Vietnamese (Windows-1258)"), }; -static const struct { - const char *psz_name; - uint32_t i_value; -} p_html_colors[] = { - /* Official html colors */ - { "Aqua", 0x00FFFF }, - { "Black", 0x000000 }, - { "Blue", 0x0000FF }, - { "Fuchsia", 0xFF00FF }, - { "Gray", 0x808080 }, - { "Green", 0x008000 }, - { "Lime", 0x00FF00 }, - { "Maroon", 0x800000 }, - { "Navy", 0x000080 }, - { "Olive", 0x808000 }, - { "Purple", 0x800080 }, - { "Red", 0xFF0000 }, - { "Silver", 0xC0C0C0 }, - { "Teal", 0x008080 }, - { "White", 0xFFFFFF }, - { "Yellow", 0xFFFF00 }, - - /* Common ones */ - { "AliceBlue", 0xF0F8FF }, - { "AntiqueWhite", 0xFAEBD7 }, - { "Aqua", 0x00FFFF }, - { "Aquamarine", 0x7FFFD4 }, - { "Azure", 0xF0FFFF }, - { "Beige", 0xF5F5DC }, - { "Bisque", 0xFFE4C4 }, - { "Black", 0x000000 }, - { "BlanchedAlmond", 0xFFEBCD }, - { "Blue", 0x0000FF }, - { "BlueViolet", 0x8A2BE2 }, - { "Brown", 0xA52A2A }, - { "BurlyWood", 0xDEB887 }, - { "CadetBlue", 0x5F9EA0 }, - { "Chartreuse", 0x7FFF00 }, - { "Chocolate", 0xD2691E }, - { "Coral", 0xFF7F50 }, - { "CornflowerBlue", 0x6495ED }, - { "Cornsilk", 0xFFF8DC }, - { "Crimson", 0xDC143C }, - { "Cyan", 0x00FFFF }, - { "DarkBlue", 0x00008B }, - { "DarkCyan", 0x008B8B }, - { "DarkGoldenRod", 0xB8860B }, - { "DarkGray", 0xA9A9A9 }, - { "DarkGrey", 0xA9A9A9 }, - { "DarkGreen", 0x006400 }, - { "DarkKhaki", 0xBDB76B }, - { "DarkMagenta", 0x8B008B }, - { "DarkOliveGreen", 0x556B2F }, - { "Darkorange", 0xFF8C00 }, - { "DarkOrchid", 0x9932CC }, - { "DarkRed", 0x8B0000 }, - { "DarkSalmon", 0xE9967A }, - { "DarkSeaGreen", 0x8FBC8F }, - { "DarkSlateBlue", 0x483D8B }, - { "DarkSlateGray", 0x2F4F4F }, - { "DarkSlateGrey", 0x2F4F4F }, - { "DarkTurquoise", 0x00CED1 }, - { "DarkViolet", 0x9400D3 }, - { "DeepPink", 0xFF1493 }, - { "DeepSkyBlue", 0x00BFFF }, - { "DimGray", 0x696969 }, - { "DimGrey", 0x696969 }, - { "DodgerBlue", 0x1E90FF }, - { "FireBrick", 0xB22222 }, - { "FloralWhite", 0xFFFAF0 }, - { "ForestGreen", 0x228B22 }, - { "Fuchsia", 0xFF00FF }, - { "Gainsboro", 0xDCDCDC }, - { "GhostWhite", 0xF8F8FF }, - { "Gold", 0xFFD700 }, - { "GoldenRod", 0xDAA520 }, - { "Gray", 0x808080 }, - { "Grey", 0x808080 }, - { "Green", 0x008000 }, - { "GreenYellow", 0xADFF2F }, - { "HoneyDew", 0xF0FFF0 }, - { "HotPink", 0xFF69B4 }, - { "IndianRed", 0xCD5C5C }, - { "Indigo", 0x4B0082 }, - { "Ivory", 0xFFFFF0 }, - { "Khaki", 0xF0E68C }, - { "Lavender", 0xE6E6FA }, - { "LavenderBlush", 0xFFF0F5 }, - { "LawnGreen", 0x7CFC00 }, - { "LemonChiffon", 0xFFFACD }, - { "LightBlue", 0xADD8E6 }, - { "LightCoral", 0xF08080 }, - { "LightCyan", 0xE0FFFF }, - { "LightGoldenRodYellow", 0xFAFAD2 }, - { "LightGray", 0xD3D3D3 }, - { "LightGrey", 0xD3D3D3 }, - { "LightGreen", 0x90EE90 }, - { "LightPink", 0xFFB6C1 }, - { "LightSalmon", 0xFFA07A }, - { "LightSeaGreen", 0x20B2AA }, - { "LightSkyBlue", 0x87CEFA }, - { "LightSlateGray", 0x778899 }, - { "LightSlateGrey", 0x778899 }, - { "LightSteelBlue", 0xB0C4DE }, - { "LightYellow", 0xFFFFE0 }, - { "Lime", 0x00FF00 }, - { "LimeGreen", 0x32CD32 }, - { "Linen", 0xFAF0E6 }, - { "Magenta", 0xFF00FF }, - { "Maroon", 0x800000 }, - { "MediumAquaMarine", 0x66CDAA }, - { "MediumBlue", 0x0000CD }, - { "MediumOrchid", 0xBA55D3 }, - { "MediumPurple", 0x9370D8 }, - { "MediumSeaGreen", 0x3CB371 }, - { "MediumSlateBlue", 0x7B68EE }, - { "MediumSpringGreen", 0x00FA9A }, - { "MediumTurquoise", 0x48D1CC }, - { "MediumVioletRed", 0xC71585 }, - { "MidnightBlue", 0x191970 }, - { "MintCream", 0xF5FFFA }, - { "MistyRose", 0xFFE4E1 }, - { "Moccasin", 0xFFE4B5 }, - { "NavajoWhite", 0xFFDEAD }, - { "Navy", 0x000080 }, - { "OldLace", 0xFDF5E6 }, - { "Olive", 0x808000 }, - { "OliveDrab", 0x6B8E23 }, - { "Orange", 0xFFA500 }, - { "OrangeRed", 0xFF4500 }, - { "Orchid", 0xDA70D6 }, - { "PaleGoldenRod", 0xEEE8AA }, - { "PaleGreen", 0x98FB98 }, - { "PaleTurquoise", 0xAFEEEE }, - { "PaleVioletRed", 0xD87093 }, - { "PapayaWhip", 0xFFEFD5 }, - { "PeachPuff", 0xFFDAB9 }, - { "Peru", 0xCD853F }, - { "Pink", 0xFFC0CB }, - { "Plum", 0xDDA0DD }, - { "PowderBlue", 0xB0E0E6 }, - { "Purple", 0x800080 }, - { "Red", 0xFF0000 }, - { "RosyBrown", 0xBC8F8F }, - { "RoyalBlue", 0x4169E1 }, - { "SaddleBrown", 0x8B4513 }, - { "Salmon", 0xFA8072 }, - { "SandyBrown", 0xF4A460 }, - { "SeaGreen", 0x2E8B57 }, - { "SeaShell", 0xFFF5EE }, - { "Sienna", 0xA0522D }, - { "Silver", 0xC0C0C0 }, - { "SkyBlue", 0x87CEEB }, - { "SlateBlue", 0x6A5ACD }, - { "SlateGray", 0x708090 }, - { "SlateGrey", 0x708090 }, - { "Snow", 0xFFFAFA }, - { "SpringGreen", 0x00FF7F }, - { "SteelBlue", 0x4682B4 }, - { "Tan", 0xD2B48C }, - { "Teal", 0x008080 }, - { "Thistle", 0xD8BFD8 }, - { "Tomato", 0xFF6347 }, - { "Turquoise", 0x40E0D0 }, - { "Violet", 0xEE82EE }, - { "Wheat", 0xF5DEB3 }, - { "White", 0xFFFFFF }, - { "WhiteSmoke", 0xF5F5F5 }, - { "Yellow", 0xFFFF00 }, - { "YellowGreen", 0x9ACD32 }, - - { NULL, 0 } -}; - - static const int pi_justification[] = { 0, 1, 2 }; static const char *const ppsz_justification_text[] = { N_("Center"),N_("Left"),N_("Right")}; @@ -833,33 +658,6 @@ static bool HasTag( tag_stack_t **pp_stack, const char* psz_tagname ) return false; } -static int GetColor( const char* psz_color ) -{ - if ( *psz_color == '#' ) - return strtol( psz_color + 1, NULL, 16 ); - // Check if the string can be converted as an hex number - bool ok = true; - for (int i = 0; psz_color[i]; ++i ) - { - if ( !isxdigit( psz_color[i] ) ) - { - ok = false; - break; - } - } - if ( ok ) - return strtol( psz_color, NULL, 16 ); - - for( int i = 0; p_html_colors[i].psz_name != NULL; i++ ) - { - if( !strcasecmp( psz_color, p_html_colors[i].psz_name ) ) - { - return p_html_colors[i].i_value; - } - } - return 0; -} - /* * mini style stack implementation */ @@ -1003,17 +801,17 @@ static text_segment_t* ParseSubtitles( int *pi_align, const char *psz_subtitle ) } else if ( !strcasecmp( psz_attribute_name, "color" ) ) { - p_segment->style->i_font_color = GetColor( psz_attribute_value ); + p_segment->style->i_font_color = vlc_html_color( psz_attribute_value, NULL ); p_segment->style->i_features |= STYLE_HAS_FONT_COLOR; } else if ( !strcasecmp( psz_attribute_name, "outline-color" ) ) { - p_segment->style->i_outline_color = GetColor( psz_attribute_value ); + p_segment->style->i_outline_color = vlc_html_color( psz_attribute_value, NULL ); p_segment->style->i_features |= STYLE_HAS_OUTLINE_COLOR; } else if ( !strcasecmp( psz_attribute_name, "shadow-color" ) ) { - p_segment->style->i_shadow_color = GetColor( psz_attribute_value ); + p_segment->style->i_shadow_color = vlc_html_color( psz_attribute_value, NULL ); p_segment->style->i_features |= STYLE_HAS_SHADOW_COLOR; } else if ( !strcasecmp( psz_attribute_name, "outline-level" ) ) @@ -1026,7 +824,7 @@ static text_segment_t* ParseSubtitles( int *pi_align, const char *psz_subtitle ) } else if ( !strcasecmp( psz_attribute_name, "back-color" ) ) { - p_segment->style->i_background_color = GetColor( psz_attribute_value ); + p_segment->style->i_background_color = vlc_html_color( psz_attribute_value, NULL ); p_segment->style->i_features |= STYLE_HAS_BACKGROUND_COLOR; } else if ( !strcasecmp( psz_attribute_name, "alpha" ) ) diff --git a/modules/codec/substtml.c b/modules/codec/substtml.c index e36caa42b147..db2a9ba9fb7f 100644 --- a/modules/codec/substtml.c +++ b/modules/codec/substtml.c @@ -40,178 +40,6 @@ #define ALIGN_TEXT N_("Subtitle justification") #define ALIGN_LONGTEXT N_("Set the justification of subtitles") -static const struct { - const char *psz_name; - uint32_t i_value; -} p_html_colors[] = { - { "Aqua", 0x00FFFF }, - { "Black", 0x000000 }, - { "Blue", 0x0000FF }, - { "Fuchsia", 0xFF00FF }, - { "Gray", 0x808080 }, - { "Green", 0x008000 }, - { "Lime", 0x00FF00 }, - { "Maroon", 0x800000 }, - { "Navy", 0x000080 }, - { "Olive", 0x808000 }, - { "Purple", 0x800080 }, - { "Red", 0xFF0000 }, - { "Silver", 0xC0C0C0 }, - { "Teal", 0x008080 }, - { "White", 0xFFFFFF }, - { "Yellow", 0xFFFF00 }, - { "AliceBlue", 0xF0F8FF }, - { "AntiqueWhite", 0xFAEBD7 }, - { "Aqua", 0x00FFFF }, - { "Aquamarine", 0x7FFFD4 }, - { "Azure", 0xF0FFFF }, - { "Beige", 0xF5F5DC }, - { "Bisque", 0xFFE4C4 }, - { "Black", 0x000000 }, - { "BlanchedAlmond", 0xFFEBCD }, - { "Blue", 0x0000FF }, - { "BlueViolet", 0x8A2BE2 }, - { "Brown", 0xA52A2A }, - { "BurlyWood", 0xDEB887 }, - { "CadetBlue", 0x5F9EA0 }, - { "Chartreuse", 0x7FFF00 }, - { "Chocolate", 0xD2691E }, - { "Coral", 0xFF7F50 }, - { "CornflowerBlue", 0x6495ED }, - { "Cornsilk", 0xFFF8DC }, - { "Crimson", 0xDC143C }, - { "Cyan", 0x00FFFF }, - { "DarkBlue", 0x00008B }, - { "DarkCyan", 0x008B8B }, - { "DarkGoldenRod", 0xB8860B }, - { "DarkGray", 0xA9A9A9 }, - { "DarkGrey", 0xA9A9A9 }, - { "DarkGreen", 0x006400 }, - { "DarkKhaki", 0xBDB76B }, - { "DarkMagenta", 0x8B008B }, - { "DarkOliveGreen", 0x556B2F }, - { "Darkorange", 0xFF8C00 }, - { "DarkOrchid", 0x9932CC }, - { "DarkRed", 0x8B0000 }, - { "DarkSalmon", 0xE9967A }, - { "DarkSeaGreen", 0x8FBC8F }, - { "DarkSlateBlue", 0x483D8B }, - { "DarkSlateGray", 0x2F4F4F }, - { "DarkSlateGrey", 0x2F4F4F }, - { "DarkTurquoise", 0x00CED1 }, - { "DarkViolet", 0x9400D3 }, - { "DeepPink", 0xFF1493 }, - { "DeepSkyBlue", 0x00BFFF }, - { "DimGray", 0x696969 }, - { "DimGrey", 0x696969 }, - { "DodgerBlue", 0x1E90FF }, - { "FireBrick", 0xB22222 }, - { "FloralWhite", 0xFFFAF0 }, - { "ForestGreen", 0x228B22 }, - { "Fuchsia", 0xFF00FF }, - { "Gainsboro", 0xDCDCDC }, - { "GhostWhite", 0xF8F8FF }, - { "Gold", 0xFFD700 }, - { "GoldenRod", 0xDAA520 }, - { "Gray", 0x808080 }, - { "Grey", 0x808080 }, - { "Green", 0x008000 }, - { "GreenYellow", 0xADFF2F }, - { "HoneyDew", 0xF0FFF0 }, - { "HotPink", 0xFF69B4 }, - { "IndianRed", 0xCD5C5C }, - { "Indigo", 0x4B0082 }, - { "Ivory", 0xFFFFF0 }, - { "Khaki", 0xF0E68C }, - { "Lavender", 0xE6E6FA }, - { "LavenderBlush", 0xFFF0F5 }, - { "LawnGreen", 0x7CFC00 }, - { "LemonChiffon", 0xFFFACD }, - { "LightBlue", 0xADD8E6 }, - { "LightCoral", 0xF08080 }, - { "LightCyan", 0xE0FFFF }, - { "LightGoldenRodYellow", 0xFAFAD2 }, - { "LightGray", 0xD3D3D3 }, - { "LightGrey", 0xD3D3D3 }, - { "LightGreen", 0x90EE90 }, - { "LightPink", 0xFFB6C1 }, - { "LightSalmon", 0xFFA07A }, - { "LightSeaGreen", 0x20B2AA }, - { "LightSkyBlue", 0x87CEFA }, - { "LightSlateGray", 0x778899 }, - { "LightSlateGrey", 0x778899 }, - { "LightSteelBlue", 0xB0C4DE }, - { "LightYellow", 0xFFFFE0 }, - { "Lime", 0x00FF00 }, - { "LimeGreen", 0x32CD32 }, - { "Linen", 0xFAF0E6 }, - { "Magenta", 0xFF00FF }, - { "Maroon", 0x800000 }, - { "MediumAquaMarine", 0x66CDAA }, - { "MediumBlue", 0x0000CD }, - { "MediumOrchid", 0xBA55D3 }, - { "MediumPurple", 0x9370D8 }, - { "MediumSeaGreen", 0x3CB371 }, - { "MediumSlateBlue", 0x7B68EE }, - { "MediumSpringGreen", 0x00FA9A }, - { "MediumTurquoise", 0x48D1CC }, - { "MediumVioletRed", 0xC71585 }, - { "MidnightBlue", 0x191970 }, - { "MintCream", 0xF5FFFA }, - { "MistyRose", 0xFFE4E1 }, - { "Moccasin", 0xFFE4B5 }, - { "NavajoWhite", 0xFFDEAD }, - { "Navy", 0x000080 }, - { "OldLace", 0xFDF5E6 }, - { "Olive", 0x808000 }, - { "OliveDrab", 0x6B8E23 }, - { "Orange", 0xFFA500 }, - { "OrangeRed", 0xFF4500 }, - { "Orchid", 0xDA70D6 }, - { "PaleGoldenRod", 0xEEE8AA }, - { "PaleGreen", 0x98FB98 }, - { "PaleTurquoise", 0xAFEEEE }, - { "PaleVioletRed", 0xD87093 }, - { "PapayaWhip", 0xFFEFD5 }, - { "PeachPuff", 0xFFDAB9 }, - { "Peru", 0xCD853F }, - { "Pink", 0xFFC0CB }, - { "Plum", 0xDDA0DD }, - { "PowderBlue", 0xB0E0E6 }, - { "Purple", 0x800080 }, - { "Red", 0xFF0000 }, - { "RosyBrown", 0xBC8F8F }, - { "RoyalBlue", 0x4169E1 }, - { "SaddleBrown", 0x8B4513 }, - { "Salmon", 0xFA8072 }, - { "SandyBrown", 0xF4A460 }, - { "SeaGreen", 0x2E8B57 }, - { "SeaShell", 0xFFF5EE }, - { "Sienna", 0xA0522D }, - { "Silver", 0xC0C0C0 }, - { "SkyBlue", 0x87CEEB }, - { "SlateBlue", 0x6A5ACD }, - { "SlateGray", 0x708090 }, - { "SlateGrey", 0x708090 }, - { "Snow", 0xFFFAFA }, - { "SpringGreen", 0x00FF7F }, - { "SteelBlue", 0x4682B4 }, - { "Tan", 0xD2B48C }, - { "Teal", 0x008080 }, - { "Thistle", 0xD8BFD8 }, - { "Tomato", 0xFF6347 }, - { "Turquoise", 0x40E0D0 }, - { "Violet", 0xEE82EE }, - { "Wheat", 0xF5DEB3 }, - { "White", 0xFFFFFF }, - { "WhiteSmoke", 0xF5F5F5 }, - { "Yellow", 0xFFFF00 }, - { "YellowGreen", 0x9ACD32 }, - - { NULL, 0 } -}; - - /***************************************************************************** * Module descriptor. *****************************************************************************/ @@ -310,46 +138,6 @@ static text_style_t* CurrentStyle( style_stack_t* p_stack ) return text_style_Duplicate( p_stack->p_style->font_style ); } -static int GetColor( const char *psz_value, bool* ok ) -{ - unsigned int color = 0xFFFFFF; - char* psz_end; - - if ( ok != NULL ) - *ok = false; - - if( *psz_value == '#' ) - { - color = strtol( psz_value + 1, &psz_end, 16 ); - if ( ok != NULL && ( *psz_end == '\0' || *psz_end == ' ' ) ) - *ok = true; - } - else - { - uint32_t i_value = strtol( psz_value, &psz_end, 16 ); - if( *psz_end == '\0' || *psz_end == ' ' ) - { - color = i_value; - if ( ok != NULL ) - *ok = true; - } - else - { - for( int i = 0; p_html_colors[i].psz_name != NULL; i++ ) - { - if( !strncasecmp( psz_value, p_html_colors[i].psz_name, strlen(p_html_colors[i].psz_name) ) ) - { - // Assume opaque text since no alpha is specified. - color = p_html_colors[i].i_value | 0xFF000000; - if ( ok != NULL ) - *ok = true; - } - } - } - } - return color; -} - static void ParseTTMLStyle( decoder_t *p_dec, xml_reader_t* p_reader ) { decoder_sys_t* p_sys = p_dec->p_sys; @@ -398,14 +186,14 @@ static void ParseTTMLStyle( decoder_t *p_dec, xml_reader_t* p_reader ) } else if ( !strcasecmp( "tts:color", attr ) ) { - unsigned int i_color = GetColor( val, NULL ); + unsigned int i_color = vlc_html_color( val, NULL ); p_ttml_style->font_style->i_font_color = (i_color & 0xffffff); p_ttml_style->font_style->i_font_alpha = (i_color & 0xFF000000) >> 24; p_ttml_style->font_style->i_features |= STYLE_HAS_FONT_COLOR | STYLE_HAS_FONT_ALPHA; } else if ( !strcasecmp( "tts:backgroundColor", attr ) ) { - unsigned int i_color = GetColor( val, NULL ); + unsigned int i_color = vlc_html_color( val, NULL ); p_ttml_style->font_style->i_background_color = i_color & 0xFFFFFF; p_ttml_style->font_style->i_background_alpha = (i_color & 0xFF000000) >> 24; p_ttml_style->font_style->i_features |= STYLE_HAS_BACKGROUND_COLOR @@ -498,7 +286,7 @@ static void ParseTTMLStyle( decoder_t *p_dec, xml_reader_t* p_reader ) char* token = strtok_r( value, " ", &psz_saveptr ); // ? ? bool b_ok = false; - unsigned int color = GetColor( token, &b_ok ); + unsigned int color = vlc_html_color( token, &b_ok ); if ( b_ok ) { p_ttml_style->font_style->i_outline_color = color & 0xFFFFFF; diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 372b31204726..6d64c8ef3599 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -543,6 +543,7 @@ vlc_getaddrinfo vlc_getnameinfo vlc_getProxyUrl vlc_gettext +vlc_html_color vlc_ngettext vlc_iconv vlc_iconv_close diff --git a/src/misc/text_style.c b/src/misc/text_style.c index 9a5ed2e59924..76ab4a9dbe5a 100644 --- a/src/misc/text_style.c +++ b/src/misc/text_style.c @@ -28,6 +28,8 @@ #include #include +#include + /* */ text_style_t *text_style_New( void ) { @@ -227,3 +229,46 @@ text_segment_t *text_segment_Copy( text_segment_t *p_src ) return p_dst0; } +unsigned int vlc_html_color( const char *psz_value, bool* ok ) +{ + unsigned int color = 0; + char* psz_end; + + if ( ok != NULL ) + *ok = false; + + if( *psz_value == '#' ) + { + color = strtol( psz_value + 1, &psz_end, 16 ); + if ( ok != NULL && ( *psz_end == 0 || isspace( *psz_end ) ) ) + *ok = true; + } + else + { + uint32_t i_value = strtol( psz_value, &psz_end, 16 ); + if( *psz_end == 0 || isspace( *psz_end ) ) + { + color = i_value; + // Assume RRGGBB has an alpha component of 0xFF + if ( psz_end - psz_value <= 6 ) + color |= 0xFF000000; + if ( ok != NULL ) + *ok = true; + } + else + { + for( int i = 0; p_html_colors[i].psz_name != NULL; i++ ) + { + if( !strcasecmp( psz_value, p_html_colors[i].psz_name ) ) + { + // Assume opaque color since the table doesn't specify an alpha + color = p_html_colors[i].i_value | 0xFF000000; + if ( ok != NULL ) + *ok = true; + break; + } + } + } + } + return color; +}