jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=3648b0e25203a2ce269b586b4a499468fa07bbda

commit 3648b0e25203a2ce269b586b4a499468fa07bbda
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Mon Jun 29 16:47:00 2015 +0900

    Edje: Add proper filters section in the EDJ file
    
    Don't [ab]use the file data section for filter scripts, instead
    create a proper section for them. The rest of the behaviour stays
    the same.
---
 src/bin/edje/edje_cc_handlers.c | 157 ++++++++++++++++++++++++++++++++++++++++
 src/lib/edje/edje_calc.c        |  29 ++++----
 src/lib/edje/edje_data.c        |  15 ++++
 src/lib/edje/edje_private.h     |  16 ++++
 4 files changed, 204 insertions(+), 13 deletions(-)

diff --git a/src/bin/edje/edje_cc_handlers.c b/src/bin/edje/edje_cc_handlers.c
index 4c7955f..0c14255 100644
--- a/src/bin/edje/edje_cc_handlers.c
+++ b/src/bin/edje/edje_cc_handlers.c
@@ -65,6 +65,7 @@
  *      <li>@ref sec_toplevel_data "Data"</li>
  *      <li>@ref sec_toplevel_color_classes "Color Classes"</li>
  *      <li>@ref sec_toplevel_styles "Styles"</li>
+ *      <li>@ref sec_collections_group_filter "Filters"</li> <!-- dup -->
  *    </ul>
  *    <li>@ref sec_collections "Collections"</li>
  *    <ul>
@@ -72,6 +73,7 @@
  *      <ul>
  *        <li>@ref sec_collections_sounds_sample "Sample"</li>
  *      </ul>
+ *      <li>@ref sec_collections_group_filter "Filters"</li>
  *      <li>@ref sec_collections_vibrations "Vibrations"</li>
  *      <ul>
  *        <li>@ref sec_collections_vibrations_sample "Sample"</li>
@@ -81,6 +83,7 @@
  *        <li>@ref sec_collections_group_script "Script"</li>
  *        <li>@ref sec_collections_group_limits "Limits"</li>
  *        <li>@ref sec_collections_group_data "Data"</li>
+ *        <li>@ref sec_collections_group_filter "Filters"</li>
  *        <li>@ref sec_collections_group_parts "Parts"</li>
  *        <ul>
  *          <li>@ref sec_collections_group_parts_part "Part"</li>
@@ -209,6 +212,9 @@ 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 st_filters_filter_file(void);
+
 static void ob_collections(void);
 static void st_collections_base_scale(void);
 
@@ -617,6 +623,12 @@ static void st_collections_group_nobroadcast(void);
         ed->type_node.orientation.type = 
EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_QUATERNION; \
      }
 
+#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},
+
 New_Statement_Handler statement_handlers[] =
 {
      {"externals.external", st_externals_external},
@@ -624,6 +636,7 @@ New_Statement_Handler statement_handlers[] =
      FONT_STYLE_CC_STATEMENTS("")
      {"data.item", st_data_item},
      {"data.file", st_data_file},
+     FILTERS_STATEMENTS("")
      {"collections.externals.external", st_externals_external}, /* dup */
      IMAGE_STATEMENTS("collections.")
      IMAGE_SET_STATEMENTS("collections")
@@ -643,6 +656,7 @@ New_Statement_Handler statement_handlers[] =
      {"collections.group.sounds.tone", st_collections_group_sound_tone}, /* 
dup */
      {"collections.vibrations.sample.name", 
st_collections_group_vibration_sample_name},
      {"collections.vibrations.sample.source", 
st_collections_group_vibration_sample_source},
+     FILTERS_STATEMENTS("collections.") /* dup */
      {"collections.group.vibrations.sample.name", 
st_collections_group_vibration_sample_name}, /* dup */
      {"collections.group.vibrations.sample.source", 
st_collections_group_vibration_sample_source}, /* dup */
      {"collections.group.name", st_collections_group_name},
@@ -903,6 +917,7 @@ New_Statement_Handler statement_handlers[] =
      {"collections.group.physics.world.z", 
st_collections_group_physics_world_z},
      {"collections.group.physics.world.depth", 
st_collections_group_physics_world_depth},
 #endif
+     FILTERS_STATEMENTS("collections.group.") /* dup */
      PROGRAM_STATEMENTS("collections.group.parts.part.description")
      PROGRAM_STATEMENTS("collections.group.parts.part")
      PROGRAM_STATEMENTS("collections.group.parts")
@@ -4283,6 +4298,148 @@ st_collections_group_data_item(void)
      eina_hash_direct_add(pc->data, key, es);
 }
 
+/** @edcsubsection{collections_group_filter,
+ *                 Group.Filter} */
+
+/**
+    @page edcref
+    @block
+        filters
+    @context
+        filters {
+            filter {
+                inline: "key" "Lua script here";
+                file: "key" "Lua script filename";
+                ..
+            }
+        }
+    @description
+        The "filter" block lets you embed filter scripts into an EDC group,
+        that can then be referred to in a @ref 
sec_collections_group_parts_description_filter "Text.Filter"
+        or @ref collections_group_parts_description_filter "Image.Filter" 
statement.
+
+        In a similar way to the @ref sec_collections_group_data "Group.Data" 
blocks,
+        it is possible to embed filters from a external file inside the final 
EDJ.
+
+        Please also refer to @ref evasfiltersref "Evas filters reference".
+    @endblock
+
+    @property
+        inline
+    @parameters
+        [name] [Lua script]
+    @effect
+        Defines a new Lua script used for filtering.
+    @endproperty
+
+    @property
+        file
+    @parameters
+        [name] [Lua script filename]
+    @effect
+        Includes an external file to define a new Lua script used for 
filtering.
+    @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 void
+_filters_filter_insert(const char *name, const char *script)
+{
+   Edje_Gfx_Filter *array;
+   int k, i;
+
+   if (!edje_file->filter_dir)
+     edje_file->filter_dir = mem_alloc(sizeof(Edje_Gfx_Filter_Directory));
+
+   for (k = 0; k < edje_file->filter_dir->filters_count; k++)
+     {
+        int cmp = strcmp(name, edje_file->filter_dir->filters[k].name);
+        if (!cmp)
+          {
+             ERR("parse error %s:%i. A filter named '%s' already exists within 
this block.",
+                 file_in, line - 1, name);
+             exit(-1);
+          }
+        else if (cmp < 0)
+          break;
+     }
+
+   array = realloc(edje_file->filter_dir->filters,
+                   sizeof(Edje_Gfx_Filter) * 
(edje_file->filter_dir->filters_count + 1));
+   if (!array)
+     {
+        ERR("Memory allocation failed (array grow)");
+        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);
+   edje_file->filter_dir->filters_count++;
+   edje_file->filter_dir->filters = array;
+}
+
+static void
+st_filters_filter_inline(void)
+{
+   char *name, *script;
+
+   check_arg_count(2);
+
+   name = parse_str(0);
+   script = parse_str(1);
+   _filters_filter_insert(name, script);
+   free(name);
+   free(script);
+}
+
+static void
+st_filters_filter_file(void)
+{
+   char *name, *file, *script;
+   Eina_File *f;
+
+   check_arg_count(2);
+
+   name = parse_str(0);
+   file = parse_str(1);
+   f = eina_file_open(file, EINA_FALSE);
+   if (!f)
+     {
+        char path[PATH_MAX], *dir;
+        Eina_List *l;
+        // TODO: Introduce special filters_dir? needs new edje_cc argument :(
+        EINA_LIST_FOREACH(data_dirs, l, dir)
+          {
+             snprintf(path, sizeof(path), "%s/%s", dir, file);
+             f = eina_file_open(path, EINA_FALSE);
+             if (f) break;
+          }
+        if (!f)
+          {
+             ERR("parse error %s:%i. Could not open filter script file '%s'",
+                 file_in, line - 1, file);
+             exit(-1);
+          }
+     }
+
+   script = eina_file_map_all(f, EINA_FILE_SEQUENTIAL);
+   if (!script)
+     {
+        ERR("parse error %s:%i. Could not read filter script file %s",
+            file_in, line - 1, file);
+        exit(-1);
+     }
+   _filters_filter_insert(name, script);
+   eina_file_map_free(f, script);
+   eina_file_close(f);
+   free(name);
+
+}
+
 /** @edcsubsection{collections_group_limits,
  *                 Group.Limits} */
 
diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c
index c72bba7..b45de76 100644
--- a/src/lib/edje/edje_calc.c
+++ b/src/lib/edje/edje_calc.c
@@ -2406,22 +2406,25 @@ _edje_part_recalc_single_map(Edje *ed,
 }
 
 static inline const char *
-_edje_filter_get(Edje *ed, Edje_Real_Part *ep, 
Edje_Part_Description_Spec_Filter *filter)
+_edje_filter_get(Edje *ed, Edje_Part_Description_Spec_Filter *filter)
 {
+   int k;
    if (!filter->code) return NULL;
    if (EINA_UNLIKELY(!filter->checked_data))
      {
-        Edje_String *st;
-        filter->checked_data = 1;
-        st = eina_hash_find(ed->file->data, filter->code);
-        if (st)
-          {
-             filter->name = filter->code;
-             filter->code = st->str;
-             filter->no_free = 1;
-          }
-        else
-          filter->name = eina_stringshare_add(ep->part->name);
+        // FIXME: bisect search instead of linear search
+        filter->checked_data = EINA_TRUE;
+        if (ed->file->filter_dir)
+          for (k = 0; k <= ed->file->filter_dir->filters_count; k++)
+            {
+               if (!strcmp(filter->code, 
ed->file->filter_dir->filters[k].name))
+                 {
+                    filter->name = ed->file->filter_dir->filters[k].name;
+                    filter->code = ed->file->filter_dir->filters[k].script;
+                    filter->no_free = EINA_TRUE;
+                    return filter->code;
+                 }
+            }
      }
    return filter->code;
 }
@@ -2463,7 +2466,7 @@ _edje_part_recalc_single_filter(Edje *ed,
      }
 
    /* common code below */
-   code = _edje_filter_get(ed, ep, filter);
+   code = _edje_filter_get(ed, filter);
    if (!code)
      {
         eo_do(obj, efl_gfx_filter_program_set(NULL, NULL));
diff --git a/src/lib/edje/edje_data.c b/src/lib/edje/edje_data.c
index d4671a9..cedda6d 100644
--- a/src/lib/edje/edje_data.c
+++ b/src/lib/edje/edje_data.c
@@ -75,6 +75,8 @@ Eet_Data_Descriptor *_edje_edd_edje_part_limit = NULL;
 Eet_Data_Descriptor *_edje_edd_edje_physics_face = NULL;
 Eet_Data_Descriptor *_edje_edd_edje_map_colors = NULL;
 Eet_Data_Descriptor *_edje_edd_edje_map_colors_pointer = NULL;
+Eet_Data_Descriptor *_edje_edd_edje_filter = NULL;
+Eet_Data_Descriptor *_edje_edd_edje_filter_directory = NULL;
 
 /* allocate a description struct.
  * this initializes clip_to_id as this field will not be present in most
@@ -239,6 +241,8 @@ _edje_edd_shutdown(void)
    FREED(_edje_edd_edje_mo_directory);
    FREED(_edje_edd_edje_vibration_sample);
    FREED(_edje_edd_edje_vibration_directory);
+   FREED(_edje_edd_edje_filter);
+   FREED(_edje_edd_edje_filter_directory);
    FREED(_edje_edd_edje_program);
    FREED(_edje_edd_edje_program_pointer);
    FREED(_edje_edd_edje_program_target);
@@ -460,6 +464,16 @@ _edje_edd_init(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_3d_vec, 
Edje_3D_Vec, "y", y, EDJE_T_FLOAT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description_3d_vec, 
Edje_3D_Vec, "z", z, EDJE_T_FLOAT);
 
+   /* Efl.Gfx.Filter */
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Gfx_Filter);
+   _edje_edd_edje_filter = eet_data_descriptor_file_new(&eddc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_filter, Edje_Gfx_Filter, 
"name", name, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_filter, Edje_Gfx_Filter, 
"script", script, EET_T_STRING);
+
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Gfx_Filter_Directory);
+   _edje_edd_edje_filter_directory = eet_data_descriptor_file_new(&eddc);
+   EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(_edje_edd_edje_filter_directory, 
Edje_Gfx_Filter_Directory, "filters", filters, _edje_edd_edje_filter);
+
    /* collection directory */
    EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, 
Edje_Part_Collection_Directory_Entry);
    _edje_edd_edje_part_collection_directory_entry =
@@ -533,6 +547,7 @@ _edje_edd_init(void)
    EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "model_dir", 
model_dir, _edje_edd_edje_model_directory);
    EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "sound_dir", 
sound_dir, _edje_edd_edje_sound_directory);
    EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "mo_dir", 
mo_dir, _edje_edd_edje_mo_directory);
+   EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "filter_dir", 
filter_dir, _edje_edd_edje_filter_directory);
 
    EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, 
"vibration_dir", vibration_dir, _edje_edd_edje_vibration_directory);
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_file, Edje_File, "styles", 
styles, _edje_edd_edje_style);
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index ff44bcd..bc53874 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -326,6 +326,8 @@ typedef struct _Edje_Sound_Tone                      
Edje_Sound_Tone;
 typedef struct _Edje_Sound_Directory                 Edje_Sound_Directory;
 typedef struct _Edje_Mo                              Edje_Mo;
 typedef struct _Edje_Mo_Directory                    Edje_Mo_Directory;
+typedef struct _Edje_Gfx_Filter                      Edje_Gfx_Filter;
+typedef struct _Edje_Gfx_Filter_Directory            Edje_Gfx_Filter_Directory;
 
 typedef struct _Edje_Vibration_Sample                Edje_Vibration_Sample;
 typedef struct _Edje_Vibration_Directory             Edje_Vibration_Directory;
@@ -533,6 +535,7 @@ struct _Edje_File
    Edje_Sound_Directory           *sound_dir;
    Edje_Vibration_Directory       *vibration_dir;
    Edje_Mo_Directory              *mo_dir;
+   Edje_Gfx_Filter_Directory      *filter_dir;
 
    Eina_List                      *styles;
 
@@ -719,6 +722,19 @@ struct _Edje_Vibration_Directory
    Edje_Vibration_Sample *samples;  /* an array of Edje_Sound_Sample entries */
    unsigned int samples_count;
 };
+
+struct _Edje_Gfx_Filter
+{
+   Eina_Stringshare *name;
+   Eina_Stringshare *script;
+};
+
+struct _Edje_Gfx_Filter_Directory
+{
+   Edje_Gfx_Filter *filters; /* array */
+   int              filters_count;
+};
+
 /*----------*/
 
 struct _Edje_Program /* a conditional program to be run */

-- 


Reply via email to