Bugfix and refactor get of font based on text_class.

Edje tries to copy original style to font provided by text_class if
this have no style.

However code was supposing that text_class font always had more than
one occurrence, these separated with ',' and did not check if this is
not the case, so "e = strchr(',', tok);" was returning NULL and all
the math were using negative values.

The fix now does the proper checking, avoid one useless alloca() and
the respective copy, also doing the copies with memcpy() since sizes
are already known.

Refactory was done to make code simpler and also avoid having it
copied 3 times.


SVN revision: 33869
This commit is contained in:
Gustavo Sverzut Barbieri 2008-02-29 21:43:55 +00:00
parent da7eabb809
commit 08bfdacdee
3 changed files with 60 additions and 140 deletions

View File

@ -663,101 +663,12 @@ _edje_part_recalc_single(Edje *ed,
text = ep->text.text_source->chosen_description->text.text;
else
text = chosen_desc->text.text;
if (ep->text.source)
{
font = ep->text.source->chosen_description->text.font;
size = ep->text.source->chosen_description->text.size;
}
else
{
font = chosen_desc->text.font;
size = chosen_desc->text.size;
}
if (ep->text.source)
{
if ((ep->text.source->chosen_description->text.text_class) &&
(*ep->text.source->chosen_description->text.text_class))
{
Edje_Text_Class *tc;
tc = _edje_text_class_find(ed, ep->text.source->chosen_description->text.text_class);
if (tc)
{
if ((tc->font) && (chosen_desc->text.font))
{
char *tok, *tok2, *e;
tok = strstr(chosen_desc->text.font, ":style=");
tok2 = strstr(tc->font, ":style=");
if ((tok) && (!tok2))
{
char *stl;
int tclen;
e = strchr(tok, ',');
stl = alloca(e - tok + 1);
strncpy(stl, tok, e - tok);
stl[e - tok] = 0;
font = tc->font;
tclen = strlen(tc->font);
sfont = malloc(tclen + e - tok + 1);
strcpy(sfont, tc->font);
strcpy(sfont + tclen, stl);
font = sfont;
}
else
font = tc->font;
}
else
{
if (tc->font) font = tc->font;
}
size = _edje_text_size_calc(size, tc);
}
}
}
if (ep->text.source)
font = _edje_text_class_font_get(ed, ep->text.source->chosen_description, &size, &sfont);
else
{
if ((chosen_desc->text.text_class) && (*chosen_desc->text.text_class))
{
Edje_Text_Class *tc;
font = _edje_text_class_font_get(ed, chosen_desc, &size, &sfont);
tc = _edje_text_class_find(ed, chosen_desc->text.text_class);
if (tc)
{
if ((tc->font) && (chosen_desc->text.font))
{
char *tok, *tok2, *e;
tok = strstr(chosen_desc->text.font, ":style=");
tok2 = strstr(tc->font, ":style=");
if ((tok) && (!tok2))
{
char *stl;
int tclen;
e = strchr(tok, ',');
stl = alloca(e - tok + 1);
strncpy(stl, tok, e - tok);
stl[e - tok] = 0;
font = tc->font;
tclen = strlen(tc->font);
sfont = malloc(tclen + e - tok + 1);
strcpy(sfont, tc->font);
strcpy(sfont + tclen, stl);
font = sfont;
}
else
font = tc->font;
}
else
{
if (tc->font) font = tc->font;
}
size = _edje_text_size_calc(size, tc);
}
}
}
if (!font) font = "";
if (ep->text.text_source)

View File

@ -1049,6 +1049,8 @@ void _edje_text_part_on_del(Edje *ed, Edje_Part *ep);
void _edje_text_real_part_on_del(Edje *ed, Edje_Real_Part *ep);
void _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *params, Edje_Part_Description *chosen_desc);
Evas_Font_Size _edje_text_size_calc(Evas_Font_Size size, Edje_Text_Class *tc);
const char * _edje_text_class_font_get(Edje *ed, Edje_Part_Description *chosen_desc, int *size, char **free_later);
Edje_Real_Part *_edje_real_part_get(Edje *ed, const char *part);
Edje_Real_Part *_edje_real_part_recursive_get(Edje *ed, const char *part);

View File

@ -272,6 +272,60 @@ _edje_text_fit_x(Edje *ed, Edje_Real_Part *ep,
return buf;
}
static const char *
_edje_text_font_get(const char *base, const char *new, char **free_later)
{
const char *base_style, *new_style, *aux;
int font_len, style_len;
if (base && (!new))
return base;
else if ((!base) && new)
return new;
base_style = strstr(base, ":style=");
if (!base_style)
return new;
new_style = strstr(new, ":style=");
if (new_style)
return new;
font_len = strlen(new);
aux = strchr(base_style, ',');
style_len = (aux) ? (aux - base_style) : strlen(base_style);
*free_later = malloc(font_len + style_len + 1);
memcpy(*free_later, new, font_len);
memcpy(*free_later + font_len, base_style, style_len);
(*free_later)[font_len + style_len] = '\0';
return *free_later;
}
const char *
_edje_text_class_font_get(Edje *ed, Edje_Part_Description *chosen_desc, int *size, char **free_later)
{
Edje_Text_Class *tc;
const char *text_class_name, *font;
font = chosen_desc->text.font;
*size = chosen_desc->text.size;
text_class_name = chosen_desc->text.text_class;
if ((!text_class_name) || (!text_class_name[0]))
return font;
tc = _edje_text_class_find(ed, text_class_name);
if (!tc)
return font;
font = _edje_text_font_get(chosen_desc->text.font, tc->font, free_later);
*size = _edje_text_size_calc(*size, tc);
return font;
}
void
_edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
Edje_Calc_Params *params,
@ -288,54 +342,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
text = chosen_desc->text.text;
font = chosen_desc->text.font;
size = chosen_desc->text.size;
if ((chosen_desc->text.text_class) && (chosen_desc->text.text_class[0] != 0))
{
Edje_Text_Class *tc;
tc = _edje_text_class_find(ed, chosen_desc->text.text_class);
if (tc)
{
/* if the existing font spec in edje has a :style=XXX in it then
* its hinting that it wants to remain in that style even when
* a textclass is applied. if the textclass does not explicitly
* state a style, then snarf the old style out of the font spec
* and apply it to the text class being applie
*/
if ((tc->font) && (chosen_desc->text.font))
{
char *tok, *tok2, *e;
tok = strstr(chosen_desc->text.font, ":style=");
tok2 = strstr(tc->font, ":style=");
if ((tok) && (!tok2))
{
char *stl;
int tclen;
e = strchr(tok, ',');
stl = alloca(e - tok + 1);
strncpy(stl, tok, e - tok);
stl[e - tok] = 0;
font = tc->font;
tclen = strlen(tc->font);
sfont = malloc(tclen + e - tok + 1);
strcpy(sfont, tc->font);
strcpy(sfont + tclen, stl);
font = sfont;
}
else
font = tc->font;
}
else
{
if (tc->font) font = tc->font;
}
size = _edje_text_size_calc(size, tc);
}
}
font = _edje_text_class_font_get(ed, chosen_desc, &size, &sfont);
if (ep->text.text) text = (char *) ep->text.text;
if (ep->text.font) font = ep->text.font;