jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=6ca02cbfe898799c9276fdb52971f7697b16cac9
commit 6ca02cbfe898799c9276fdb52971f7697b16cac9 Author: Jean-Philippe Andre <jp.an...@samsung.com> Date: Tue Jun 30 19:26:20 2015 +0900 Edje: Embed verbatim scripts for Efl.Gfx.Filters This is now like the other embedded scripts, where a verbatim string is parsed. The syntax is now: filters { filter { name: "filter0"; file: "filter.lua"; } filter { name: "filter1"; script { blend {} } } filter.file: "file.lua"; // name is "file.lua" } Thanks @raster for the quick review. --- src/bin/edje/edje_cc_handlers.c | 191 ++++++++++++++++++++++++++++------- src/lib/edje/edje_load.c | 6 -- src/lib/edje/edje_private.h | 4 +- src/tests/edje/data/test_filters.edc | 28 +++-- 4 files changed, 178 insertions(+), 51 deletions(-) diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c index 18701a2..9f2e21b 100644 --- a/src/bin/edje/edje_cc_handlers.c +++ b/src/bin/edje/edje_cc_handlers.c @@ -213,8 +213,10 @@ static void st_color_class_color2(void); static void st_color_class_color3(void); static void st_color_class_desc(void); -static void st_filters_filter_inline(void); +static void ob_filters_filter(void); +static void ob_filters_filter_script(void); static void st_filters_filter_file(void); +static void st_filters_filter_name(void); static void ob_collections(void); static void st_collections_base_scale(void); @@ -625,10 +627,8 @@ static void st_collections_group_nobroadcast(void); } #define FILTERS_STATEMENTS(PREFIX) \ - {PREFIX"filters", NULL}, \ - {PREFIX"filters.filter", NULL}, \ - {PREFIX"filters.filter.inline", st_filters_filter_inline}, \ - {PREFIX"filters.filter.file", st_filters_filter_file}, + {PREFIX"filters.filter.file", st_filters_filter_file}, \ + {PREFIX"filters.filter.name", st_filters_filter_name}, New_Statement_Handler statement_handlers[] = { @@ -1119,6 +1119,9 @@ New_Object_Handler object_handlers[] = {"color_classes", NULL}, {"color_classes.color_class", ob_color_class}, {"spectra", NULL}, + {"filters", NULL}, + {"filters.filter", ob_filters_filter}, + {"filters.filter.script", ob_filters_filter_script}, {"collections", ob_collections}, {"collections.externals", NULL}, /* dup */ {"collections.set", ob_images_set}, /* dup */ @@ -1142,6 +1145,9 @@ New_Object_Handler object_handlers[] = {"collections.vibrations", NULL}, {"collections.group.vibrations", NULL}, /* dup */ {"collections.vibrations.sample", NULL}, + {"collections.filters", NULL}, + {"collections.filters.filter", ob_filters_filter}, /* dup */ + {"collections.filters.filter.script", ob_filters_filter_script}, /* dup */ {"collections.group.vibrations.sample", NULL}, /* dup */ {"collections.group", ob_collections_group}, {"collections.group.data", NULL}, @@ -1160,6 +1166,9 @@ New_Object_Handler object_handlers[] = {"collections.group.styles.style", ob_styles_style}, /* dup */ {"collections.group.color_classes", NULL}, /* dup */ {"collections.group.color_classes.color_class", ob_color_class}, /* dup */ + {"collections.group.filters", NULL}, + {"collections.group.filters.filter", ob_filters_filter}, /* dup */ + {"collections.group.filters.filter.script", ob_filters_filter_script}, /* dup */ {"collections.group.parts", NULL}, {"collections.group.parts.set", ob_images_set}, /* dup */ {"collections.group.parts.set.image", ob_images_set_image}, /* dup */ @@ -4311,7 +4320,7 @@ st_collections_group_data_item(void) // collections // collections.group filters { - filter.inline: "key" "Lua script here"; + filter.script: "key" "Lua script here"; filter.file: "other" "filename.lua"; .. } @@ -4343,30 +4352,73 @@ st_collections_group_data_item(void) @endproperty */ -// ensure order so we could do binary search later on -// since this here happens at build time, we don't care about very hi-perf +static Edje_Gfx_Filter *current_filter = NULL; + static void -_filters_filter_insert(const char *name, const char *script) +_filters_filter_sort(void) { - Edje_Gfx_Filter *array; - int k, i; + Edje_Gfx_Filter *array, current; + int new_pos, i, cur_pos; - if (!edje_file->filter_dir) - edje_file->filter_dir = mem_alloc(sizeof(Edje_Gfx_Filter_Directory)); + if (!current_filter) + return; - for (k = 0; k < edje_file->filter_dir->filters_count; k++) + if (!current_filter->name) { - int cmp = strcmp(name, edje_file->filter_dir->filters[k].name); - if (!cmp) + ERR("parse error %s:%i. Filter has no name.", + file_in, line - 1); + exit(-1); + } + + array = edje_file->filter_dir->filters; + cur_pos = (current_filter - array); + + // find position in sorted array + for (new_pos = 0; new_pos < edje_file->filter_dir->filters_count - 1; new_pos++) + { + int cmp; + if (cur_pos == new_pos) + continue; + cmp = strcmp(current_filter->name, array[new_pos].name); + if (cmp == 0) { - ERR("parse error %s:%i. A filter named '%s' already exists within this block.", - file_in, line - 1, name); + ERR("parse error %s:%i. Another filter named '%s' already exists.", + file_in, line - 1, array[new_pos].name); exit(-1); } else if (cmp < 0) break; } + if (new_pos > cur_pos) + new_pos--; + + if (cur_pos == new_pos) + return; + + current = *current_filter; + + // move up + for (i = cur_pos - 1; i >= new_pos; i--) + array[i + 1] = array[i]; + + // move down + for (i = cur_pos; i < new_pos; i++) + array[i] = array[i + 1]; + + array[new_pos] = current; + current_filter = &array[new_pos]; +} + +static void +ob_filters_filter(void) +{ + Edje_Gfx_Filter *array; + + _filters_filter_sort(); + if (!edje_file->filter_dir) + edje_file->filter_dir = mem_alloc(sizeof(Edje_Gfx_Filter_Directory)); + array = realloc(edje_file->filter_dir->filters, sizeof(Edje_Gfx_Filter) * (edje_file->filter_dir->filters_count + 1)); if (!array) @@ -4375,39 +4427,71 @@ _filters_filter_insert(const char *name, const char *script) exit(-1); } - for (i = edje_file->filter_dir->filters_count - 1; i >= k; i--) - array[i + 1] = array[i]; - - array[k].name = eina_stringshare_add(name); - array[k].script = eina_stringshare_add(script); + current_filter = &array[edje_file->filter_dir->filters_count]; + memset(current_filter, 0, sizeof(Edje_Gfx_Filter)); edje_file->filter_dir->filters_count++; edje_file->filter_dir->filters = array; } static void -st_filters_filter_inline(void) +ob_filters_filter_script(void) { - char *name, *script; + char *script; - check_arg_count(2); + if (!current_filter) + ob_filters_filter(); - name = parse_str(0); - script = parse_str(1); - _filters_filter_insert(name, script); - free(name); - free(script); + if (!current_filter->name) + { + ERR("parse error %s:%i. Name for inline filter must be specified first.", + file_in, line - 1); + exit(-1); + } + + if (current_filter->script) + { + ERR("parse error %s:%i. Script for filter '%s' is already defined.", + file_in, line - 1, current_filter->name); + exit(-1); + } + + if (!is_verbatim()) + track_verbatim(1); + else + { + script = get_verbatim(); + if (script) + { + //current_filter->verb_l1 = get_verbatim_line1(); + //current_filter->verb_l2 = get_verbatim_line2(); + current_filter->script = strdup(script); + set_verbatim(NULL, 0, 0); + _filters_filter_sort(); + current_filter = NULL; + } + } } static void st_filters_filter_file(void) { - char *name, *file, *script; + char *file, *script; Eina_File *f; + size_t sz; - check_arg_count(2); + if (!current_filter) + ob_filters_filter(); - name = parse_str(0); - file = parse_str(1); + if (current_filter->script) + { + ERR("parse error %s:%i. Script for filter '%s' is already defined.", + file_in, line - 1, current_filter->name); + exit(-1); + } + + check_arg_count(1); + + file = parse_str(0); f = eina_file_open(file, EINA_FALSE); if (!f) { @@ -4435,11 +4519,44 @@ st_filters_filter_file(void) file_in, line - 1, file); exit(-1); } - _filters_filter_insert(name, script); + + sz = eina_file_size_get(f); + if (sz > (10 * 1024 * 1024)) + { + ERR("parse error %s:%i. Filter file '%s' is unreasonably large, abort.", + file_in, line - 1, file); + exit(-1); + } + + current_filter->script = mem_alloc(sz); + memcpy((char *) current_filter->script, script, sz); eina_file_map_free(f, script); eina_file_close(f); - free(name); + if (!current_filter->name) + { + current_filter->name = file; + _filters_filter_sort(); + } + else + { + free(file); + _filters_filter_sort(); + current_filter = NULL; + } +} + +static void +st_filters_filter_name(void) +{ + if (!current_filter) + ob_filters_filter(); + + check_arg_count(1); + + current_filter->name = parse_str(0); + + _filters_filter_sort(); } /** @edcsubsection{collections_group_limits, diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c index a261c2f..6f29897 100644 --- a/src/lib/edje/edje_load.c +++ b/src/lib/edje/edje_load.c @@ -1505,9 +1505,6 @@ _edje_file_del(Edje *ed) eina_stringshare_del(rp->typedata.text->font); eina_stringshare_del(rp->typedata.text->cache.in_str); eina_stringshare_del(rp->typedata.text->cache.out_str); - if (!rp->typedata.text->filter.no_free) - eina_stringshare_del(rp->typedata.text->filter.code); - eina_stringshare_del(rp->typedata.text->filter.name); free(rp->typedata.text); } else if ((rp->type == EDJE_RP_TYPE_SWALLOW) && @@ -1931,9 +1928,6 @@ _edje_collection_free_part_description_clean(int type, Edje_Part_Description_Com eina_stringshare_del(text->text.text_class); eina_stringshare_del(text->text.style.str); eina_stringshare_del(text->text.font.str); - if (!text->text.filter.no_free) - eina_stringshare_del(text->text.filter.code); - eina_stringshare_del(text->text.filter.name); } break; } diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index e3c55fe..5044413 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -725,8 +725,8 @@ struct _Edje_Vibration_Directory struct _Edje_Gfx_Filter { - Eina_Stringshare *name; - Eina_Stringshare *script; + const char *name; + const char *script; }; struct _Edje_Gfx_Filter_Directory diff --git a/src/tests/edje/data/test_filters.edc b/src/tests/edje/data/test_filters.edc index 2c31955..6b3b5e6 100644 --- a/src/tests/edje/data/test_filters.edc +++ b/src/tests/edje/data/test_filters.edc @@ -8,14 +8,30 @@ color_classes { } filters { // some unused filters - filter.file: "filter0" "filter.lua"; - filter.inline: "filter1" "blend {}"; + filter { + name: "filter0"; + file: "filter.lua"; + } + filter { + name: "filter1"; + script { + blend {} + } + } } collections { filters { - // some unused filters - filter.file: "filter2" "filter.lua"; - filter.inline: "filter3" "blend {}"; + // some more unused filters + filter { + name: "filterfile"; + file: "filter.lua"; + } + filter { + name: "filter3"; + script { + blend {} + } + } } images { // found in tests/emotion/data @@ -23,7 +39,7 @@ collections { } group { name: "test_group"; filters { - filter.file: "filterfile" "filter.lua"; + filter.file: "filter.lua"; } parts { part { name: "background"; --