Revert "Edje: use textblock by default"

This reverts commit ef3d2120bf.

This breaks E. pager ono my right screen looks like:

http://devs.enlightenment.org/~raster/shot-2017-11-11_12-13-14.png

on my left screen shellf keeps swapping between 2 dizes wobbling back
and forth every frame eating cpu and making it "blurry"...

note - theme is the flat one in devs/raster/theme/flat2 branch. so
this change certainly breaks something...
This commit is contained in:
Carsten Haitzler 2017-11-11 12:10:32 +09:00
parent b5333edd3f
commit 75daddc839
5 changed files with 194 additions and 529 deletions

View File

@ -2401,7 +2401,7 @@ _edje_part_recalc_single_filter(Edje *ed,
Eina_List *li1, *li2;
/* handle TEXT, IMAGE, PROXY, SNAPSHOT part types here */
if (PART_IS_TEXT(ed, ep))
if (ep->part->type == EDJE_PART_TYPE_TEXT)
{
Edje_Part_Description_Text *chosen_edt = (Edje_Part_Description_Text *) chosen_desc;
Edje_Part_Description_Text *edt = (Edje_Part_Description_Text *) desc;
@ -2521,10 +2521,6 @@ _edje_part_recalc_single_filter(Edje *ed,
}
}
efl_gfx_filter_program_set(obj, code, filter->name);
if (PART_IS_TEXT(ed, ep))
{
efl_text_gfx_filter_set(obj, filter->name);
}
if (prev_sources != filter_sources)
{
/* remove sources that are not there anymore
@ -2832,9 +2828,11 @@ _edje_part_recalc_single(Edje *ed,
}
/* if we have text that wants to make the min size the text size... */
if (PART_IS_TEXT(ed, ep))
if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK)
_edje_part_recalc_single_textblock(sc, ed, ep, (Edje_Part_Description_Text *)chosen_desc, params, &minw, &minh, &maxw, &maxh);
else if (ep->part->type == EDJE_PART_TYPE_TEXT)
{
_edje_part_recalc_single_textblock(sc, ed, ep, (Edje_Part_Description_Text *)chosen_desc, params, &minw, &minh, &maxw, &maxh);
_edje_part_recalc_single_text(sc, ed, ep, (Edje_Part_Description_Text*) desc, (Edje_Part_Description_Text*) chosen_desc, params, &minw, &minh, &maxw, &maxh);
_edje_part_recalc_single_filter(ed, ep, desc, chosen_desc, pos);
}
@ -4387,6 +4385,11 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
break;
case EDJE_PART_TYPE_TEXT:
_edje_calc_params_need_type_text(p3);
p3->type.text->size = INTP(p1->type.text->size, p2->type.text->size, pos);
EINA_FALLTHROUGH;
/* no break as we share code with the TEXTBLOCK type here. */
case EDJE_PART_TYPE_TEXTBLOCK:
_edje_calc_params_need_type_text(p3);
p3->type.text->color2.r = INTP(p1->type.text->color2.r, p2->type.text->color2.r, pos2);
@ -4598,8 +4601,6 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
EINA_FALLTHROUGH;
case EDJE_PART_TYPE_RECTANGLE:
EINA_FALLTHROUGH;
case EDJE_PART_TYPE_TEXT:
EINA_FALLTHROUGH;
case EDJE_PART_TYPE_TEXTBLOCK:
EINA_FALLTHROUGH;
case EDJE_PART_TYPE_BOX:
@ -4609,18 +4610,11 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
case EDJE_PART_TYPE_SNAPSHOT:
EINA_FALLTHROUGH;
case EDJE_PART_TYPE_VECTOR:
if (ep->part->type == EDJE_PART_TYPE_TEXT)
{
evas_object_color_set(ep->object, 255, 255, 255, 255);
}
else
{
evas_object_color_set(ep->object,
(pf->color.r * pf->color.a) / 255,
(pf->color.g * pf->color.a) / 255,
(pf->color.b * pf->color.a) / 255,
pf->color.a);
}
#ifdef HAVE_EPHYSICS
/* body attributes should be updated for invisible objects */
@ -4708,6 +4702,10 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
}
break;
case EDJE_PART_TYPE_TEXT:
/* This is correctly handle in _edje_text_recalc_apply at the moment. */
break;
case EDJE_PART_TYPE_GRADIENT:
/* FIXME: definitivly remove this code when we switch to new format. */
abort();
@ -4912,6 +4910,9 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
/* Some object need special recalc. */
switch (ep->part->type)
{
case EDJE_PART_TYPE_TEXT:
_edje_text_recalc_apply(ed, ep, pf, (Edje_Part_Description_Text*) chosen_desc, EINA_FALSE);
break;
case EDJE_PART_TYPE_PROXY:
_edje_proxy_recalc_apply(ed, ep, pf, (Edje_Part_Description_Proxy *)chosen_desc, pos);
@ -4929,7 +4930,6 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
_edje_table_recalc_apply(ed, ep, pf, (Edje_Part_Description_Table *)chosen_desc);
break;
case EDJE_PART_TYPE_TEXT:
case EDJE_PART_TYPE_TEXTBLOCK:
_edje_textblock_recalc_apply(ed, ep, pf, (Edje_Part_Description_Text *)chosen_desc);
break;

View File

@ -1045,21 +1045,11 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch
break;
case EDJE_PART_TYPE_TEXT:
case EDJE_PART_TYPE_TEXTBLOCK:
_edje_textblock_styles_add(ed, rp);
textblocks = eina_list_append(textblocks, rp);
if (rp->part->type == EDJE_PART_TYPE_TEXT)
{
rp->object = efl_add(EFL_CANVAS_TEXT_CLASS,
ed->base.evas);
}
else
{
rp->object = evas_object_textblock_add(ed->base.evas);
}
_edje_text_part_on_add(ed, rp);
rp->object = evas_object_text_add(ed->base.evas);
evas_object_text_font_source_set(rp->object, ed->path);
break;
case EDJE_PART_TYPE_GROUP:
sources = eina_list_append(sources, rp);
@ -1077,6 +1067,12 @@ _edje_object_file_set_internal(Evas_Object *obj, const Eina_File *file, const ch
_edje_callbacks_focus_add(rp->object, ed, rp);
break;
case EDJE_PART_TYPE_TEXTBLOCK:
_edje_textblock_styles_add(ed, rp);
textblocks = eina_list_append(textblocks, rp);
rp->object = evas_object_textblock_add(ed->base.evas);
break;
case EDJE_PART_TYPE_BOX:
sources = eina_list_append(sources, rp);
rp->object = evas_object_box_add(ed->base.evas);

View File

@ -2547,11 +2547,6 @@ const char * _edje_text_class_font_get(Edje *ed,
int *size, char **free_later);
const char * _edje_text_font_get(const char *base, const char *new,
char **free_later);
const char * _set_translated_string(Edje *ed, Edje_Real_Part *ep);
#define PART_IS_TEXT(ed, ep) \
(((ep)->part->type == EDJE_PART_TYPE_TEXTBLOCK) || \
((ep)->part->type == EDJE_PART_TYPE_TEXT))
void
_edje_part_recalc_single_textblock(FLOAT_T sc,

View File

@ -1,17 +1,5 @@
#include "edje_private.h"
#ifdef DEBUG_TEXT
# define TPRN(...) do { printf(__VA_ARGS__); } while(0)
#else
# define TPRN(...)
#endif
#define COLOR_SET(color) \
(color).r * (color).a / 255, \
(color).g * (color).a / 255, \
(color).b * (color).a / 255, \
(color).a
static double
_edje_part_recalc_single_textblock_scale_range_adjust(Edje_Part_Description_Text *chosen_desc, double base_scale, double scale)
{
@ -32,248 +20,6 @@ _edje_part_recalc_single_textblock_scale_range_adjust(Edje_Part_Description_Text
return scale;
}
static void
_edje_part_recalc_textblock_font_get(Edje *ed, Edje_Real_Part *ep,
Edje_Part_Description_Text *chosen_desc,
const char **ret_font_source,
const char **ret_font, int *ret_size)
{
Edje_Real_Part *source;
const char *font;
int size;
Eina_Bool inlined_font = EINA_FALSE;
const char *font_source = NULL;
char *sfont, *font2;
sfont = font2 = NULL;
source = ep->typedata.text->source;
if (source)
font = _edje_text_class_font_get(ed,
_edje_real_part_text_source_description_get(ep,
&source), &size, &sfont);
else
font = _edje_text_class_font_get(ed, chosen_desc, &size, &sfont);
if (size <= 0) size = 1;
if (!font) font = "";
if (source)
{
if (source->typedata.text->font) font = source->typedata.text->font;
if (source->typedata.text->size > 0) size = source->typedata.text->size;
}
else
{
if (ep->typedata.text->font) font = ep->typedata.text->font;
if (ep->typedata.text->size > 0) size = ep->typedata.text->size;
}
if (ed->file->fonts)
{
Edje_Font_Directory_Entry *fnt;
fnt = eina_hash_find(ed->file->fonts, font);
if (fnt)
{
size_t len = strlen(font) + sizeof("edje/fonts/") + 1;
font2 = alloca(len);
sprintf(font2, "edje/fonts/%s", font);
font = font2;
inlined_font = 1;
font2 = NULL; // so it is not freed at the end of the function
}
}
if (inlined_font)
{
font_source = ed->path;
}
if ((_edje_fontset_append) && (font))
{
font2 = malloc(strlen(font) + 1 + strlen(_edje_fontset_append) + 1);
if (font2)
{
strcpy(font2, font);
strcat(font2, ",");
strcat(font2, _edje_fontset_append);
font = font2; //font2 needs to be freed at the end of the
// function.
}
}
if (ret_font) *ret_font = font;
if (ret_size) *ret_size = size;
if (ret_font_source) *ret_font_source = font_source;
if (font2) free(font2);
if (sfont) free(sfont);
}
static inline Eina_Bool
_edje_part_recalc_textblock_text_get(Edje *ed, Edje_Real_Part *ep,
Edje_Part_Description_Text *chosen_desc, const char **_ret)
{
Eina_Bool same = EINA_FALSE;
const char *text = NULL;
if (chosen_desc->text.domain)
{
if (!chosen_desc->text.text.translated)
chosen_desc->text.text.translated = _set_translated_string(ed, ep);
if (chosen_desc->text.text.translated)
text = chosen_desc->text.text.translated;
}
if (!text)
{
text = edje_string_get(&chosen_desc->text.text);
if (ep->typedata.text->text) text = ep->typedata.text->text;
}
if (chosen_desc->text.id_text_source >= 0)
{
Edje_Part_Description_Text *et;
Edje_Real_Part *rp;
ep->typedata.text->text_source = ed->table_parts[chosen_desc->text.id_text_source % ed->table_parts_size];
et = _edje_real_part_text_text_source_description_get(ep, &rp);
text = edje_string_get(&(et->text.text));
if (rp->typedata.text->text) text = rp->typedata.text->text;
}
if ((text == ep->typedata.text->cache.in_str)
|| (text && ep->typedata.text->cache.in_str && !strcmp(ep->typedata.text->cache.in_str, text)))
{
text = ep->typedata.text->cache.in_str;
same = EINA_TRUE;
}
if (!same)
{
eina_stringshare_replace(&ep->typedata.text->cache.in_str, text);
}
*_ret = text;
return same;
}
static inline Edje_Style *
_edje_part_recalc_textblock_style_get(Edje *ed, Edje_Real_Part *ep,
Edje_Part_Description_Text *chosen_desc)
{
Edje_Style *stl = NULL;
const char *tmp, *style = "";
Eina_List *l;
if (chosen_desc->text.id_source >= 0)
{
Edje_Part_Description_Text *et;
ep->typedata.text->source = ed->table_parts[chosen_desc->text.id_source % ed->table_parts_size];
et = _edje_real_part_text_source_description_get(ep, NULL);
tmp = edje_string_get(&et->text.style);
if (tmp) style = tmp;
}
else
{
ep->typedata.text->source = NULL;
tmp = edje_string_get(&chosen_desc->text.style);
if (tmp) style = tmp;
}
EINA_LIST_FOREACH(ed->file->styles, l, stl)
{
if ((stl->name) && (!strcmp(stl->name, style))) break;
stl = NULL;
}
return stl;
}
static inline void
_edje_part_recalc_textblock_fit(Edje_Real_Part *ep,
Edje_Part_Description_Text *chosen_desc,
Edje_Calc_Params *params,
FLOAT_T sc, Evas_Coord *tw, Evas_Coord *th)
{
double base_s = 1.0;
double orig_s;
double s = base_s;
if (ep->part->scale) base_s = TO_DOUBLE(sc);
efl_canvas_object_scale_set(ep->object, base_s);
efl_canvas_text_size_native_get(ep->object, tw, th);
orig_s = base_s;
/* Now make it bigger so calculations will be more accurate
* and less influenced by hinting... */
{
orig_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s,
orig_s * TO_INT(params->eval.w) / *tw);
efl_canvas_object_scale_set(ep->object, orig_s);
efl_canvas_text_size_native_get(ep->object, tw, th);
}
if (chosen_desc->text.fit_x)
{
if (*tw > 0)
{
s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s,
orig_s * TO_INT(params->eval.w) / *tw);
efl_canvas_object_scale_set(ep->object, s);
efl_canvas_text_size_native_get(ep->object, NULL, NULL);
}
}
if (chosen_desc->text.fit_y)
{
if (*th > 0)
{
double tmp_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s,
orig_s * TO_INT(params->eval.h) / *th);
/* If we already have X fit, restrict Y to be no bigger
* than what we got with X. */
if (!((chosen_desc->text.fit_x) && (tmp_s > s)))
{
s = tmp_s;
}
efl_canvas_object_scale_set(ep->object, s);
efl_canvas_text_size_native_get(ep->object, NULL, NULL);
}
}
/* Final tuning, try going down 90% at a time, hoping it'll
* actually end up being correct. */
{
int i = 5; /* Tries before we give up. */
Evas_Coord fw, fh;
efl_canvas_text_size_native_get(ep->object, &fw, &fh);
/* If we are still too big, try reducing the size to
* 95% each try. */
while ((i > 0) &&
((chosen_desc->text.fit_x && (fw > TO_INT(params->eval.w))) ||
(chosen_desc->text.fit_y && (fh > TO_INT(params->eval.h)))))
{
double tmp_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s, s * 0.95);
/* Break if we are not making any progress. */
if (EQ(tmp_s, s))
break;
s = tmp_s;
efl_canvas_object_scale_set(ep->object, s);
efl_canvas_text_size_native_get(ep->object, &fw, &fh);
i--;
}
}
}
/*
* Legacy function for min/max calculation of textblock part.
* It can't calculate min/max properly in many cases.
@ -289,7 +35,6 @@ _edje_part_recalc_single_textblock_min_max_calc_legacy(Edje_Real_Part *ep,
int *maxw, int *maxh)
{
Evas_Coord tw, th, ins_l, ins_r, ins_t, ins_b;
ins_l = ins_r = ins_t = ins_b = 0;
/* Legacy code for Textblock min/max calculation */
if ((chosen_desc->text.min_x) || (chosen_desc->text.min_y))
@ -304,10 +49,8 @@ _edje_part_recalc_single_textblock_min_max_calc_legacy(Edje_Real_Part *ep,
}
else
evas_object_textblock_size_native_get(ep->object, &tw, &th);
evas_object_textblock_style_insets_get(ep->object, &ins_l,
&ins_r, &ins_t, &ins_b);
&ins_r, &ins_t, &ins_b);
mw = ins_l + tw + ins_r;
mh = ins_t + th + ins_b;
if (minw && chosen_desc->text.min_x)
@ -332,10 +75,8 @@ _edje_part_recalc_single_textblock_min_max_calc_legacy(Edje_Real_Part *ep,
}
else
evas_object_textblock_size_native_get(ep->object, &tw, &th);
evas_object_textblock_style_insets_get(ep->object, &ins_l,
&ins_r, &ins_t, &ins_b);
evas_object_textblock_style_insets_get(ep->object, &ins_l, &ins_r,
&ins_t, &ins_b);
mw = ins_l + tw + ins_r;
mh = ins_t + th + ins_b;
if (maxw && chosen_desc->text.max_x)
@ -360,25 +101,19 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep,
{
Evas_Coord tw, th, ins_l, ins_r, ins_t, ins_b;
Evas_Coord min_calc_w = 0, min_calc_h = 0;
unsigned char dmin_x, dmin_y;
ins_l = ins_r = ins_t = ins_b = 0;
/* min_calc_* values need to save calculated minumum size
* for maximum size calculation */
if (minw) min_calc_w = *minw;
if (minh) min_calc_h = *minh;
dmin_x = chosen_desc->text.min_x;
dmin_y = chosen_desc->text.min_y;
if (dmin_x || dmin_y)
if ((chosen_desc->text.min_x) || (chosen_desc->text.min_y))
{
evas_object_textblock_style_insets_get(ep->object, &ins_l,
&ins_r, &ins_t, &ins_b);
&ins_r, &ins_t, &ins_b);
tw = th = 0;
if (!dmin_x)
if (!chosen_desc->text.min_x)
{
/* text.min: 0 1
* text.max: X X */
@ -426,7 +161,7 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep,
{
/* text.min: 1 X
* text.max: X X */
if (dmin_y && (!chosen_desc->text.max_x) &&
if (chosen_desc->text.min_y && (!chosen_desc->text.max_x) &&
maxw && (*maxw > -1))
{
/* text.min: 1 1
@ -487,14 +222,14 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep,
if (tw > min_calc_w) min_calc_w = tw;
if (th > min_calc_h) min_calc_h = th;
if (dmin_x && minw) *minw = min_calc_w;
if (dmin_y && minh) *minh = min_calc_h;
if (chosen_desc->text.min_x && minw) *minw = min_calc_w;
if (chosen_desc->text.min_y && minh) *minh = min_calc_h;
}
if ((chosen_desc->text.max_x) || (chosen_desc->text.max_y))
{
evas_object_textblock_style_insets_get(ep->object, &ins_l,
&ins_r, &ins_t, &ins_b);
evas_object_textblock_style_insets_get(ep->object, &ins_l, &ins_r,
&ins_t, &ins_b);
tw = th = 0;
if (!chosen_desc->text.max_x)
@ -549,7 +284,7 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep,
else
{
/* text.max: 1 X */
if (dmin_x)
if (chosen_desc->text.min_x)
{
/* text.min: 1 X
* text.max: 1 X
@ -577,7 +312,7 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep,
if (min_calc_h > temp_h)
temp_h = min_calc_h;
if (dmin_y)
if (chosen_desc->text.min_y)
{
/* text.min: 0 1
* text.max: 1 1
@ -648,147 +383,6 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep,
}
}
static void
_edje_textblock_colors_set(Edje *ed EINA_UNUSED,
Edje_Real_Part *ep,
Edje_Calc_Params *params,
Eina_Bool styles)
{
Edje_Text_Effect effect;
Efl_Text_Style_Effect_Type st;
Efl_Text_Style_Shadow_Direction dir;
if (ep->part->type == EDJE_PART_TYPE_TEXT)
{
efl_text_normal_color_set(ep->object, COLOR_SET(params->color));
evas_object_color_set(ep->object, 255, 255, 255, 255);
}
effect = ep->part->effect;
switch (effect & EDJE_TEXT_EFFECT_MASK_BASIC)
{
case EDJE_TEXT_EFFECT_NONE:
case EDJE_TEXT_EFFECT_PLAIN:
st = EFL_TEXT_STYLE_EFFECT_TYPE_NONE;
break;
case EDJE_TEXT_EFFECT_OUTLINE:
st = EFL_TEXT_STYLE_EFFECT_TYPE_OUTLINE;
if (styles) efl_text_outline_color_set(ep->object,
COLOR_SET(params->type.text->color2));
break;
case EDJE_TEXT_EFFECT_SOFT_OUTLINE:
st = EFL_TEXT_STYLE_EFFECT_TYPE_SOFT_OUTLINE;
if (styles) efl_text_outline_color_set(ep->object,
COLOR_SET(params->type.text->color2));
break;
case EDJE_TEXT_EFFECT_SHADOW:
st = EFL_TEXT_STYLE_EFFECT_TYPE_SHADOW;
if (styles) efl_text_shadow_color_set(ep->object,
COLOR_SET(params->type.text->color3));
break;
case EDJE_TEXT_EFFECT_SOFT_SHADOW:
st = EFL_TEXT_STYLE_EFFECT_TYPE_SOFT_SHADOW;
if (styles) efl_text_shadow_color_set(ep->object,
COLOR_SET(params->type.text->color3));
break;
case EDJE_TEXT_EFFECT_OUTLINE_SHADOW:
st = EFL_TEXT_STYLE_EFFECT_TYPE_OUTLINE_SHADOW;
if (styles)
{
efl_text_outline_color_set(ep->object,
COLOR_SET(params->type.text->color2));
efl_text_shadow_color_set(ep->object,
COLOR_SET(params->type.text->color3));
}
break;
case EDJE_TEXT_EFFECT_OUTLINE_SOFT_SHADOW:
st = EFL_TEXT_STYLE_EFFECT_TYPE_OUTLINE_SOFT_SHADOW;
if (styles)
{
efl_text_outline_color_set(ep->object,
COLOR_SET(params->type.text->color2));
efl_text_shadow_color_set(ep->object,
COLOR_SET(params->type.text->color3));
}
break;
case EDJE_TEXT_EFFECT_FAR_SHADOW:
st = EFL_TEXT_STYLE_EFFECT_TYPE_FAR_SHADOW;
if (styles) efl_text_shadow_color_set(ep->object,
COLOR_SET(params->type.text->color3));
break;
case EDJE_TEXT_EFFECT_FAR_SOFT_SHADOW:
st = EFL_TEXT_STYLE_EFFECT_TYPE_FAR_SOFT_SHADOW;
if (styles) efl_text_shadow_color_set(ep->object,
COLOR_SET(params->type.text->color3));
break;
case EDJE_TEXT_EFFECT_GLOW:
st = EFL_TEXT_STYLE_EFFECT_TYPE_GLOW;
if (styles)
{
efl_text_glow_color_set(ep->object,
COLOR_SET(params->type.text->color2));
efl_text_glow2_color_set(ep->object,
COLOR_SET(params->type.text->color3));
}
break;
default:
st = EFL_TEXT_STYLE_EFFECT_TYPE_NONE;
break;
}
switch (effect & EDJE_TEXT_EFFECT_MASK_SHADOW_DIRECTION)
{
case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM_RIGHT:
dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_RIGHT;
break;
case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM:
dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM;
break;
case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM_LEFT:
dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_LEFT;
break;
case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_LEFT:
dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_LEFT;
break;
case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP_LEFT:
dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_TOP_LEFT;
break;
case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP:
dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_TOP;
break;
case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP_RIGHT:
dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_TOP_RIGHT;
break;
case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_RIGHT:
dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_RIGHT;
break;
default:
dir = EFL_TEXT_STYLE_SHADOW_DIRECTION_TOP;
break;
}
efl_text_effect_type_set(ep->object, st);
efl_text_shadow_direction_set(ep->object, dir);
}
void
_edje_part_recalc_single_textblock(FLOAT_T sc,
Edje *ed,
@ -798,97 +392,172 @@ _edje_part_recalc_single_textblock(FLOAT_T sc,
int *minw, int *minh,
int *maxw, int *maxh)
{
double align_y;
if ((ep->type != EDJE_RP_TYPE_TEXT) ||
(!ep->typedata.text))
return;
align_y = TO_DOUBLE(params->type.text->align.y);
efl_text_valign_set(ep->object, align_y);
if (ep->part->type == EDJE_PART_TYPE_TEXT)
{
double align_x;
align_x = TO_DOUBLE(params->type.text->align.x);
if (align_x < 0)
{
efl_text_halign_auto_type_set(ep->object,
EFL_TEXT_HORIZONTAL_ALIGNMENT_AUTO_NORMAL);
}
else
{
efl_text_halign_set(ep->object, align_x);
}
}
(!ep->typedata.text))
return;
if (chosen_desc)
{
const char *font, *font_source;
int size;
Evas_Coord tw, th;
const char *text = "";
const char *style = "";
Edje_Style *stl = NULL;
const char *text;
const char *tmp;
Eina_List *l;
_edje_part_recalc_textblock_text_get(ed, ep, chosen_desc,
&text);
if (chosen_desc->text.id_source >= 0)
{
Edje_Part_Description_Text *et;
stl = _edje_part_recalc_textblock_style_get(ed, ep, chosen_desc);
ep->typedata.text->source = ed->table_parts[chosen_desc->text.id_source % ed->table_parts_size];
et = _edje_real_part_text_source_description_get(ep, NULL);
tmp = edje_string_get(&et->text.style);
if (tmp) style = tmp;
}
else
{
ep->typedata.text->source = NULL;
tmp = edje_string_get(&chosen_desc->text.style);
if (tmp) style = tmp;
}
if (chosen_desc->text.id_text_source >= 0)
{
Edje_Part_Description_Text *et;
Edje_Real_Part *rp;
ep->typedata.text->text_source = ed->table_parts[chosen_desc->text.id_text_source % ed->table_parts_size];
et = _edje_real_part_text_text_source_description_get(ep, &rp);
text = edje_string_get(&et->text.text);
if (rp->typedata.text->text) text = rp->typedata.text->text;
}
else
{
ep->typedata.text->text_source = NULL;
text = edje_string_get(&chosen_desc->text.text);
if (ep->typedata.text->text) text = ep->typedata.text->text;
}
EINA_LIST_FOREACH(ed->file->styles, l, stl)
{
if ((stl->name) && (!strcmp(stl->name, style))) break;
stl = NULL;
}
if (ep->part->scale)
evas_object_scale_set(ep->object, TO_DOUBLE(sc));
if ((chosen_desc->text.fit_x) || (chosen_desc->text.fit_y))
{
_edje_part_recalc_textblock_fit(ep, chosen_desc, params, sc, &tw, &th);
}
double base_s = 1.0;
double orig_s;
double s = base_s;
_edje_part_recalc_textblock_font_get(ed, ep, chosen_desc,
&font_source, &font, &size);
if (ep->part->scale) base_s = TO_DOUBLE(sc);
efl_canvas_object_scale_set(ep->object, base_s);
efl_canvas_text_size_native_get(ep->object, &tw, &th);
orig_s = base_s;
/* Now make it bigger so calculations will be more accurate
* and less influenced by hinting... */
{
orig_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s,
orig_s * TO_INT(params->eval.w) / tw);
efl_canvas_object_scale_set(ep->object, orig_s);
efl_canvas_text_size_native_get(ep->object, &tw, &th);
}
if (chosen_desc->text.fit_x)
{
if (tw > 0)
{
s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s,
orig_s * TO_INT(params->eval.w) / tw);
efl_canvas_object_scale_set(ep->object, s);
efl_canvas_text_size_native_get(ep->object, NULL, NULL);
}
}
if (chosen_desc->text.fit_y)
{
if (th > 0)
{
double tmp_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s,
orig_s * TO_INT(params->eval.h) / th);
/* If we already have X fit, restrict Y to be no bigger
* than what we got with X. */
if (!((chosen_desc->text.fit_x) && (tmp_s > s)))
{
s = tmp_s;
}
efl_canvas_object_scale_set(ep->object, s);
efl_canvas_text_size_native_get(ep->object, NULL, NULL);
}
}
/* Final tuning, try going down 90% at a time, hoping it'll
* actually end up being correct. */
{
int i = 5; /* Tries before we give up. */
Evas_Coord fw, fh;
efl_canvas_text_size_native_get(ep->object, &fw, &fh);
/* If we are still too big, try reducing the size to
* 95% each try. */
while ((i > 0) &&
((chosen_desc->text.fit_x && (fw > TO_INT(params->eval.w))) ||
(chosen_desc->text.fit_y && (fh > TO_INT(params->eval.h)))))
{
double tmp_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s, s * 0.95);
/* Break if we are not making any progress. */
if (EQ(tmp_s, s))
break;
s = tmp_s;
efl_canvas_object_scale_set(ep->object, s);
efl_canvas_text_size_native_get(ep->object, &fw, &fh);
i--;
}
}
}
if (stl)
{
if (evas_object_textblock_style_get(ep->object) != stl->style)
evas_object_textblock_style_set(ep->object, stl->style);
// FIXME: need to account for editing
if (ep->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
{
// do nothing - should be done elsewhere
}
else
{
evas_object_textblock_text_markup_set(ep->object, text);
}
if ((ed->file->efl_version.major >= 1) && (ed->file->efl_version.minor >= 19))
{
_edje_part_recalc_single_textblock_min_max_calc(ep,
chosen_desc,
params,
minw, minh,
maxw, maxh);
}
else
{
_edje_part_recalc_single_textblock_min_max_calc_legacy(ep,
chosen_desc,
params,
minw, minh,
maxw, maxh);
}
}
if (ep->part->type == EDJE_PART_TYPE_TEXT)
{
FLOAT_T ellip = params->type.text->ellipsis;
efl_text_font_set(ep->object, font, size);
efl_text_ellipsis_set(ep->object, (ellip == -1.0) ? -1.0 : 1.0 - ellip);
_edje_textblock_colors_set(ed, ep, params, EINA_TRUE);
}
// FIXME: need to account for editing
if (ep->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
{
// do nothing - should be done elsewhere
}
else
{
evas_object_textblock_text_markup_set(ep->object, text);
}
if ((ed->file->efl_version.major >= 1) && (ed->file->efl_version.minor >= 19))
{
_edje_part_recalc_single_textblock_min_max_calc(ep,
chosen_desc,
params,
minw, minh,
maxw, maxh);
}
else
{
_edje_part_recalc_single_textblock_min_max_calc_legacy(ep,
chosen_desc,
params,
minw, minh,
maxw, maxh);
}
evas_object_textblock_valign_set(ep->object, TO_DOUBLE(chosen_desc->text.align.y));
}
}
@ -897,11 +566,15 @@ _edje_textblock_recalc_apply(Edje *ed, Edje_Real_Part *ep,
Edje_Calc_Params *params,
Edje_Part_Description_Text *chosen_desc)
{
/* FIXME: this is just an hack. */
FLOAT_T sc;
#if 0
_get_text(ep);
#endif
sc = DIV(ed->scale, ed->file->base_scale);
if (EQ(sc, ZERO)) sc = DIV(_edje_scale, ed->file->base_scale);
_edje_textblock_colors_set(ed, ep, params, EINA_FALSE);
if (chosen_desc->text.fit_x || chosen_desc->text.fit_y)
{
_edje_part_recalc_single_textblock(sc, ed, ep, chosen_desc, params,

View File

@ -2078,7 +2078,7 @@ _edje_efl_text_get(Eo *obj EINA_UNUSED, Edje *ed, const char *part,
return desc->text.text.str;
}
}
else
if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
{
const char *entry;
if (legacy)
@ -3496,7 +3496,7 @@ again:
//width
if (!ep->chosen_description->fixed.w)
{
if ((legacy_calc) && PART_IS_TEXT(ed, ep))
if ((legacy_calc) && (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK))
{
//We care textblock width size specially.
Evas_Coord tb_mw;
@ -3524,8 +3524,9 @@ again:
{
if (legacy_calc)
{
if (!PART_IS_TEXT(ed, ep) ||
((Edje_Part_Description_Text *)ep->chosen_description)->text.min_x || !skip_h)
if ((ep->part->type != EDJE_PART_TYPE_TEXTBLOCK) ||
((Edje_Part_Description_Text *)ep->chosen_description)->text.min_x ||
!skip_h)
{
if (over_h > max_over_h)
{
@ -3535,7 +3536,7 @@ again:
}
}
if (PART_IS_TEXT(ed, ep))
if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK)
has_fixed_tb = EINA_FALSE;
}
else if (over_h > max_over_h)