Edje_edit: generate states of the image part edc code with inheritance.

Generate inheritance image attributes from similar state.
This commit is contained in:
Mykyta Biliavskyi 2016-05-16 15:12:31 +03:00
parent 3c3a21d614
commit 5b0b0da92b
1 changed files with 155 additions and 44 deletions

View File

@ -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)