forked from enlightenment/efl
Evas textblock: Added bidi properties to the shared info between format and text items because both are bidi-relevant.
SVN revision: 56422
This commit is contained in:
parent
3c6c735b83
commit
82a7ee8ee0
|
@ -318,6 +318,7 @@ struct _Evas_Object_Textblock_Item
|
||||||
size_t visual_pos;
|
size_t visual_pos;
|
||||||
#endif
|
#endif
|
||||||
Evas_Coord x, w, h;
|
Evas_Coord x, w, h;
|
||||||
|
Evas_BiDi_Props bidi_props;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _Evas_Object_Textblock_Text_Item
|
struct _Evas_Object_Textblock_Text_Item
|
||||||
|
@ -326,7 +327,6 @@ struct _Evas_Object_Textblock_Text_Item
|
||||||
Eina_Unicode *text;
|
Eina_Unicode *text;
|
||||||
Evas_Object_Textblock_Format *format;
|
Evas_Object_Textblock_Format *format;
|
||||||
int inset, baseline;
|
int inset, baseline;
|
||||||
Evas_BiDi_Props bidi_props;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _Evas_Object_Textblock_Format_Item
|
struct _Evas_Object_Textblock_Format_Item
|
||||||
|
@ -2087,7 +2087,7 @@ _layout_line_reorder(Ctxt *c, Evas_Object_Textblock_Line *line)
|
||||||
{
|
{
|
||||||
adv = c->ENFN->font_h_advance_get(c->ENDT,
|
adv = c->ENFN->font_h_advance_get(c->ENDT,
|
||||||
ti->format->font.font, ti->text,
|
ti->format->font.font, ti->text,
|
||||||
&ti->bidi_props);
|
&ti->parent.bidi_props);
|
||||||
}
|
}
|
||||||
|
|
||||||
x += adv;
|
x += adv;
|
||||||
|
@ -2266,7 +2266,7 @@ _layout_text_cutoff_get(Ctxt *c, Evas_Object_Textblock_Format *fmt, Evas_Object_
|
||||||
{
|
{
|
||||||
if (fmt->font.font)
|
if (fmt->font.font)
|
||||||
return c->ENFN->font_last_up_to_pos(c->ENDT, fmt->font.font, ti->text,
|
return c->ENFN->font_last_up_to_pos(c->ENDT, fmt->font.font, ti->text,
|
||||||
&ti->bidi_props,
|
&ti->parent.bidi_props,
|
||||||
c->w -
|
c->w -
|
||||||
c->o->style_pad.l -
|
c->o->style_pad.l -
|
||||||
c->o->style_pad.r -
|
c->o->style_pad.r -
|
||||||
|
@ -2368,11 +2368,11 @@ _layout_strip_trailing_whitespace(Ctxt *c, Evas_Object_Textblock_Format *fmt __U
|
||||||
adv = 0;
|
adv = 0;
|
||||||
if (ti->format->font.font)
|
if (ti->format->font.font)
|
||||||
adv = c->ENFN->font_h_advance_get(c->ENDT, ti->format->font.font,
|
adv = c->ENFN->font_h_advance_get(c->ENDT, ti->format->font.font,
|
||||||
ti->text, &ti->bidi_props);
|
ti->text, &ti->parent.bidi_props);
|
||||||
tw = th = 0;
|
tw = th = 0;
|
||||||
if (ti->format->font.font)
|
if (ti->format->font.font)
|
||||||
c->ENFN->font_string_size_get(c->ENDT, ti->format->font.font,
|
c->ENFN->font_string_size_get(c->ENDT, ti->format->font.font,
|
||||||
ti->text, &ti->bidi_props, &tw, &th);
|
ti->text, &ti->parent.bidi_props, &tw, &th);
|
||||||
it->w = tw;
|
it->w = tw;
|
||||||
it->h = th;
|
it->h = th;
|
||||||
c->x = it->x + adv;
|
c->x = it->x + adv;
|
||||||
|
@ -2492,7 +2492,7 @@ _layout_text_add_and_split_item(Ctxt *c, Evas_Object_Textblock_Format *fmt,
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
Evas_Object_Textblock_Text_Item *new_ti;
|
Evas_Object_Textblock_Text_Item *new_ti;
|
||||||
cutoff = evas_bidi_end_of_run_get(&ti->bidi_props, len);
|
cutoff = evas_bidi_end_of_run_get(&ti->parent.bidi_props, len);
|
||||||
if (cutoff > 0)
|
if (cutoff > 0)
|
||||||
{
|
{
|
||||||
new_ti = _layout_text_item_new(c, fmt, ti->text + cutoff);
|
new_ti = _layout_text_item_new(c, fmt, ti->text + cutoff);
|
||||||
|
@ -2503,7 +2503,7 @@ _layout_text_add_and_split_item(Ctxt *c, Evas_Object_Textblock_Format *fmt,
|
||||||
tw = th = 0;
|
tw = th = 0;
|
||||||
if (fmt->font.font)
|
if (fmt->font.font)
|
||||||
c->ENFN->font_string_size_get(c->ENDT, fmt->font.font, ti->text,
|
c->ENFN->font_string_size_get(c->ENDT, fmt->font.font, ti->text,
|
||||||
&ti->bidi_props, &tw, &th);
|
&ti->parent.bidi_props, &tw, &th);
|
||||||
ti->parent.w = tw;
|
ti->parent.w = tw;
|
||||||
ti->parent.h = th;
|
ti->parent.h = th;
|
||||||
inset = 0;
|
inset = 0;
|
||||||
|
@ -2515,7 +2515,7 @@ _layout_text_add_and_split_item(Ctxt *c, Evas_Object_Textblock_Format *fmt,
|
||||||
adv = 0;
|
adv = 0;
|
||||||
if (fmt->font.font)
|
if (fmt->font.font)
|
||||||
adv = c->ENFN->font_h_advance_get(c->ENDT, fmt->font.font,
|
adv = c->ENFN->font_h_advance_get(c->ENDT, fmt->font.font,
|
||||||
ti->text, &ti->bidi_props);
|
ti->text, &ti->parent.bidi_props);
|
||||||
c->x += adv;
|
c->x += adv;
|
||||||
c->ln->items = (Evas_Object_Textblock_Item *)
|
c->ln->items = (Evas_Object_Textblock_Item *)
|
||||||
eina_inlist_append(EINA_INLIST_GET(c->ln->items),
|
eina_inlist_append(EINA_INLIST_GET(c->ln->items),
|
||||||
|
@ -2526,8 +2526,8 @@ _layout_text_add_and_split_item(Ctxt *c, Evas_Object_Textblock_Format *fmt,
|
||||||
{
|
{
|
||||||
new_ti->parent.text_node = ti->parent.text_node;
|
new_ti->parent.text_node = ti->parent.text_node;
|
||||||
new_ti->parent.text_pos = ti->parent.text_pos + cutoff;
|
new_ti->parent.text_pos = ti->parent.text_pos + cutoff;
|
||||||
new_ti->bidi_props.start = new_ti->parent.text_pos;
|
new_ti->parent.bidi_props.start = new_ti->parent.text_pos;
|
||||||
new_ti->bidi_props.props = new_ti->parent.text_node->bidi_props;
|
new_ti->parent.bidi_props.props = new_ti->parent.text_node->bidi_props;
|
||||||
ti = new_ti;
|
ti = new_ti;
|
||||||
len -= cutoff;
|
len -= cutoff;
|
||||||
}
|
}
|
||||||
|
@ -2642,13 +2642,13 @@ skip:
|
||||||
ti->parent.text_pos = start + str - tbase;
|
ti->parent.text_pos = start + str - tbase;
|
||||||
if (ti->parent.text_node)
|
if (ti->parent.text_node)
|
||||||
{
|
{
|
||||||
ti->bidi_props.start = ti->parent.text_pos;
|
ti->parent.bidi_props.start = ti->parent.text_pos;
|
||||||
ti->bidi_props.props = ti->parent.text_node->bidi_props;
|
ti->parent.bidi_props.props = ti->parent.text_node->bidi_props;
|
||||||
}
|
}
|
||||||
tw = th = 0;
|
tw = th = 0;
|
||||||
if (fmt->font.font)
|
if (fmt->font.font)
|
||||||
c->ENFN->font_string_size_get(c->ENDT, fmt->font.font, ti->text,
|
c->ENFN->font_string_size_get(c->ENDT, fmt->font.font, ti->text,
|
||||||
&ti->bidi_props, &tw, &th);
|
&ti->parent.bidi_props, &tw, &th);
|
||||||
/* Check if we need to wrap, i.e the text is bigger than the width
|
/* Check if we need to wrap, i.e the text is bigger than the width
|
||||||
* Only calculate wrapping if the width of the object is > 0 */
|
* Only calculate wrapping if the width of the object is > 0 */
|
||||||
if ((c->w >= 0) &&
|
if ((c->w >= 0) &&
|
||||||
|
@ -2860,6 +2860,8 @@ _layout_format_item_add(Ctxt *c, Evas_Object_Textblock_Node_Format *n, const cha
|
||||||
fi->parent.text_node = n->text_node;
|
fi->parent.text_node = n->text_node;
|
||||||
/* FIXME: make it more efficient */
|
/* FIXME: make it more efficient */
|
||||||
fi->parent.text_pos = _evas_textblock_node_format_pos_get(n);
|
fi->parent.text_pos = _evas_textblock_node_format_pos_get(n);
|
||||||
|
fi->parent.bidi_props.props = n->text_node->bidi_props;
|
||||||
|
fi->parent.bidi_props.start = fi->parent.text_pos;
|
||||||
}
|
}
|
||||||
return fi;
|
return fi;
|
||||||
}
|
}
|
||||||
|
@ -6858,7 +6860,7 @@ evas_textblock_cursor_char_geometry_get(const Evas_Textblock_Cursor *cur, Evas_C
|
||||||
{
|
{
|
||||||
ret = cur->ENFN->font_char_coords_get(cur->ENDT,
|
ret = cur->ENFN->font_char_coords_get(cur->ENDT,
|
||||||
ti->format->font.font,
|
ti->format->font.font,
|
||||||
ti->text, &ti->bidi_props,
|
ti->text, &ti->parent.bidi_props,
|
||||||
pos,
|
pos,
|
||||||
&x, &y, &w, &h);
|
&x, &y, &w, &h);
|
||||||
}
|
}
|
||||||
|
@ -7006,7 +7008,7 @@ evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, E
|
||||||
pos = cur->ENFN->font_char_at_coords_get(
|
pos = cur->ENFN->font_char_at_coords_get(
|
||||||
cur->ENDT,
|
cur->ENDT,
|
||||||
ti->format->font.font,
|
ti->format->font.font,
|
||||||
ti->text, &ti->bidi_props,
|
ti->text, &ti->parent.bidi_props,
|
||||||
x - it->x - ln->x, 0,
|
x - it->x - ln->x, 0,
|
||||||
&cx, &cy, &cw, &ch);
|
&cx, &cy, &cw, &ch);
|
||||||
if (pos < 0)
|
if (pos < 0)
|
||||||
|
@ -7096,7 +7098,7 @@ _evas_textblock_range_calc_x_w(const Evas_Object_Textblock_Text_Item *ti,
|
||||||
if ((start && !switch_items) || (!start && switch_items))
|
if ((start && !switch_items) || (!start && switch_items))
|
||||||
{
|
{
|
||||||
#ifdef BIDI_SUPPORT
|
#ifdef BIDI_SUPPORT
|
||||||
if (evas_bidi_is_rtl_char(&ti->bidi_props, 0))
|
if (evas_bidi_is_rtl_char(&ti->parent.bidi_props, 0))
|
||||||
{
|
{
|
||||||
*w = *x + *w;
|
*w = *x + *w;
|
||||||
*x = 0;
|
*x = 0;
|
||||||
|
@ -7110,7 +7112,7 @@ _evas_textblock_range_calc_x_w(const Evas_Object_Textblock_Text_Item *ti,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifdef BIDI_SUPPORT
|
#ifdef BIDI_SUPPORT
|
||||||
if (evas_bidi_is_rtl_char(&ti->bidi_props, 0))
|
if (evas_bidi_is_rtl_char(&ti->parent.bidi_props, 0))
|
||||||
{
|
{
|
||||||
*x = *x + *w;
|
*x = *x + *w;
|
||||||
*w = it->w - *x;
|
*w = it->w - *x;
|
||||||
|
@ -7205,7 +7207,7 @@ _evas_textblock_cursor_range_in_line_geometry_get(
|
||||||
ti = _ITEM_TEXT(it1);
|
ti = _ITEM_TEXT(it1);
|
||||||
ret = cur->ENFN->font_char_coords_get(cur->ENDT,
|
ret = cur->ENFN->font_char_coords_get(cur->ENDT,
|
||||||
ti->format->font.font,
|
ti->format->font.font,
|
||||||
ti->text, &ti->bidi_props,
|
ti->text, &ti->parent.bidi_props,
|
||||||
start,
|
start,
|
||||||
&x1, &y, &w1, &h);
|
&x1, &y, &w1, &h);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
|
@ -7214,7 +7216,7 @@ _evas_textblock_cursor_range_in_line_geometry_get(
|
||||||
}
|
}
|
||||||
ret = cur->ENFN->font_char_coords_get(cur->ENDT,
|
ret = cur->ENFN->font_char_coords_get(cur->ENDT,
|
||||||
ti->format->font.font,
|
ti->format->font.font,
|
||||||
ti->text, &ti->bidi_props,
|
ti->text, &ti->parent.bidi_props,
|
||||||
end,
|
end,
|
||||||
&x2, &y, &w2, &h);
|
&x2, &y, &w2, &h);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
|
@ -7236,7 +7238,7 @@ _evas_textblock_cursor_range_in_line_geometry_get(
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BIDI_SUPPORT
|
#ifdef BIDI_SUPPORT
|
||||||
if (evas_bidi_is_rtl_char(&ti->bidi_props, 0))
|
if (evas_bidi_is_rtl_char(&ti->parent.bidi_props, 0))
|
||||||
{
|
{
|
||||||
x = x1 + w1;
|
x = x1 + w1;
|
||||||
w = x2 + w2 - x;
|
w = x2 + w2 - x;
|
||||||
|
@ -7274,7 +7276,7 @@ _evas_textblock_cursor_range_in_line_geometry_get(
|
||||||
|
|
||||||
ret = cur->ENFN->font_char_coords_get(cur->ENDT,
|
ret = cur->ENFN->font_char_coords_get(cur->ENDT,
|
||||||
ti->format->font.font,
|
ti->format->font.font,
|
||||||
ti->text, &ti->bidi_props,
|
ti->text, &ti->parent.bidi_props,
|
||||||
start,
|
start,
|
||||||
&x, &y, &w, &h);
|
&x, &y, &w, &h);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
|
@ -7326,7 +7328,7 @@ _evas_textblock_cursor_range_in_line_geometry_get(
|
||||||
|
|
||||||
ret = cur->ENFN->font_char_coords_get(cur->ENDT,
|
ret = cur->ENFN->font_char_coords_get(cur->ENDT,
|
||||||
ti->format->font.font,
|
ti->format->font.font,
|
||||||
ti->text, &ti->bidi_props,
|
ti->text, &ti->parent.bidi_props,
|
||||||
end,
|
end,
|
||||||
&x, &y, &w, &h);
|
&x, &y, &w, &h);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
|
@ -7791,7 +7793,7 @@ evas_object_textblock_render(Evas_Object *obj, void *output, void *context, void
|
||||||
if (ti->format->font.font) ENFN->font_draw(output, context, surface, ti->format->font.font, \
|
if (ti->format->font.font) ENFN->font_draw(output, context, surface, ti->format->font.font, \
|
||||||
obj->cur.geometry.x + ln->x + ti->parent.x - ti->inset + x + (ox), \
|
obj->cur.geometry.x + ln->x + ti->parent.x - ti->inset + x + (ox), \
|
||||||
obj->cur.geometry.y + ln->y + yoff + y + (oy), \
|
obj->cur.geometry.y + ln->y + yoff + y + (oy), \
|
||||||
ti->parent.w, ti->parent.h, ti->parent.w, ti->parent.h, ti->text, &ti->bidi_props);
|
ti->parent.w, ti->parent.h, ti->parent.w, ti->parent.h, ti->text, &ti->parent.bidi_props);
|
||||||
#define ITEM_WALK_LINE_SKIP_DROP() \
|
#define ITEM_WALK_LINE_SKIP_DROP() \
|
||||||
if ((ln->y + ln->h) <= 0) continue; \
|
if ((ln->y + ln->h) <= 0) continue; \
|
||||||
if (ln->y > obj->cur.geometry.h) break
|
if (ln->y > obj->cur.geometry.h) break
|
||||||
|
|
Loading…
Reference in New Issue