From 5b0b0da92b7d92005d81cecfd766df6811671361 Mon Sep 17 00:00:00 2001 From: Mykyta Biliavskyi Date: Mon, 16 May 2016 15:12:31 +0300 Subject: [PATCH] Edje_edit: generate states of the image part edc code with inheritance. Generate inheritance image attributes from similar state. --- src/lib/edje/edje_edit.c | 199 ++++++++++++++++++++++++++++++--------- 1 file changed, 155 insertions(+), 44 deletions(-) diff --git a/src/lib/edje/edje_edit.c b/src/lib/edje/edje_edit.c index 80afc48609..f54f2b4d30 100644 --- a/src/lib/edje/edje_edit.c +++ b/src/lib/edje/edje_edit.c @@ -12825,7 +12825,9 @@ _edje_generate_source_state_relative(Edje *ed, static void _edje_generate_source_state_image(Edje_Edit *eed, Evas_Object *obj, const char *part, const char *state, double value, - Edje_Part_Description_Common *pd, Eina_Strbuf *buf) + Edje_Part_Description_Common *pd, + Edje_Part_Description_Common *inherit_pd, + Eina_Strbuf *buf) { Eina_Bool ret = EINA_TRUE; Eina_List *l, *ll; @@ -12834,21 +12836,57 @@ _edje_generate_source_state_image(Edje_Edit *eed, Evas_Object *obj, char *data; const char *image_name; - Edje_Part_Description_Image *img; + Eina_Bool name = EINA_FALSE; + Eina_Bool border = EINA_FALSE; + Eina_Bool border_scale_by = EINA_FALSE; + Eina_Bool scale_hint = EINA_FALSE; + Eina_Bool border_no_fill = EINA_FALSE; + Eina_Bool border_scale = EINA_FALSE; + Edje_Part_Description_Image *img; img = (Edje_Part_Description_Image *)pd; + Edje_Part_Description_Image *inherit_pd_img = (Edje_Part_Description_Image *)inherit_pd; image_name = _edje_image_name_find(eed, img->image.id); ll = edje_edit_state_tweens_list_get(obj, part, state, value); - attr_amount = 0; - attr_amount += (image_name == NULL) ? 0 : 1; - attr_amount += (ll == NULL) ? 0 : 2; - attr_amount += (img->image.border.l == 0 && img->image.border.r == 0 && img->image.border.t == 0 && img->image.border.b == 0) ? 0 : 1; - attr_amount += (img->image.border.scale == 0) ? 0 : 1; - attr_amount += (img->image.scale_hint != EVAS_IMAGE_SCALE_HINT_DYNAMIC && img->image.scale_hint != EVAS_IMAGE_SCALE_HINT_STATIC) ? 0 : 1; - attr_amount += (img->image.border.no_fill == 0) ? 0 : 1; +/*TODO: support tweens inherit*/ + if (inherit_pd) + { + const char *inherit_name = _edje_image_name_find(eed, inherit_pd_img->image.id); + name = ((image_name != NULL) && (inherit_name != NULL) && (!strcmp(image_name, inherit_name))) ? EINA_FALSE : EINA_TRUE; + border = ((img->image.border.l == inherit_pd_img->image.border.l) && + (img->image.border.r == inherit_pd_img->image.border.r) && + (img->image.border.t == inherit_pd_img->image.border.t) && + (img->image.border.b == inherit_pd_img->image.border.b)) ? EINA_FALSE : EINA_TRUE; + + border_scale_by = (img->image.border.scale_by == inherit_pd_img->image.border.scale_by) ? EINA_FALSE : EINA_TRUE; + + scale_hint = (img->image.scale_hint == inherit_pd_img->image.scale_hint) ? EINA_FALSE : EINA_TRUE; + + border_no_fill = (img->image.border.no_fill == inherit_pd_img->image.border.no_fill) ? EINA_FALSE : EINA_TRUE; + + border_scale = (img->image.border.scale == inherit_pd_img->image.border.scale) ? EINA_FALSE : EINA_TRUE; + + /*Add check for a tween images*/ + } + else + { + name = (image_name == NULL) ? EINA_FALSE : EINA_TRUE; + border = (img->image.border.l == 0 && img->image.border.r == 0 && + img->image.border.t == 0 && img->image.border.b == 0) ? EINA_FALSE : EINA_TRUE; + border_scale_by = (img->image.border.scale_by == 0) ? EINA_FALSE : EINA_TRUE; + scale_hint = (img->image.scale_hint == EVAS_IMAGE_SCALE_HINT_NONE) ? EINA_FALSE : EINA_TRUE; + border_no_fill = (img->image.border.no_fill == 0) ? EINA_FALSE : EINA_TRUE; + border_scale = (img->image.border.scale == 0) ? EINA_FALSE : EINA_TRUE; + } + + + attr_amount = name + border + border_scale_by + scale_hint + border_no_fill + border_scale; + attr_amount += (ll == NULL) ? 0 : 2; + + if (attr_amount == 0) goto fill; if (attr_amount == 1) indent_space = 0; @@ -12857,45 +12895,45 @@ _edje_generate_source_state_image(Edje_Edit *eed, Evas_Object *obj, else BUF_APPEND(I5 "image."); - if (image_name) + if (name && image_name) BUF_APPENDF("%*snormal: \"%s\";\n", indent_space, "", image_name); EINA_LIST_FOREACH(ll, l, data) BUF_APPENDF("%*stween: \"%s\";\n", indent_space, "", data); edje_edit_string_list_free(ll); - if (img->image.border.l || img->image.border.r || - img->image.border.t || img->image.border.b) + if (border) BUF_APPENDF("%*sborder: %d %d %d %d;\n", indent_space, "", img->image.border.l, img->image.border.r, img->image.border.t, img->image.border.b); - if (img->image.border.scale_by != 0.0) + if (border_scale_by) { - char border_scale_by[strlen("border_scale_by") + indent_space + 1]; - snprintf(border_scale_by, strlen("border_scale_by") + indent_space + 1, + char border_scale_by_str[strlen("border_scale_by") + indent_space + 1]; + snprintf(border_scale_by_str, strlen("border_scale_by") + indent_space + 1, "%*sborder_scale_by", indent_space, ""); - _edje_source_with_double_values_append(border_scale_by, 1, + _edje_source_with_double_values_append(border_scale_by_str, 1, TO_DOUBLE(img->image.border.scale_by), 0.0, buf, &ret); } - if (img->image.border.scale) + + if (border_scale) BUF_APPENDF("%*sborder_scale: 1;\n", indent_space, ""); - if (img->image.scale_hint == EVAS_IMAGE_SCALE_HINT_DYNAMIC) + if (scale_hint && img->image.scale_hint == EVAS_IMAGE_SCALE_HINT_DYNAMIC) { BUF_APPENDF("%*sscale_hint: DYNAMIC;\n", indent_space, ""); } - else if (img->image.scale_hint == EVAS_IMAGE_SCALE_HINT_STATIC) + else if (scale_hint && img->image.scale_hint == EVAS_IMAGE_SCALE_HINT_STATIC) { BUF_APPENDF("%*sscale_hint: STATIC;\n", indent_space, ""); } - if (img->image.border.no_fill == 1) + if (border_no_fill && img->image.border.no_fill == 1) { BUF_APPENDF("%*smiddle: NONE;\n", indent_space, ""); } - else if (img->image.border.no_fill == 2) + else if (border_no_fill && img->image.border.no_fill == 2) { BUF_APPENDF("%*smiddle: SOLID;\n", indent_space, ""); } @@ -12904,17 +12942,50 @@ _edje_generate_source_state_image(Edje_Edit *eed, Evas_Object *obj, BUF_APPEND(I5 "}\n"); //image //Fill - +fill: attr_amount = 0; int attr_orig_amount = 0; int attr_size_amount = 0; - attr_amount += (img->image.fill.smooth == 1) ? 0 : 1; - attr_amount += (img->image.fill.type == EDJE_FILL_TYPE_SCALE) ? 0 : 1; - attr_orig_amount += ((img->image.fill.pos_rel_x == 0) && (img->image.fill.pos_rel_y == 0)) ? 0 : 1; - attr_orig_amount += ((img->image.fill.pos_abs_x == 0) && (img->image.fill.pos_abs_y == 0)) ? 0 : 1; - attr_size_amount += ((TO_DOUBLE(img->image.fill.rel_x) == 1) && (TO_DOUBLE(img->image.fill.rel_y) == 1)) ? 0 : 1; - attr_size_amount += ((img->image.fill.abs_x == 0) && (img->image.fill.abs_y == 0)) ? 0 : 1; - attr_amount += attr_orig_amount + attr_size_amount; + + Eina_Bool smooth = EINA_FALSE; + Eina_Bool type = EINA_FALSE; + Eina_Bool orig_rel = EINA_FALSE; + Eina_Bool orig_abs = EINA_FALSE; + Eina_Bool size_rel = EINA_FALSE; + Eina_Bool size_abs = EINA_FALSE; + + if (inherit_pd_img) + { + smooth = (inherit_pd_img->image.fill.smooth == img->image.fill.smooth) ? EINA_FALSE : EINA_TRUE; + type = (inherit_pd_img->image.fill.type == img->image.fill.type) ? EINA_FALSE : EINA_TRUE; + orig_rel = ((inherit_pd_img->image.fill.pos_rel_x == img->image.fill.pos_rel_x) && + (inherit_pd_img->image.fill.pos_rel_y == img->image.fill.pos_rel_y)) ? EINA_FALSE : EINA_TRUE; + orig_abs = ((inherit_pd_img->image.fill.pos_abs_x == img->image.fill.pos_abs_x) && + (inherit_pd_img->image.fill.pos_abs_y == img->image.fill.pos_abs_y)) ? EINA_FALSE : EINA_TRUE; + + size_rel = ((inherit_pd_img->image.fill.rel_x == img->image.fill.rel_x) && + (inherit_pd_img->image.fill.rel_y == img->image.fill.rel_y)) ? EINA_FALSE : EINA_TRUE; + size_abs = ((inherit_pd_img->image.fill.abs_x == img->image.fill.abs_x) && + (inherit_pd_img->image.fill.abs_y == img->image.fill.abs_y)) ? EINA_FALSE : EINA_TRUE; + } + else + { + smooth = (img->image.fill.smooth == 1) ? EINA_FALSE : EINA_TRUE; + type = (img->image.fill.type == EDJE_FILL_TYPE_SCALE) ? EINA_FALSE : EINA_TRUE; + orig_rel = ((img->image.fill.pos_rel_x == 0) && (img->image.fill.pos_rel_y == 0)) ? EINA_FALSE : EINA_TRUE; + orig_abs = ((img->image.fill.pos_abs_x == 0) && (img->image.fill.pos_abs_y == 0)) ? EINA_FALSE : EINA_TRUE; + size_rel = ((TO_DOUBLE(img->image.fill.rel_x) == 1) && (TO_DOUBLE(img->image.fill.rel_y) == 1)) ? EINA_FALSE : EINA_TRUE; + size_abs = ((img->image.fill.abs_x == 0) && (img->image.fill.abs_y == 0)) ? EINA_FALSE : EINA_TRUE; + } + + + + attr_amount = smooth + type; + attr_orig_amount = orig_rel + orig_abs; + attr_size_amount = size_rel + size_abs; + attr_amount = smooth + type + attr_orig_amount + attr_size_amount; + + if (attr_amount == 0) return; indent_space = 0; if (attr_amount > 1 || attr_size_amount || attr_orig_amount) @@ -12927,10 +12998,10 @@ _edje_generate_source_state_image(Edje_Edit *eed, Evas_Object *obj, else BUF_APPEND(I5 "fill."); - if (!img->image.fill.smooth) + if (smooth) BUF_APPENDF("%*ssmooth: 0;\n", indent_space, ""); - if (img->image.fill.type == EDJE_FILL_TYPE_TILE) + if (type) BUF_APPENDF("%*stype: TILE;\n", indent_space, ""); if (attr_orig_amount) @@ -12943,7 +13014,7 @@ _edje_generate_source_state_image(Edje_Edit *eed, Evas_Object *obj, else BUF_APPEND(I6 "origin."); - if (img->image.fill.pos_rel_x || img->image.fill.pos_rel_y) + if (orig_rel) { char relative[strlen("relative") + indent_space + 1]; snprintf(relative, strlen("relative") + indent_space + 1, @@ -12954,7 +13025,7 @@ _edje_generate_source_state_image(Edje_Edit *eed, Evas_Object *obj, buf, &ret); } - if (img->image.fill.pos_abs_x || img->image.fill.pos_abs_y) + if (orig_abs) BUF_APPENDF("%*soffset: %d %d;\n", indent_space, "", img->image.fill.pos_abs_x, img->image.fill.pos_abs_y); @@ -12973,7 +13044,7 @@ _edje_generate_source_state_image(Edje_Edit *eed, Evas_Object *obj, else BUF_APPEND(I6 "size."); - if (img->image.fill.rel_x != 1.0 || img->image.fill.rel_y != 1.0) + if (size_rel) { char relative[strlen("relative") + indent_space + 1]; snprintf(relative, strlen("relative") + indent_space + 1, @@ -12984,7 +13055,7 @@ _edje_generate_source_state_image(Edje_Edit *eed, Evas_Object *obj, buf, &ret); } - if (img->image.fill.abs_x || img->image.fill.abs_y) + if (size_abs) BUF_APPENDF("%*soffset: %d %d;\n", indent_space, "", img->image.fill.abs_x, img->image.fill.abs_y); @@ -13751,6 +13822,39 @@ _edje_text_desc_diff_calculate(Edje_Part_Description_Common *ed, Edje_Part_Descr return diffs_amount; } +#define IMAGE_STATE_ATTRIBUTES_AMOUNT (5 + COMMON_STATE_ATTRIBUTES_AMOUNT) +static int +_edje_image_desc_diff_calculate(Edje_Edit *eed, + Edje_Part_Description_Common *pd, + Edje_Part_Description_Common *inherit_pd) +{ + int diffs_amount = _edje_common_desc_diff_calculate(pd, inherit_pd); + + /*TODO: support tweens */ + Edje_Part_Description_Image *image_pd = (Edje_Part_Description_Image *) pd; + Edje_Part_Description_Image *inherit_pd_image = (Edje_Part_Description_Image *) inherit_pd; + + const char *image_name = _edje_image_name_find(eed, image_pd->image.id); + const char *inherit_name = _edje_image_name_find(eed, inherit_pd_image->image.id); + diffs_amount += ((image_name != NULL) && (inherit_name != NULL) && + (!strcmp(image_name, inherit_name))) ? EINA_FALSE : EINA_TRUE; + + diffs_amount += ((image_pd->image.border.l == inherit_pd_image->image.border.l) && + (image_pd->image.border.r == inherit_pd_image->image.border.r) && + (image_pd->image.border.t == inherit_pd_image->image.border.t) && + (image_pd->image.border.b == inherit_pd_image->image.border.b)) ? EINA_FALSE : EINA_TRUE; + + diffs_amount += (image_pd->image.border.scale == inherit_pd_image->image.border.scale) ? EINA_FALSE : EINA_TRUE; + + diffs_amount += (image_pd->image.border.scale_by == inherit_pd_image->image.border.scale_by) ? EINA_FALSE : EINA_TRUE; + + diffs_amount += (image_pd->image.scale_hint == inherit_pd_image->image.scale_hint) ? EINA_FALSE : EINA_TRUE; + + diffs_amount += (image_pd->image.border.no_fill == inherit_pd_image->image.border.no_fill) ? EINA_FALSE : EINA_TRUE; + + return diffs_amount; +} + static Edje_Part_Description_Common * _edje_generate_source_of_state_inherit(Edje_Edit *eed EINA_UNUSED, Edje_Part *ep, Edje_Part_Description_Common *pd) { @@ -13781,25 +13885,29 @@ _edje_generate_source_of_state_inherit(Edje_Edit *eed EINA_UNUSED, Edje_Part *ep diff_amount = _edje_text_desc_diff_calculate(pd, ep->default_desc); diff_coeff = (int)(((100 * diff_amount) / (TEXT_STATE_ATTRIBUTES_AMOUNT))); break; + case EDJE_PART_TYPE_IMAGE: + diff_amount = _edje_image_desc_diff_calculate(eed, pd, ep->default_desc); + diff_coeff = (int)(((100 * diff_amount) / (IMAGE_STATE_ATTRIBUTES_AMOUNT))); + break; default: diff_amount = _edje_common_desc_diff_calculate(pd, ep->default_desc); diff_coeff = (int)(((100 * diff_amount) / (COMMON_STATE_ATTRIBUTES_AMOUNT))); break; } - /* - * For case when beetwen current state and "default" state little amount of - * differencies - stop search - */ - if (ep->default_desc && diff_amount <= 1) - return inherit; - - if ((diff_coeff <= DIFFERENCE_LEVEL) && (diff_coeff < diff_min)) + if ((diff_coeff <= DIFFERENCE_LEVEL) && (diff_coeff < diff_min)) { diff_min = diff_coeff; inherit = ep->default_desc; } + /* + * For case when beetwen current state and "default" state little amount of + * differencies - stop search + */ + if (inherit && diff_amount <= 1) + return inherit; + for (i = 0; i < ep->other.desc_count; i++) { desc = ep->other.desc[i]; @@ -13814,6 +13922,9 @@ _edje_generate_source_of_state_inherit(Edje_Edit *eed EINA_UNUSED, Edje_Part *ep case EDJE_PART_TYPE_TEXT: diff_coeff = _edje_text_desc_diff_calculate(pd, desc); break; + case EDJE_PART_TYPE_IMAGE: + diff_coeff = _edje_image_desc_diff_calculate(eed, pd, desc); + break; default: diff_coeff = _edje_common_desc_diff_calculate(pd, desc); break; @@ -14070,7 +14181,7 @@ _edje_generate_source_of_state(Evas_Object *obj, const char *part, const char *s //Image if (rp->part->type == EDJE_PART_TYPE_IMAGE) - _edje_generate_source_state_image(eed, obj, part, state, value, pd, buf); + _edje_generate_source_state_image(eed, obj, part, state, value, pd, inherit_pd, buf) ; //Proxy if (rp->part->type == EDJE_PART_TYPE_PROXY)