END_TEST /* Various evas stuff, such as scale */ START_TEST(evas_text_evas) { Evas_Coord w, h, bw, bh; START_TEXT_TEST(); const char *buf = "Test - בדיקה"; const char *font = TEST_FONT_NAME; Evas_Font_Size size = 14; evas_object_text_font_set(to, font, size); evas_object_text_text_set(to, buf); evas_object_geometry_get(to, NULL, NULL, &bw, &bh); evas_object_scale_set(to, 3.0); evas_object_geometry_get(to, NULL, NULL, &w, &h); fail_if((w <= bw) || (h <= bh)); evas_object_scale_set(to, 0.5); evas_object_geometry_get(to, NULL, NULL, &w, &h); fail_if((w >= bw) || (h >= bh)); END_TEXT_TEST(); }
/** * A utility function to get the average size of a character written inside * the editable object * * @param editable an editable object * @param w the location where to store the average width of a character * @param h the location where to store the average height of a character */ EAPI void e_editable_char_size_get(Evas_Object *editable, int *w, int *h) { int tw = 0, th = 0; Evas *evas; const Evas_Object *text_obj; Evas_Object *obj; E_Editable_Smart_Data *sd; char *text = "Tout est bon dans l'abricot sauf le noyau!" "Wakey wakey! Eggs and Bakey!"; const char *font, *font_source; Evas_Text_Style_Type style; int font_size; if (w) *w = 0; if (h) *h = 0; if (evas_object_smart_smart_get(editable) != _e_editable_smart) SMARTERRNR(); if ((!editable) || (!(evas = evas_object_evas_get(editable)))) return; if (!(sd = evas_object_smart_data_get(editable))) return; if (!(text_obj = edje_object_part_object_get(sd->text_object, "e.text.text"))) return; if ((sd->average_char_w <= 0) || (sd->average_char_h <= 0)) { font_source = evas_object_text_font_source_get(text_obj); evas_object_text_font_get(text_obj, &font, &font_size); style = evas_object_text_style_get(text_obj); obj = evas_object_text_add(evas); evas_object_scale_set(obj, edje_scale_get()); evas_object_text_font_source_set(obj, font_source); evas_object_text_font_set(obj, font, font_size); evas_object_text_style_set(obj, style); evas_object_text_text_set(obj, text); evas_object_geometry_get(obj, NULL, NULL, &tw, &th); evas_object_del(obj); sd->average_char_w = (tw / strlen(text)); sd->average_char_h = th; } if (w) *w = sd->average_char_w; if (h) *h = sd->average_char_h; }
static const char * _edje_text_fit_x(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *params, const char *text, const char *font, int size, Evas_Coord sw, int *free_text) { Evas_Coord tw = 0, th = 0, p; int l, r; int i; char *buf; int uc1 = -1, uc2 = -1, c1 = -1, c2 = -1; int loop = 0, extra; size_t orig_len; FLOAT_T sc; sc = ed->scale; if (sc == ZERO) sc = _edje_scale; *free_text = 0; if (sw <= 1) return ""; if (ep->part->scale) evas_object_scale_set(ep->object, TO_DOUBLE(sc)); evas_object_text_font_set(ep->object, font, size); evas_object_text_text_set(ep->object, text); part_get_geometry(ep, &tw, &th); evas_object_text_style_pad_get(ep->object, &l, &r, NULL, NULL); p = ((sw - tw) * params->type.text.elipsis); /* chop chop */ if (tw > sw) { if (params->type.text.elipsis != 0.0) /* should be the last in text! not the rightmost */ uc1 = evas_object_text_last_up_to_pos(ep->object, -p + l, th / 2); if (params->type.text.elipsis != 1.0) { /* should be the last in text! not the rightmost */ if ((-p + sw -r) < 0) uc2 = evas_object_text_last_up_to_pos(ep->object, 0, th / 2); else uc2 = evas_object_text_last_up_to_pos(ep->object, -p + sw - r, th / 2); } if ((uc1 < 0) && (uc2 < 0)) { uc1 = 0; uc2 = 0; } } if (!(((uc1 >= 0) || (uc2 >= 0)) && (tw > sw))) return text; if ((uc1 == 0) && (uc2 == 0)) return text; orig_len = strlen(text); /* don't overflow orig_len by adding extra * FIXME: we might want to set a max string length somewhere... */ extra = 1 + 3 + 3; /* terminator, leading and trailing ellipsis */ orig_len = MIN(orig_len, ((size_t) 8192 - extra)); if (!(buf = malloc(orig_len + extra))) return text; /* Convert uc1, uc2 -> c1, c2 */ i = 0; if (uc1 >= 0) { c1 = 0; for ( ; i < uc1 ; i++) { c1 = evas_string_char_next_get(text, c1, NULL); } } if (uc2 >= 0) { if (c1 >= 0) { c2 = c1; } else { c2 = 0; } for ( ; i < uc2 ; i++) { c2 = evas_string_char_next_get(text, c2, NULL); } } buf[0] = '\0'; while (((c1 >= 0) || (c2 >= 0)) && (tw > sw)) { loop++; if (sw <= 0.0) { buf[0] = 0; break; } if ((c1 >= 0) && (c2 >= 0)) { if ((loop & 0x1)) { if (c1 >= 0) c1 = evas_string_char_next_get(text, c1, NULL); } else { if (c2 >= 0) { c2 = evas_string_char_prev_get(text, c2, NULL); if (c2 < 0) { buf[0] = 0; break; } } } } else { if (c1 >= 0) c1 = evas_string_char_next_get(text, c1, NULL); else if (c2 >= 0) { c2 = evas_string_char_prev_get(text, c2, NULL); if (c2 < 0) { buf[0] = 0; break; } } } if ((c1 >= 0) && (c2 >= 0)) { if (c1 >= c2) { buf[0] = 0; break; } } else if ((c1 > 0 && (size_t) c1 >= orig_len) || c2 == 0) { buf[0] = 0; break; } buf[0] = 0; _edje_text_fit_set(buf, text, c1, c2); evas_object_text_text_set(ep->object, buf); part_get_geometry(ep, &tw, &th); } *free_text = 1; return buf; }