edje: morning speed of edje. Theme can now be a little bit lighter and faster.
authorcedric <cedric>
Mon, 4 Jun 2012 02:57:15 +0000 (02:57 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 4 Jun 2012 02:57:15 +0000 (02:57 +0000)
NOTE: VIRTUAL part are almost like rectangle except they don't create any object
on the canvas. This part can't be visible, nor have any color, nor be used as a
clip, nor receive any event.

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/edje@71674 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

ChangeLog
NEWS
src/bin/edje_cc_handlers.c
src/lib/Edje.h
src/lib/edje_cache.c
src/lib/edje_calc.c
src/lib/edje_data.c
src/lib/edje_load.c
src/lib/edje_private.h

index 610e23d..a391902 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
 
        * Use Eina_File instead of fopen when possible in edje_cc.
 
-2012-05-21 Shilpa Onkar Singh
+2012-05-21  Shilpa Onkar Singh
 
         * Fix patch for edje draggable jump issue when external event
         area is used for the dragable.
+
+2012-06-04  Cedric Bail
+
+       * Add VIRTUAL part to reduce the load on the canvas (lighter and faster theme).
diff --git a/NEWS b/NEWS
index e46985a..10dc918 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,8 @@ Additions:
     * Add edje_watch to monitore change on edje source.
     * Emit ['edje,change,file', 'edje'] when the file change on disk.
     * edje_player will automatically reload the file when it change on disk.
+    * Add VIRTUAL part. This part are not putting anything into the canvas. So lighter and faster to
+    process (Use it to replace RECT part that are never visible and never catch any event).
 
 Improvements:
     * Allocate once and reuse Evas_Map.
index 2d71c44..91ae24e 100644 (file)
@@ -875,6 +875,7 @@ _edje_part_description_alloc(unsigned char type, const char *collection, const c
 
    switch (type)
      {
+      case EDJE_PART_TYPE_VIRTUAL:
       case EDJE_PART_TYPE_RECTANGLE:
       case EDJE_PART_TYPE_SWALLOW:
       case EDJE_PART_TYPE_GROUP:
@@ -3023,6 +3024,7 @@ st_collections_group_parts_part_name(void)
             @li TABLE
             @li EXTERNAL
            @li PROXY
+           @li VIRTUAL
     @endproperty
 */
 static void
@@ -3044,6 +3046,7 @@ st_collections_group_parts_part_type(void)
                      "TABLE", EDJE_PART_TYPE_TABLE,
                      "EXTERNAL", EDJE_PART_TYPE_EXTERNAL,
                      "PROXY", EDJE_PART_TYPE_PROXY,
+                    "VIRTUAL", EDJE_PART_TYPE_VIRTUAL,
                      NULL);
 
    /* handle type change of inherited part */
@@ -4379,6 +4382,7 @@ st_collections_group_parts_part_description_inherit(void)
    ed->color_class = STRDUP(ed->color_class);
    switch (ep->type)
      {
+      case EDJE_PART_TYPE_VIRTUAL:
       case EDJE_PART_TYPE_RECTANGLE:
       case EDJE_PART_TYPE_SWALLOW:
       case EDJE_PART_TYPE_GROUP:
@@ -4611,6 +4615,14 @@ st_collections_group_parts_part_description_visible(void)
 {
    check_arg_count(1);
 
+   if (current_part->type == EDJE_PART_TYPE_VIRTUAL)
+     {
+       ERR("%s: Error. parse error %s:%i. "
+          "VIRTUAL part can't have a visibility defined",
+          progname, file_in, line - 1);
+       exit(-1);
+     }
+
    current_desc->visible = parse_bool(0);
 }
 
@@ -4843,6 +4855,14 @@ st_collections_group_parts_part_description_color_class(void)
 {
    check_arg_count(1);
 
+   if (current_part->type == EDJE_PART_TYPE_VIRTUAL)
+     {
+       ERR("%s: Error. parse error %s:%i. "
+          "VIRTUAL part can't have a color defined",
+          progname, file_in, line - 1);
+       exit(-1);
+     }
+
    current_desc->color_class = parse_str(0);
 }
 
@@ -4861,6 +4881,14 @@ st_collections_group_parts_part_description_color(void)
 {
    check_arg_count(4);
 
+   if (current_part->type == EDJE_PART_TYPE_VIRTUAL)
+     {
+       ERR("%s: Error. parse error %s:%i. "
+          "VIRTUAL part can't have a color defined",
+          progname, file_in, line - 1);
+       exit(-1);
+     }
+
    current_desc->color.r = parse_int_range(0, 0, 255);
    current_desc->color.g = parse_int_range(1, 0, 255);
    current_desc->color.b = parse_int_range(2, 0, 255);
@@ -4882,6 +4910,14 @@ st_collections_group_parts_part_description_color2(void)
 {
    check_arg_count(4);
 
+   if (current_part->type == EDJE_PART_TYPE_VIRTUAL)
+     {
+       ERR("%s: Error. parse error %s:%i. "
+          "VIRTUAL part can't have a color defined",
+          progname, file_in, line - 1);
+       exit(-1);
+     }
+
    current_desc->color2.r = parse_int_range(0, 0, 255);
    current_desc->color2.g = parse_int_range(1, 0, 255);
    current_desc->color2.b = parse_int_range(2, 0, 255);
index 4f72b3b..8a286ab 100644 (file)
@@ -382,7 +382,8 @@ typedef enum _Edje_Part_Type
    EDJE_PART_TYPE_TABLE     = 9,
    EDJE_PART_TYPE_EXTERNAL  = 10,
    EDJE_PART_TYPE_PROXY     = 11,
-   EDJE_PART_TYPE_LAST      = 12
+   EDJE_PART_TYPE_VIRTUAL   = 12,
+   EDJE_PART_TYPE_LAST      = 13
 } Edje_Part_Type;
 
 typedef enum _Edje_Text_Effect
index 14a3155..20738bd 100644 (file)
@@ -63,6 +63,7 @@ _edje_file_coll_open(Edje_File *edf, const char *coll)
    INIT_EMP_BOTH(BOX, Edje_Part_Description_Box, ce);
    INIT_EMP_BOTH(TABLE, Edje_Part_Description_Table, ce);
    INIT_EMP_BOTH(EXTERNAL, Edje_Part_Description_External, ce);
+   INIT_EMP_BOTH(VIRTUAL, Edje_Part_Description_Common, ce);
    INIT_EMP(part, Edje_Part, ce);
 
    snprintf(buf, sizeof(buf), "edje/collections/%i", id);
index ccdb1b8..28771f6 100644 (file)
@@ -232,6 +232,12 @@ _edje_get_description_by_orientation(Edje *ed, Edje_Part_Description_Common *src
         ce->count.GROUP++;
          memsize = sizeof(Edje_Part_Description_Common);
          break;
+     case EDJE_PART_TYPE_VIRTUAL:
+         desc_rtl = eina_mempool_malloc(ce->mp_rtl.VIRTUAL,
+               sizeof (Edje_Part_Description_Common));
+         ce->count.VIRTUAL++;
+         memsize = sizeof(Edje_Part_Description_Common);
+         break;
         EDIT_ALLOC_POOL_RTL(TEXT, Text, text);
         EDIT_ALLOC_POOL_RTL(TEXTBLOCK, Text, text);
         EDIT_ALLOC_POOL_RTL(IMAGE, Image, image);
@@ -241,7 +247,7 @@ _edje_get_description_by_orientation(Edje *ed, Edje_Part_Description_Common *src
         EDIT_ALLOC_POOL_RTL(EXTERNAL, External, external_params);
      }
 
-   if(desc_rtl)
+   if (desc_rtl)
       memcpy(desc_rtl, src, memsize);
 
    _edje_part_make_rtl(desc_rtl);
@@ -2015,23 +2021,26 @@ _edje_part_recalc_single(Edje *ed,
    else if (ep->part->type == EDJE_PART_TYPE_PROXY)
      _edje_part_recalc_single_fill(ep, &((Edje_Part_Description_Proxy *)desc)->proxy.fill, params);
 
-   /* colors */
-   if ((desc->color_class) && (*desc->color_class))
-     cc = _edje_color_class_find(ed, desc->color_class);
-
-   if (cc)
+   if (ep->part->type != EDJE_PART_TYPE_VIRTUAL)
      {
-       params->color.r = (((int)cc->r + 1) * desc->color.r) >> 8;
-       params->color.g = (((int)cc->g + 1) * desc->color.g) >> 8;
-       params->color.b = (((int)cc->b + 1) * desc->color.b) >> 8;
-       params->color.a = (((int)cc->a + 1) * desc->color.a) >> 8;
-     }
-   else
-     {
-       params->color.r = desc->color.r;
-       params->color.g = desc->color.g;
-       params->color.b = desc->color.b;
-       params->color.a = desc->color.a;
+        /* colors */
+        if ((desc->color_class) && (*desc->color_class))
+          cc = _edje_color_class_find(ed, desc->color_class);
+
+        if (cc)
+          {
+             params->color.r = (((int)cc->r + 1) * desc->color.r) >> 8;
+             params->color.g = (((int)cc->g + 1) * desc->color.g) >> 8;
+             params->color.b = (((int)cc->b + 1) * desc->color.b) >> 8;
+             params->color.a = (((int)cc->a + 1) * desc->color.a) >> 8;
+          }
+        else
+          {
+             params->color.r = desc->color.r;
+             params->color.g = desc->color.g;
+             params->color.b = desc->color.b;
+             params->color.a = desc->color.a;
+          }
      }
 
    /* visible */
@@ -2087,6 +2096,7 @@ _edje_part_recalc_single(Edje *ed,
 
           break;
        }
+      case EDJE_PART_TYPE_VIRTUAL:
       case EDJE_PART_TYPE_RECTANGLE:
       case EDJE_PART_TYPE_BOX:
       case EDJE_PART_TYPE_TABLE:
@@ -2158,6 +2168,9 @@ _edje_proxy_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
       case EDJE_PART_TYPE_EXTERNAL:
          evas_object_image_source_set(ep->object, pp->swallowed_object);
          break;
+      case EDJE_PART_TYPE_VIRTUAL:
+         /* FIXME: detect that at compile time and prevent it */
+         break;
      }
 
    evas_object_image_fill_set(ep->object, p3->type.common.fill.x, p3->type.common.fill.y,
@@ -2785,6 +2798,9 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
              /* FIXME: definitivly remove this code when we switch to new format. */
              abort();
              break;
+           case EDJE_PART_TYPE_VIRTUAL:
+              /* We really should do nothing on VIRTUAL part */
+              break;
          }
 
        /* Some object need special recalc. */
@@ -2816,6 +2832,9 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
              /* FIXME: definitivly remove this code when we switch to new format. */
              abort();
              break;
+           case EDJE_PART_TYPE_VIRTUAL:
+              /* We really should do nothing on VIRTUAL part */
+              break;
          }
 
        if (ep->swallowed_object)
@@ -2839,7 +2858,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
              mo = ep->swallowed_object;
          }
         else mo = ep->object;
-        if (chosen_desc->map.on)
+        if (chosen_desc->map.on && ep->part->type != EDJE_PART_TYPE_VIRTUAL)
           {
              static Evas_Map *map = NULL;
 
@@ -2922,5 +2941,4 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
        ep->invalidate = 0;
      }
 #endif
-
 }
index 46fd521..e6150b7 100644 (file)
@@ -83,6 +83,7 @@ EMP(GROUP, group);
 EMP(BOX, box);
 EMP(TABLE, table);
 EMP(EXTERNAL, external);
+EMP(VIRTUAL, virtual);
 EMP(part, part);
 
 #define FREED(eed) \
@@ -105,7 +106,8 @@ struct {
   { EDJE_PART_TYPE_BOX,       "box" },
   { EDJE_PART_TYPE_TABLE,     "table" },
   { EDJE_PART_TYPE_EXTERNAL,  "external" },
-  { EDJE_PART_TYPE_PROXY,     "proxy" }
+  { EDJE_PART_TYPE_PROXY,     "proxy" },
+  { EDJE_PART_TYPE_VIRTUAL,   "virtual" }
 };
 
 static const char *
@@ -329,6 +331,7 @@ _edje_edd_init(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection_directory_entry, Edje_Part_Collection_Directory_Entry, "count.BOX", count.BOX, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection_directory_entry, Edje_Part_Collection_Directory_Entry, "count.TABLE", count.TABLE, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection_directory_entry, Edje_Part_Collection_Directory_Entry, "count.EXTERNAL", count.EXTERNAL, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection_directory_entry, Edje_Part_Collection_Directory_Entry, "count.VIRTUAL", count.VIRTUAL, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection_directory_entry, Edje_Part_Collection_Directory_Entry, "count.part", count.part, EET_T_INT);
 
    EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Style_Tag);
@@ -742,6 +745,7 @@ _edje_edd_init(void)
    eddc.func.type_set = _edje_description_variant_type_set;
    _edje_edd_edje_part_description_variant = eet_data_descriptor_file_new(&eddc);
 
+   EET_DATA_DESCRIPTOR_ADD_MAPPING(_edje_edd_edje_part_description_variant, "virtual", _edje_edd_edje_part_description_rectangle);
    EET_DATA_DESCRIPTOR_ADD_MAPPING(_edje_edd_edje_part_description_variant, "rectangle", _edje_edd_edje_part_description_rectangle);
    EET_DATA_DESCRIPTOR_ADD_MAPPING(_edje_edd_edje_part_description_variant, "swallow",   _edje_edd_edje_part_description_swallow);
    EET_DATA_DESCRIPTOR_ADD_MAPPING(_edje_edd_edje_part_description_variant, "group",     _edje_edd_edje_part_description_group);
@@ -767,6 +771,7 @@ _edje_edd_init(void)
    _edje_edd_edje_part_description_variant_list = eet_data_descriptor_file_new(&eddc);
 
    EDJE_ADD_ARRAY_MAPPING(_edje_edd_edje_part_description_variant_list, "rectangle", rectangle);
+   EDJE_ADD_ARRAY_MAPPING(_edje_edd_edje_part_description_variant_list, "virtual", rectangle);
    EDJE_ADD_ARRAY_MAPPING(_edje_edd_edje_part_description_variant_list, "swallow",   swallow);
    EDJE_ADD_ARRAY_MAPPING(_edje_edd_edje_part_description_variant_list, "group",     group);
    EDJE_ADD_ARRAY_MAPPING(_edje_edd_edje_part_description_variant_list, "image",     image);
index 85a6b07..bb7f762 100644 (file)
@@ -443,7 +443,8 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                     _edje_part_description_find(ed, rp, "default", 0.0);
                  rp->chosen_description = rp->param1.description;
                  if (!rp->param1.description)
-                   ERR("no default part description!");
+                   ERR("no default part description for '%s'!",
+                        rp->part->name);
 
                  switch (ep->type)
                    {
@@ -487,6 +488,10 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                     case EDJE_PART_TYPE_GRADIENT:
                        ERR("SPANK ! SPANK ! SPANK ! YOU ARE USING GRADIENT IN PART %s FROM GROUP %s INSIDE FILE %s !! THEY ARE NOW REMOVED !",
                            ep->name, group, file);
+                       break;
+                    case EDJE_PART_TYPE_VIRTUAL:
+                        rp->object = NULL;
+                        break;
                     default:
                        ERR("wrong part type %i!", ep->type);
                        break;
@@ -551,7 +556,9 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
                       if (rp->part->clip_to_id >= 0)
                         {
                            rp->clip_to = ed->table_parts[rp->part->clip_to_id % ed->table_parts_size];
-                           if (rp->clip_to)
+                           if (rp->clip_to &&
+                                rp->clip_to->object &&
+                                rp->object)
                              {
                                 evas_object_pass_events_set(rp->clip_to->object, 1);
                                 evas_object_pointer_mode_set(rp->clip_to->object, EVAS_OBJECT_POINTER_MODE_NOGRAB);
index 48b4827..a3718d1 100644 (file)
@@ -675,6 +675,7 @@ struct _Edje_Limit
       TYPE      GROUP;            \
       TYPE      BOX;              \
       TYPE      TABLE;            \
+      TYPE      VIRTUAL;         \
       TYPE      EXTERNAL;
 
 struct _Edje_Part_Collection_Directory_Entry
@@ -1667,6 +1668,7 @@ extern Eina_Mempool *_emp_GROUP;
 extern Eina_Mempool *_emp_BOX;
 extern Eina_Mempool *_emp_TABLE;
 extern Eina_Mempool *_emp_EXTERNAL;
+extern Eina_Mempool *_emp_VIRTUAL;
 extern Eina_Mempool *_emp_part;
 
 void  _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, FLOAT_T pos, FLOAT_T v1, FLOAT_T v2);