From b0e087b6bf442ff895ad0299aaa8e09838ffb3e7 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Mon, 4 Jun 2012 02:57:15 +0000 Subject: [PATCH] edje: morning speed of edje. Theme can now be a little bit lighter and faster. 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. SVN revision: 71674 --- legacy/edje/ChangeLog | 6 ++- legacy/edje/NEWS | 2 + legacy/edje/src/bin/edje_cc_handlers.c | 36 +++++++++++++++++ legacy/edje/src/lib/Edje.h | 3 +- legacy/edje/src/lib/edje_cache.c | 1 + legacy/edje/src/lib/edje_calc.c | 56 +++++++++++++++++--------- legacy/edje/src/lib/edje_data.c | 7 +++- legacy/edje/src/lib/edje_load.c | 11 ++++- legacy/edje/src/lib/edje_private.h | 2 + 9 files changed, 100 insertions(+), 24 deletions(-) diff --git a/legacy/edje/ChangeLog b/legacy/edje/ChangeLog index 610e23d934..a3919022a4 100644 --- a/legacy/edje/ChangeLog +++ b/legacy/edje/ChangeLog @@ -467,7 +467,11 @@ * 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/legacy/edje/NEWS b/legacy/edje/NEWS index e46985a057..10dc918c43 100644 --- a/legacy/edje/NEWS +++ b/legacy/edje/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. diff --git a/legacy/edje/src/bin/edje_cc_handlers.c b/legacy/edje/src/bin/edje_cc_handlers.c index 2d71c4484f..91ae24ee3d 100644 --- a/legacy/edje/src/bin/edje_cc_handlers.c +++ b/legacy/edje/src/bin/edje_cc_handlers.c @@ -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); diff --git a/legacy/edje/src/lib/Edje.h b/legacy/edje/src/lib/Edje.h index 4f72b3bcfe..8a286ab4d9 100644 --- a/legacy/edje/src/lib/Edje.h +++ b/legacy/edje/src/lib/Edje.h @@ -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 diff --git a/legacy/edje/src/lib/edje_cache.c b/legacy/edje/src/lib/edje_cache.c index 14a3155afa..20738bd0b1 100644 --- a/legacy/edje/src/lib/edje_cache.c +++ b/legacy/edje/src/lib/edje_cache.c @@ -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); diff --git a/legacy/edje/src/lib/edje_calc.c b/legacy/edje/src/lib/edje_calc.c index ccdb1b8058..28771f6be0 100644 --- a/legacy/edje/src/lib/edje_calc.c +++ b/legacy/edje/src/lib/edje_calc.c @@ -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 (ep->part->type != EDJE_PART_TYPE_VIRTUAL) + { + /* 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; + 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 - } diff --git a/legacy/edje/src/lib/edje_data.c b/legacy/edje/src/lib/edje_data.c index 46fd521ea7..e6150b7a9f 100644 --- a/legacy/edje/src/lib/edje_data.c +++ b/legacy/edje/src/lib/edje_data.c @@ -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); diff --git a/legacy/edje/src/lib/edje_load.c b/legacy/edje/src/lib/edje_load.c index 85a6b07957..bb7f762871 100644 --- a/legacy/edje/src/lib/edje_load.c +++ b/legacy/edje/src/lib/edje_load.c @@ -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); diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 48b4827a78..a3718d1da6 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -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);