evas_common: parse color in rgb()/rgba() format

evas_common_format_color_parse: support rgb()/rgba() format

efl user can now specify colors in text formats and styles as rgb(0-255,0-255,0-255) &  rgba(0-255,0-255,0-255,0-255)  format.

This is related to task: T8068

Reviewed-by: Cedric BAIL <cedric.bail@free.fr>
Differential Revision: https://phab.enlightenment.org/D9309
This commit is contained in:
Ali Alzyod 2019-08-01 23:00:07 +00:00 committed by Cedric BAIL
parent 1d76452aa9
commit a821eb456a
3 changed files with 104 additions and 16 deletions

View File

@ -393,6 +393,8 @@ test_label_colors(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *ev
elm_object_text_set(lb,
"<color=red>this is red color line(color = red)<color><br>"
"<color=#0000FF>this is blue color line (color = #0000FF)<color><br>"
"<color=rgb(0,255,0)>this is green color line (color = rgb(0,255,0))<color><br>"
"<color=rgba(0,255,0,255)>this is blue color line (color = rgba(0,255,0,255))<color><br>"
);
evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_win_resize_object_add(win, lb);

View File

@ -1953,6 +1953,8 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch
* @li "#RRGGBBAA"
* @li "#RGB"
* @li "#RGBA"
* @li "rgb(r,g,b)"
* @li "rgba(r,g,b,a)"
* @li "color_name" like "red"
* @code
* color=<color>
@ -1972,6 +1974,8 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch
* @li "#RRGGBBAA"
* @li "#RGB"
* @li "#RGBA"
* @li "rgb(r,g,b)"
* @li "rgba(r,g,b,a)"
* @li "color_name" like "red"
* @code
* underline_color=<color>
@ -1992,6 +1996,8 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch
* @li "#RRGGBBAA"
* @li "#RGB"
* @li "#RGBA"
* @li "rgb(r,g,b)"
* @li "rgba(r,g,b,a)"
* @li "color_name" like "red"
* @code
* underline2_color=<color>
@ -2011,6 +2017,8 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch
* @li "#RRGGBBAA"
* @li "#RGB"
* @li "#RGBA"
* @li "rgb(r,g,b)"
* @li "rgba(r,g,b,a)"
* @li "color_name" like "red"
* @code
* underline_dash_color=<color>
@ -2031,6 +2039,8 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch
* @li "#RRGGBBAA"
* @li "#RGB"
* @li "#RGBA"
* @li "rgb(r,g,b)"
* @li "rgba(r,g,b,a)"
* @li "color_name" like "red"
* @code
* outline_color=<color>
@ -2051,6 +2061,8 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch
* @li "#RRGGBBAA"
* @li "#RGB"
* @li "#RGBA"
* @li "rgb(r,g,b)"
* @li "rgba(r,g,b,a)"
* @li "color_name" like "red"
* @code
* shadow_color=<color>
@ -2071,6 +2083,8 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch
* @li "#RRGGBBAA"
* @li "#RGB"
* @li "#RGBA"
* @li "rgb(r,g,b)"
* @li "rgba(r,g,b,a)"
* @li "color_name" like "red"
* @code
* glow_color=<color>
@ -2091,6 +2105,8 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch
* @li "#RRGGBBAA"
* @li "#RGB"
* @li "#RGBA"
* @li "rgb(r,g,b)"
* @li "rgba(r,g,b,a)"
* @li "color_name" like "red"
* @code
* glow2_color=<color>
@ -2111,6 +2127,8 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch
* @li "#RRGGBBAA"
* @li "#RGB"
* @li "#RGBA"
* @li "rgb(r,g,b)"
* @li "rgba(r,g,b,a)"
* @li "color_name" like "red"
* @code
* backing_color=<color>
@ -2131,6 +2149,8 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch
* @li "#RRGGBBAA"
* @li "#RGB"
* @li "#RGBA"
* @li "rgb(r,g,b)"
* @li "rgba(r,g,b,a)"
* @li "color_name" like "red"
* @code
* strikethrough_color=<color>

View File

@ -1299,7 +1299,7 @@ _hex_string_get(char ch, Eina_Bool *ok)
*
* @param source source buffer
* @param dest destination buffer
* @param max maximum number of chars to be copyed
* @param max maximum number of chars to be copied
* @return number of spaces removed
*/
@ -1323,6 +1323,36 @@ size_t remove_spaces_lowercase(const char* source,char * dest,size_t max)
return spaces;
}
/**
* @internal
* read color component from string
*
* @param source source string
* @param[out] next position after the color compnent
* @param byte store color value read from string
* @return if read success
*/
Eina_Bool read_byte_color_component(const char* source,char ** next,unsigned char * byte)
{
const char *p_start = source;
char *p_stop = NULL;
Eina_Bool b_ret = EINA_TRUE;
long value = 0;
value = strtol(p_start, &p_stop, 10);
if ( value > 255 || value < 0 || p_start == p_stop )
{
b_ret = EINA_FALSE;
}
if (next)
*next = p_stop;
if (byte)
*byte = (unsigned char) value;
return b_ret;
}
/**
* @internal
@ -1332,12 +1362,11 @@ size_t remove_spaces_lowercase(const char* source,char * dest,size_t max)
* 3. "#RGB"
* 4. "#RGBA"
* 5. "color names"
* 6. "rgb(r,g,b)"
* 7. "rgba(r,g,b,a)"
* TODO (we may use specific color parser)
* 6. "rgb(RR,GG,BB)"
* 7. "rgba(RR,GG,BB,AA)"
* 8. "rgb(%R,%G,%B)"
* 9. "rgba(%R,%G,%B,%A)"
* 10."hsv(HH,SS,VV)"
* 8. "hsl(H,S,L)"
* 9. "hsla(H,S,L,A)"
* To the rgba values.
*
* @param[in] str The string to parse - NOT NULL.
@ -1393,24 +1422,61 @@ evas_common_format_color_parse(const char *str, int slen,
}
else v = EINA_FALSE;
}
else
else if (slen <= 21)/* search for rgb(),hsv(),colorname, 20 is length of rgba(255,255,255,255) */
{
/*remove spaces and convert name to lowercase*/
char color_name[0xFF] = {0};
slen = slen - (int) remove_spaces_lowercase(str,color_name,0xFF);
static size_t color_array_length = sizeof(color_name_value_sorted)/sizeof(Color_Name_Value);
Color_Name_Value* pcolor = (Color_Name_Value*) bsearch(color_name, color_name_value_sorted, color_array_length, sizeof(Color_Name_Value),_color_name_search);
if (pcolor)
if ((strncmp(color_name,"rgb(",4) == 0) && color_name[slen-1] == ')'&& slen >= 10 && slen <=16) /* rgb() */
{
*r = pcolor->r;
*g = pcolor->g;
*b = pcolor->b;
*a = 0xff;
char * p_color = &color_name[3];
if (
(!read_byte_color_component(++p_color,&p_color,r) || !p_color || *p_color != ',') ||
(!read_byte_color_component(++p_color,&p_color,g) || !p_color || *p_color != ',') ||
(!read_byte_color_component(++p_color,&p_color,b) || !p_color || *p_color != ')')
)
{
*r = *g = *b = *a = 0;
v = EINA_FALSE;
}
else
{
*a = 0xff;
}
}
else if ((strncmp(color_name,"rgba(",4) == 0) && color_name[slen-1] == ')'&& slen >= 13 && slen <=21) /* rgba() */
{
char * p_color = &color_name[4];
if (
(!read_byte_color_component(++p_color,&p_color,r) || !p_color || *p_color != ',') ||
(!read_byte_color_component(++p_color,&p_color,g) || !p_color || *p_color != ',') ||
(!read_byte_color_component(++p_color,&p_color,b) || !p_color || *p_color != ',') ||
(!read_byte_color_component(++p_color,&p_color,a) || !p_color || *p_color != ')')
)
{
*r = *g = *b = *a = 0;
v = EINA_FALSE;
}
}
else
{
v = EINA_FALSE;
}
static size_t color_array_length = sizeof(color_name_value_sorted)/sizeof(Color_Name_Value);
Color_Name_Value* pcolor = (Color_Name_Value*) bsearch(color_name, color_name_value_sorted, color_array_length, sizeof(Color_Name_Value),_color_name_search);
if (pcolor)
{
*r = pcolor->r;
*g = pcolor->g;
*b = pcolor->b;
*a = 0xff;
}
else
{
v = EINA_FALSE;
}
}
}
if(*a != 0xFF)