1 #include "edje_private.h"
2 #define _ELLIP_STR "\xE2\x80\xA6"
3 
4 #include "../evas/canvas/evas_text_eo.h"
5 
6 /* returns with and height for this part.
7  *
8  * depending on the value of the use_alternate_font_metrics flag, it will
9  * either use evas_object_geometry_get() or the _advance_get() functions.
10  *
11  * The latter is useful if you want to make sure that width and height
12  * are the same value for the same number of characters in the text.
13  * This usually only makes sense for monospaced fonts.
14  *
15  * In future changes to this file, you probably should use this wrapper
16  * function everywhere instead of calling evas_object_geometry_get()
17  * directly.
18  */
19 
20 static inline void
part_get_geometry(Edje_Real_Part * rp,Evas_Coord * w,Evas_Coord * h)21 part_get_geometry(Edje_Real_Part *rp, Evas_Coord *w, Evas_Coord *h)
22 {
23    if (!rp->part->use_alternate_font_metrics)
24      {
25         Eina_Size2D sz = efl_gfx_entity_size_get(rp->object);
26         if (w) *w = sz.w;
27         if (h) *h = sz.h;
28      }
29    else
30      {
31         if (w) *w = evas_object_text_horiz_advance_get(rp->object);
32         if (h) *h = evas_object_text_vert_advance_get(rp->object);
33      }
34 }
35 
36 const char *
_set_translated_string(Edje * ed,Edje_Real_Part * ep)37 _set_translated_string(Edje *ed, Edje_Real_Part *ep)
38 {
39    const char *domain = NULL;
40    const char *text = NULL;
41    Edje_Part_Description_Text *chosen_desc;
42 
43    chosen_desc = (Edje_Part_Description_Text *)ep->chosen_description;
44    domain = chosen_desc->text.domain;
45    text = edje_string_get(&chosen_desc->text.text);
46 
47    if (domain && text)
48      {
49 #ifdef ENABLE_NLS
50         char p[PATH_MAX];
51         char *curpath;
52         char *curlocale;
53 
54         snprintf(p, sizeof(p), "%s-%s", ed->file->fid, domain);
55 
56         curlocale = setlocale(LC_ALL, "");
57         if (ed->language)
58           setlocale(LC_ALL, ed->language);
59 
60         curpath = bindtextdomain(p, _edje_cache_path);
61         text = dgettext(p, text);
62 
63         bindtextdomain(p, curpath);
64         setlocale(LC_ALL, curlocale);
65 #else
66         (void) ed;
67 #endif
68      }
69    return text;
70 }
71 
72 void
_edje_text_init(void)73 _edje_text_init(void)
74 {
75 }
76 
77 void
_edje_text_part_on_add(Edje * ed,Edje_Real_Part * ep)78 _edje_text_part_on_add(Edje *ed, Edje_Real_Part *ep)
79 {
80    Edje_Part *pt = ep->part;
81    Edje_Part_Description_Text *desc;
82    unsigned int i;
83 
84    if (ep->part->type != EDJE_PART_TYPE_TEXT) return;
85 
86    /* if text class exists for this part, add the edje to the tc member list */
87    desc = (Edje_Part_Description_Text *)pt->default_desc;
88    if ((pt->default_desc) && (desc->text.text_class))
89      efl_observable_observer_add(_edje_text_class_member, desc->text.text_class, ed->obj);
90 
91    /* If any other classes exist add them */
92    for (i = 0; i < pt->other.desc_count; ++i)
93      {
94         desc = (Edje_Part_Description_Text *)pt->other.desc[i];
95         if ((desc) && (desc->text.text_class))
96           efl_observable_observer_add(_edje_text_class_member, desc->text.text_class, ed->obj);
97      }
98 }
99 
100 void
_edje_text_part_on_del(Edje * ed,Edje_Part * pt)101 _edje_text_part_on_del(Edje *ed, Edje_Part *pt)
102 {
103    Edje_Part_Description_Text *desc;
104    unsigned int i;
105 
106    if (!pt) return;
107    if (pt->type != EDJE_PART_TYPE_TEXT)
108      return;
109 
110    desc = (Edje_Part_Description_Text *)pt->default_desc;
111    if ((pt->default_desc) && (desc->text.text_class))
112      efl_observable_observer_del(_edje_text_class_member, desc->text.text_class, ed->obj);
113 
114    for (i = 0; i < pt->other.desc_count; ++i)
115      {
116         desc = (Edje_Part_Description_Text *)pt->other.desc[i];
117         if (desc->text.text_class)
118           efl_observable_observer_del(_edje_text_class_member, desc->text.text_class, ed->obj);
119      }
120 }
121 
122 static const char *
_edje_text_fit_x(Edje * ed,Edje_Real_Part * ep,Edje_Calc_Params * params,Edje_Part_Description_Text * chosen_desc,const char * text,const char * font,int size,Evas_Coord sw,Evas_Coord sh,int * free_text)123 _edje_text_fit_x(Edje *ed, Edje_Real_Part *ep,
124                  Edje_Calc_Params *params,
125                  Edje_Part_Description_Text *chosen_desc,
126                  const char *text, const char *font, int size,
127                  Evas_Coord sw, Evas_Coord sh, int *free_text)
128 {
129    FLOAT_T sc;
130 
131    sc = DIV(ed->scale, ed->file->base_scale);
132    if (EQ(sc, ZERO)) sc = DIV(_edje_scale, ed->file->base_scale);
133 
134    *free_text = 0;
135    if (sw <= 1) return "";
136 
137    _edje_calc_params_need_type_text(params);
138    if ((params->type.text->ellipsis < 0) || (chosen_desc->text.min_x))
139      return text;
140 
141    if (ep->part->scale) evas_object_scale_set(ep->object, TO_DOUBLE(sc));
142 
143    evas_obj_text_ellipsis_set(ep->object, params->type.text->ellipsis);
144    efl_text_font_family_set(ep->object, font);
145    efl_text_font_size_set(ep->object, size);
146    efl_text_set(ep->object, text);
147    efl_gfx_entity_size_set(ep->object, EINA_SIZE2D(sw,  sh));
148 
149    return text;
150 }
151 
152 const char *
_edje_text_font_get(const char * base,const char * new,char ** free_later)153 _edje_text_font_get(const char *base, const char *new, char **free_later)
154 {
155    const char *base_style, *new_style, *aux;
156    size_t font_len, style_len;
157 
158    if (base && (!new))
159      return base;
160    else if (!base)
161      return new;
162    base_style = strstr(base, ":style=");
163    if (!base_style)
164      return new;
165 
166    new_style = strstr(new, ":style=");
167    if (new_style)
168      return new;
169 
170    font_len = strlen(new);
171    aux = strchr(base_style, ',');
172    style_len = (aux) ? (size_t)(aux - base_style) : strlen(base_style);
173 
174    *free_later = malloc(font_len + style_len + 1);
175    memcpy(*free_later, new, font_len);
176    memcpy(*free_later + font_len, base_style, style_len);
177    (*free_later)[font_len + style_len] = '\0';
178 
179    return *free_later;
180 }
181 
182 const char *
_edje_text_class_font_get(Edje * ed,Edje_Part_Description_Text * chosen_desc,int * size,char ** free_later)183 _edje_text_class_font_get(Edje *ed, Edje_Part_Description_Text *chosen_desc, int *size, char **free_later)
184 {
185    Edje_Text_Class *tc;
186    const char *text_class_name, *font;
187 
188    font = edje_string_get(&chosen_desc->text.font);
189    *size = chosen_desc->text.size;
190 
191    text_class_name = chosen_desc->text.text_class;
192    if ((!text_class_name) || (!text_class_name[0]))
193      return font;
194 
195    tc = _edje_text_class_find(ed, text_class_name);
196    if (!tc)
197      return font;
198 
199    font = _edje_text_font_get(edje_string_get(&chosen_desc->text.font), tc->font, free_later);
200    *size = _edje_text_size_calc(*size, tc);
201 
202    return font;
203 }
204 
205 void
_edje_text_recalc_apply(Edje * ed,Edje_Real_Part * ep,Edje_Calc_Params * params,Edje_Part_Description_Text * chosen_desc,Eina_Bool calc_only)206 _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
207                         Edje_Calc_Params *params,
208                         Edje_Part_Description_Text *chosen_desc,
209                         Eina_Bool calc_only)
210 {
211    const char *text = NULL;
212    const char *font;
213    char *font2 = NULL;
214    char *sfont = NULL;
215    int size;
216    Evas_Coord tw, th;
217    Evas_Coord sw, sh;
218    int inlined_font = 0, free_text = 0;
219    Eina_Bool same_text = EINA_FALSE;
220    FLOAT_T sc;
221 
222    if ((ep->type != EDJE_RP_TYPE_TEXT) ||
223        (!ep->typedata.text)) return;
224    sc = DIV(ed->scale, ed->file->base_scale);
225    if (EQ(sc, ZERO)) sc = DIV(_edje_scale, ed->file->base_scale);
226 
227    if (chosen_desc->text.domain)
228      {
229         if (!chosen_desc->text.text.translated)
230           chosen_desc->text.text.translated = _set_translated_string(ed, ep);
231         if (chosen_desc->text.text.translated)
232           text = chosen_desc->text.text.translated;
233      }
234 
235    if (!text)
236      text = edje_string_get(&chosen_desc->text.text);
237    font = _edje_text_class_font_get(ed, chosen_desc, &size, &sfont);
238 
239    if (ep->typedata.text->text) text = ep->typedata.text->text;
240    if (ep->typedata.text->font) font = ep->typedata.text->font;
241    if (ep->typedata.text->size > 0) size = ep->typedata.text->size;
242 
243    if (chosen_desc->text.id_text_source >= 0)
244      {
245         Edje_Part_Description_Text *et;
246         Edje_Real_Part *rp2;
247         ep->typedata.text->text_source = ed->table_parts[chosen_desc->text.id_text_source % ed->table_parts_size];
248 
249         et = _edje_real_part_text_text_source_description_get(ep, &rp2);
250         text = edje_string_get(&(et->text.text));
251         if (rp2->typedata.text->text) text = rp2->typedata.text->text;
252      }
253 
254    if (chosen_desc->text.id_source >= 0)
255      {
256         Edje_Part_Description_Text *et;
257         Edje_Real_Part *rp2;
258 
259         ep->typedata.text->source =  ed->table_parts[chosen_desc->text.id_source % ed->table_parts_size];
260 
261         et = _edje_real_part_text_source_description_get(ep, &rp2);
262         font = edje_string_get(&(et->text.font));
263         size = et->text.size;
264         if (rp2->typedata.text->font) font = rp2->typedata.text->font;
265         if (rp2->typedata.text->size > 0) size = rp2->typedata.text->size;
266      }
267 
268    if (!text) text = "";
269    if (!font) font = "";
270 
271    /* check if the font is embedded in the .eet */
272    if (ed->file->fonts)
273      {
274         Edje_Font_Directory_Entry *fnt = eina_hash_find(ed->file->fonts, font);
275 
276         if (fnt)
277           {
278              size_t len = strlen(font) + sizeof("edje/fonts/") + 1;
279              font2 = alloca(len);
280              sprintf(font2, "edje/fonts/%s", font);
281              font = font2;
282              inlined_font = 1;
283              font2 = NULL;
284           }
285      }
286 
287    if ((_edje_fontset_append) && (font))
288      {
289         font2 = malloc(strlen(font) + 1 + strlen(_edje_fontset_append) + 1);
290         if (font2)
291           {
292              strcpy(font2, font);
293              strcat(font2, ",");
294              strcat(font2, _edje_fontset_append);
295              font = font2;
296           }
297      }
298 
299    sw = TO_INT(params->eval.w);
300    sh = TO_INT(params->eval.h);
301 
302    _edje_calc_params_need_type_text(params);
303    if (params->type.text->size)
304      size = params->type.text->size;
305 
306    if ((text == ep->typedata.text->cache.in_str)
307        || (text && ep->typedata.text->cache.in_str && !strcmp(ep->typedata.text->cache.in_str, text)))
308      {
309         text = ep->typedata.text->cache.in_str;
310         same_text = EINA_TRUE;
311      }
312 
313    if ((ep->typedata.text->cache.in_size == size) &&
314        (ep->typedata.text->cache.in_w == sw) &&
315        (ep->typedata.text->cache.in_h == sh) &&
316        (ep->typedata.text->cache.in_str) &&
317        same_text &&
318        (EQ(ep->typedata.text->cache.align_x, params->type.text->align.x)) &&
319        (EQ(ep->typedata.text->cache.align_y, params->type.text->align.y)) &&
320        (EQ(ep->typedata.text->cache.ellipsis, params->type.text->ellipsis)) &&
321        (ep->typedata.text->cache.fit_x == chosen_desc->text.fit_x) &&
322        (ep->typedata.text->cache.fit_y == chosen_desc->text.fit_y) &&
323        (ep->typedata.text->cache.in_font == font))
324      {
325         text = ep->typedata.text->cache.out_str;
326         size = ep->typedata.text->cache.out_size;
327 
328         goto arrange_text;
329      }
330    if (!same_text)
331      {
332         eina_stringshare_replace(&ep->typedata.text->cache.in_str, text);
333      }
334    ep->typedata.text->cache.in_size = size;
335    if (chosen_desc->text.fit_x && (ep->typedata.text->cache.in_str && eina_stringshare_strlen(ep->typedata.text->cache.in_str) > 0))
336      {
337         if (inlined_font) efl_text_font_source_set(ep->object, ed->path);
338         else efl_text_font_source_set(ep->object, NULL);
339 
340         if (ep->part->scale) efl_gfx_entity_scale_set(ep->object, TO_DOUBLE(sc));
341 
342         efl_text_set(ep->object, text);
343         /* the fit shoult not depend on font size, because it give the differet
344          * size calculation. As base font size for calculate fit size I take
345          * 10 (ten), because this value used for calculate fit by Y below */
346         efl_text_font_family_set(ep->object, font);
347         efl_text_font_size_set(ep->object, 10);
348         part_get_geometry(ep, &tw, &th);
349 
350         size = (10 * sw) / tw;
351         efl_text_font_family_set(ep->object, font);
352         efl_text_font_size_set(ep->object, size);
353         part_get_geometry(ep, &tw, &th);
354         while ((tw > sw) && (size > 1))
355           {
356              size--;
357              efl_text_font_family_set(ep->object, font);
358              efl_text_font_size_set(ep->object, size);
359              part_get_geometry(ep, &tw, &th);
360           }
361      }
362    if (chosen_desc->text.fit_y && (ep->typedata.text->cache.in_str && eina_stringshare_strlen(ep->typedata.text->cache.in_str) > 0))
363      {
364         /* if we fit in the x axis, too, size already has a somewhat
365          * meaningful value, so don't overwrite it with the starting
366          * value in that case
367          */
368         if (!chosen_desc->text.fit_x) size = sh;
369 
370         if (size < 1) size = 1;
371         if (inlined_font) efl_text_font_source_set(ep->object, ed->path);
372         else efl_text_font_source_set(ep->object, NULL);
373 
374         if (ep->part->scale) efl_gfx_entity_scale_set(ep->object, TO_DOUBLE(sc));
375 
376         efl_text_font_family_set(ep->object, font);
377         efl_text_font_size_set(ep->object, size);
378         efl_text_set(ep->object, text);
379         part_get_geometry(ep, &tw, &th);
380 
381         /* only grow the font size if we didn't already reach the max size
382          * for the x axis
383          */
384         if (!chosen_desc->text.fit_x && th < sh)
385           {
386              int dif;
387 
388              dif = (th - sh) / 4;
389              if (dif < 1) dif = 1;
390              while ((th < sh) && (sw > 0))
391                {
392                   size += dif;
393                   if (size <= 0) break;
394 
395                   if (inlined_font) efl_text_font_source_set(ep->object, ed->path);
396                   else efl_text_font_source_set(ep->object, NULL);
397 
398                   if (ep->part->scale) efl_gfx_entity_scale_set(ep->object, TO_DOUBLE(sc));
399                   efl_text_font_family_set(ep->object, font);
400                   efl_text_font_size_set(ep->object, size);
401 
402                   part_get_geometry(ep, &tw, &th);
403                   if ((size > 0) && (th == 0)) break;
404                }
405              size -= dif;
406           }
407         else if (th > sh)
408           {
409              int current;
410 
411              if (ep->part->scale) efl_gfx_entity_scale_set(ep->object, TO_DOUBLE(sc));
412              efl_text_font_family_set(ep->object, font);
413              efl_text_font_size_set(ep->object, 10);
414 
415              part_get_geometry(ep, &tw, &th);
416 
417              if (th == sh)
418                current = 10;
419              else
420                {
421                   int bottom, top;
422 
423                   if (th < sh) bottom = 10;
424                   else if (th > sh)
425                     bottom = 1;
426                   else bottom = 0;  /* XXX shut up GCC, th == sh is handled before! */
427 
428                   top = size;
429                   /* search one that fits (binary search) */
430                   do
431                     {
432                        current = (top + bottom) / 2;
433 
434                        if (ep->part->scale) efl_gfx_entity_scale_set(ep->object, TO_DOUBLE(sc));
435                        efl_text_font_family_set(ep->object, font);
436                        efl_text_font_size_set(ep->object, current);
437 
438                        part_get_geometry(ep, &tw, &th);
439 
440                        if (th < sh) bottom = current + 1;
441                        else if (th > sh)
442                          top = current - 1;
443                     } while ((bottom < top) && (th != sh));
444                }
445 
446              /* search the larger one that fits (linear search) */
447              do
448                {
449                   current++;
450 
451                   if (ep->part->scale) efl_gfx_entity_scale_set(ep->object, TO_DOUBLE(sc));
452                   efl_text_font_family_set(ep->object, font);
453                   efl_text_font_size_set(ep->object, current);
454 
455                   part_get_geometry(ep, &tw, &th);
456                } while (th <= sh);
457              size = current - 1;
458           }
459      }
460 
461    /* Make sure the size is in range */
462    if (size < 1)
463      size = 1;
464    else if ((size > chosen_desc->text.size_range_max) &&
465             (chosen_desc->text.size_range_max > 0))
466      size = chosen_desc->text.size_range_max;
467    else if (size < chosen_desc->text.size_range_min)
468      size = chosen_desc->text.size_range_min;
469 
470    /* Handle ellipsis */
471    if (!chosen_desc->text.min_x)
472      {
473         if (inlined_font) efl_text_font_source_set(ep->object, ed->path);
474         else efl_text_font_source_set(ep->object, NULL);
475 
476         text = _edje_text_fit_x(ed, ep, params, chosen_desc,
477                                 text, font, size,
478                                 sw, sh, &free_text);
479      }
480    else if ((ed->file->version >= 3) && (ed->file->minor >= 6))
481      {
482         evas_object_text_ellipsis_set(ep->object,
483                                       params->type.text->ellipsis);
484      }
485 
486    eina_stringshare_replace(&ep->typedata.text->cache.out_str, text);
487    ep->typedata.text->cache.in_w = sw;
488    ep->typedata.text->cache.in_h = sh;
489    ep->typedata.text->cache.in_font = font;
490    ep->typedata.text->cache.out_size = size;
491    ep->typedata.text->cache.align_x = params->type.text->align.x;
492    ep->typedata.text->cache.align_y = params->type.text->align.y;
493    ep->typedata.text->cache.ellipsis = params->type.text->ellipsis;
494    ep->typedata.text->cache.fit_x = chosen_desc->text.fit_x;
495    ep->typedata.text->cache.fit_y = chosen_desc->text.fit_y;
496 arrange_text:
497 
498    if (inlined_font) efl_text_font_source_set(ep->object, ed->path);
499    else efl_text_font_source_set(ep->object, NULL);
500 
501    if (ep->part->scale) efl_gfx_entity_scale_set(ep->object, TO_DOUBLE(sc));
502 
503    efl_text_font_family_set(ep->object, font);
504    efl_text_font_size_set(ep->object, size);
505    efl_text_set(ep->object, text);
506    part_get_geometry(ep, &tw, &th);
507 
508    /* Handle alignment */
509    {
510       FLOAT_T align_x;
511       if (params->type.text->align.x < FROM_INT(0))
512         {
513            if ((Evas_BiDi_Direction)evas_object_text_direction_get(ep->object) ==
514                EVAS_BIDI_DIRECTION_RTL)
515              {
516                 align_x = FROM_INT(1);
517              }
518            else
519              {
520                 align_x = FROM_INT(0);
521              }
522         }
523       else
524         {
525            align_x = params->type.text->align.x;
526         }
527       ep->typedata.text->offset.x = TO_INT(SCALE(align_x, (sw - tw)));
528       ep->typedata.text->offset.y = TO_INT(SCALE(params->type.text->align.y, (sh - th)));
529    }
530 
531    if (!calc_only)
532      {
533         Eina_Position2D pos;
534         pos.x = ed->x + TO_INT(params->eval.x) + ep->typedata.text->offset.x;
535         pos.y = ed->y + TO_INT(params->eval.y) + ep->typedata.text->offset.y;
536         efl_gfx_entity_position_set(ep->object, pos);
537         efl_gfx_entity_visible_set(ep->object, params->visible);
538      }
539 
540    {
541       Evas_Text_Style_Type style;
542       Edje_Text_Effect effect;
543 
544       style = EVAS_TEXT_STYLE_PLAIN;
545 
546       evas_object_color_set(ep->object,
547                             (params->color.r * params->color.a) / 255,
548                             (params->color.g * params->color.a) / 255,
549                             (params->color.b * params->color.a) / 255,
550                             params->color.a);
551       effect = ep->part->effect;
552       switch (effect & EDJE_TEXT_EFFECT_MASK_BASIC)
553         {
554          case EDJE_TEXT_EFFECT_NONE:
555          case EDJE_TEXT_EFFECT_PLAIN:
556            style = EVAS_TEXT_STYLE_PLAIN;
557            break;
558 
559          case EDJE_TEXT_EFFECT_OUTLINE:
560            style = EVAS_TEXT_STYLE_OUTLINE;
561            evas_object_text_outline_color_set(ep->object,
562                                               (params->type.text->color2.r * params->type.text->color2.a) / 255,
563                                               (params->type.text->color2.g * params->type.text->color2.a) / 255,
564                                               (params->type.text->color2.b * params->type.text->color2.a) / 255,
565                                               params->type.text->color2.a);
566            break;
567 
568          case EDJE_TEXT_EFFECT_SOFT_OUTLINE:
569            style = EVAS_TEXT_STYLE_SOFT_OUTLINE;
570            evas_object_text_outline_color_set(ep->object,
571                                               (params->type.text->color2.r * params->type.text->color2.a) / 255,
572                                               (params->type.text->color2.g * params->type.text->color2.a) / 255,
573                                               (params->type.text->color2.b * params->type.text->color2.a) / 255,
574                                               params->type.text->color2.a);
575            break;
576 
577          case EDJE_TEXT_EFFECT_SHADOW:
578            style = EVAS_TEXT_STYLE_SHADOW;
579            evas_object_text_shadow_color_set(ep->object,
580                                              (params->type.text->color3.r * params->type.text->color3.a) / 255,
581                                              (params->type.text->color3.g * params->type.text->color3.a) / 255,
582                                              (params->type.text->color3.b * params->type.text->color3.a) / 255,
583                                              params->type.text->color3.a);
584            break;
585 
586          case EDJE_TEXT_EFFECT_SOFT_SHADOW:
587            style = EVAS_TEXT_STYLE_SOFT_SHADOW;
588            evas_object_text_shadow_color_set(ep->object,
589                                              (params->type.text->color3.r * params->type.text->color3.a) / 255,
590                                              (params->type.text->color3.g * params->type.text->color3.a) / 255,
591                                              (params->type.text->color3.b * params->type.text->color3.a) / 255,
592                                              params->type.text->color3.a);
593            break;
594 
595          case EDJE_TEXT_EFFECT_OUTLINE_SHADOW:
596            style = EVAS_TEXT_STYLE_OUTLINE_SHADOW;
597            evas_obj_text_outline_color_set(ep->object, (params->type.text->color2.r * params->type.text->color2.a) / 255, (params->type.text->color2.g * params->type.text->color2.a) / 255, (params->type.text->color2.b * params->type.text->color2.a) / 255, params->type.text->color2.a);
598            evas_obj_text_shadow_color_set(ep->object, (params->type.text->color3.r * params->type.text->color3.a) / 255, (params->type.text->color3.g * params->type.text->color3.a) / 255, (params->type.text->color3.b * params->type.text->color3.a) / 255, params->type.text->color3.a);
599            break;
600 
601          case EDJE_TEXT_EFFECT_OUTLINE_SOFT_SHADOW:
602            style = EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW;
603            evas_obj_text_outline_color_set(ep->object, (params->type.text->color2.r * params->type.text->color2.a) / 255, (params->type.text->color2.g * params->type.text->color2.a) / 255, (params->type.text->color2.b * params->type.text->color2.a) / 255, params->type.text->color2.a);
604            evas_obj_text_shadow_color_set(ep->object, (params->type.text->color3.r * params->type.text->color3.a) / 255, (params->type.text->color3.g * params->type.text->color3.a) / 255, (params->type.text->color3.b * params->type.text->color3.a) / 255, params->type.text->color3.a);
605            break;
606 
607          case EDJE_TEXT_EFFECT_FAR_SHADOW:
608            style = EVAS_TEXT_STYLE_FAR_SHADOW;
609            evas_object_text_shadow_color_set(ep->object,
610                                              (params->type.text->color3.r * params->type.text->color3.a) / 255,
611                                              (params->type.text->color3.g * params->type.text->color3.a) / 255,
612                                              (params->type.text->color3.b * params->type.text->color3.a) / 255,
613                                              params->type.text->color3.a);
614            break;
615 
616          case EDJE_TEXT_EFFECT_FAR_SOFT_SHADOW:
617            style = EVAS_TEXT_STYLE_FAR_SOFT_SHADOW;
618            evas_object_text_shadow_color_set(ep->object,
619                                              (params->type.text->color3.r * params->type.text->color3.a) / 255,
620                                              (params->type.text->color3.g * params->type.text->color3.a) / 255,
621                                              (params->type.text->color3.b * params->type.text->color3.a) / 255,
622                                              params->type.text->color3.a);
623            break;
624 
625          case EDJE_TEXT_EFFECT_GLOW:
626            style = EVAS_TEXT_STYLE_GLOW;
627            evas_obj_text_glow_color_set(ep->object, (params->type.text->color2.r * params->type.text->color2.a) / 255, (params->type.text->color2.g * params->type.text->color2.a) / 255, (params->type.text->color2.b * params->type.text->color2.a) / 255, params->type.text->color2.a);
628            evas_obj_text_glow2_color_set(ep->object, (params->type.text->color3.r * params->type.text->color3.a) / 255, (params->type.text->color3.g * params->type.text->color3.a) / 255, (params->type.text->color3.b * params->type.text->color3.a) / 255, params->type.text->color3.a);
629            break;
630 
631          default:
632            style = EVAS_TEXT_STYLE_PLAIN;
633            break;
634         }
635 
636       switch (effect & EDJE_TEXT_EFFECT_MASK_SHADOW_DIRECTION)
637         {
638          case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM_RIGHT:
639            EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET
640                  (style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_RIGHT);
641            break;
642 
643          case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM:
644            EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET
645                  (style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM);
646            break;
647 
648          case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM_LEFT:
649            EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET
650                  (style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_LEFT);
651            break;
652 
653          case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_LEFT:
654            EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET
655                  (style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_LEFT);
656            break;
657 
658          case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP_LEFT:
659            EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET
660                  (style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_LEFT);
661            break;
662 
663          case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP:
664            EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET
665                  (style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP);
666            break;
667 
668          case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP_RIGHT:
669            EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET
670                  (style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_RIGHT);
671            break;
672 
673          case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_RIGHT:
674            EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET
675                  (style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_RIGHT);
676            break;
677 
678          default:
679            break;
680         }
681       evas_object_text_style_set(ep->object, style);
682    }
683 
684    if (free_text) free((char *)text);
685    if (font2) free(font2);
686    if (sfont) free(sfont);
687 }
688 
689 Evas_Font_Size
_edje_text_size_calc(Evas_Font_Size size,Edje_Text_Class * tc)690 _edje_text_size_calc(Evas_Font_Size size, Edje_Text_Class * tc)
691 {
692    int val;
693 
694    if (tc->size == 0)
695      {
696         val = size;
697      }
698    else if (tc->size > 0.0)
699      {
700         val = tc->size;
701      }
702    else
703      {
704         val = (size * -tc->size) / 100;
705      }
706    return val;
707 }
708