Evas filters: Add support for proxies in Edje

They will be defined with the following syntax:
buffer:buf(src=part);
This commit is contained in:
Jean-Philippe Andre 2014-02-05 19:40:24 +09:00
parent 08f2624e6a
commit a25b212bac
4 changed files with 84 additions and 3 deletions

View File

@ -7314,6 +7314,13 @@ static void
st_collections_group_parts_part_description_text_filter(void)
{
Edje_Part_Description_Text *ed;
Eina_List *sources = NULL;
Eina_Stringshare *name;
char *token, *code;
Eina_Bool valid = EINA_TRUE;
static const char *allowed_name_chars =
"abcdefghijklmnopqrstuvwxyzABCDEFGHJIKLMNOPQRSTUVWXYZ0123456789_";
check_arg_count(1);
@ -7325,8 +7332,62 @@ st_collections_group_parts_part_description_text_filter(void)
}
ed = (Edje_Part_Description_Text*) current_desc;
ed->text.filter_sources = NULL;
ed->text.filter.str = parse_str(0);
if (!ed->text.filter.str) return;
// Parse list of buffers that have a source
// note: does not support comments
code = strdup(ed->text.filter.str);
for (token = strtok(code, ";"); token; token = strtok(NULL, ";"))
{
size_t len;
len = strspn(token, " \n\t");
token += len;
if (!strncasecmp("buffer", token, 6))
{
// note: a valid string won't necessary compile at runtime
token = strchr(token, ':');
if (!token)
{
valid = EINA_FALSE;
break;
}
token = strchr(token, '(');
if (!token)
{
valid = EINA_FALSE;
break;
}
token = strcasestr(token, "src");
if (!token) continue;
token += 3;
len = strspn(token, " =\n\t");
if (!len || !token[len])
{
valid = EINA_FALSE;
break;
}
token += len;
len = strspn(token, allowed_name_chars);
if (!len || !token[len])
{
valid = EINA_FALSE;
break;
}
token[len] = '\0';
name = eina_stringshare_add(token);
sources = eina_list_append(sources, name);
}
}
free(code);
if (valid) ed->text.filter_sources = sources;
}

View File

@ -806,6 +806,7 @@ _edje_edd_init(void)
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.id_text_source", text.id_text_source, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.elipsis", text.elipsis, EET_T_DOUBLE);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.filter", text.filter, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_LIST_STRING(_edje_edd_edje_part_description_text, Edje_Part_Description_Text, "text.filter_sources", text.filter_sources);
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Description_Text);
eddc.func.mem_free = mem_free_textblock;

View File

@ -1176,6 +1176,7 @@ struct _Edje_Part_Description_Spec_Text
Edje_String font; /* if a specific font is asked for */
Edje_String repch; /* replacement char for password mode entry */
Edje_String filter; /* special effects */
Eina_List *filter_sources; /* proxy sources for special effects */
Edje_Alignment align; /* text alignment within bounds */
Edje_Color color3;
@ -1532,6 +1533,7 @@ struct _Edje_Real_Part_Text
const char *font; // 4
const char *style; // 4
const char *filter; // 4
Eina_List *filter_sources; // 4
Edje_Position offset; // 8
short size; // 2
struct {
@ -1544,7 +1546,7 @@ struct _Edje_Real_Part_Text
const char *out_str; // 4
FLOAT_T align_x, align_y; // 16
} cache;
}; // 76
}; // 84
// FIXME make text a potiner to struct and alloc at end
// if part type is TEXT move common members textblock +
// text to front and have smaller struct for textblock

View File

@ -169,7 +169,8 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
char *font2 = NULL;
char *sfont = NULL;
int size;
const char *filter;
const char *filter, *source_name;
Eina_List *filter_sources = NULL, *prev_sources = NULL, *li;
Evas_Coord tw, th;
Evas_Coord sw, sh;
int inlined_font = 0, free_text = 0;
@ -188,6 +189,12 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
if (ep->typedata.text->font) font = ep->typedata.text->font;
if (ep->typedata.text->size > 0) size = ep->typedata.text->size;
if (ep->typedata.text->filter) filter = ep->typedata.text->filter;
if (ep->typedata.text->filter_sources != chosen_desc->text.filter_sources)
{
prev_sources = ep->typedata.text->filter_sources;
filter_sources = chosen_desc->text.filter_sources;
ep->typedata.text->filter_sources = chosen_desc->text.filter_sources;
}
if (ep->typedata.text->text_source)
{
@ -421,9 +428,19 @@ arrange_text:
if (ep->part->scale) evas_object_scale_set(ep->object, TO_DOUBLE(sc));
eo_do(ep->object,
evas_obj_text_font_set(font, size),
evas_obj_text_filter_program_set(filter),
evas_obj_text_text_set(text));
part_get_geometry(ep, &tw, &th);
/* filters */
EINA_LIST_FOREACH(prev_sources, li, source_name)
eo_do(ep->object, evas_obj_text_filter_source_set(source_name, NULL));
EINA_LIST_FOREACH(filter_sources, li, source_name)
{
Edje_Real_Part *rp = _edje_real_part_get(ed, source_name);
eo_do(ep->object, evas_obj_text_filter_source_set(source_name, rp ? rp->object : NULL));
}
eo_do(ep->object, evas_obj_text_filter_program_set(filter));
/* Handle alignment */
{
FLOAT_T align_x;