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