forked from enlightenment/efl
Evas font-engine: A couple of major fixes:
1. Worked around a fribid behavior that broke some stuff - we should handle it better in the future, this workaround is only temporary. 2. Fixed a bug with textblock's last_up_to_pos. 3. Fixed a bug with ot_shaping not reloading the font and activating the size in the wrong place. SVN revision: 56491
This commit is contained in:
parent
91456d3198
commit
48c9b3781e
|
@ -2230,21 +2230,22 @@ _layout_line_advance(Ctxt *c, Evas_Object_Textblock_Format *fmt,
|
|||
c->y += c->maxascent + c->maxdescent;
|
||||
if (c->w >= 0)
|
||||
{
|
||||
c->ln->x = c->par->x + c->marginl + c->o->style_pad.l +
|
||||
c->ln->x = c->marginl + c->o->style_pad.l +
|
||||
((c->w - c->ln->w -
|
||||
c->o->style_pad.l - c->o->style_pad.r -
|
||||
c->marginl - c->marginr) * _layout_line_align_get(c));
|
||||
if ((c->ln->x + c->ln->w + c->marginr - c->o->style_pad.l) > c->wmax)
|
||||
c->wmax = c->ln->x + c->ln->w + c->marginl + c->marginr - c->o->style_pad.l;
|
||||
if ((c->par->x + c->ln->x + c->ln->w + c->marginr - c->o->style_pad.l) > c->wmax)
|
||||
c->wmax = c->par->x + c->ln->x + c->ln->w + c->marginl + c->marginr - c->o->style_pad.l;
|
||||
}
|
||||
else
|
||||
{
|
||||
c->ln->x = c->par->x + c->marginl + c->o->style_pad.l;
|
||||
if ((c->ln->x + c->ln->w + c->marginr - c->o->style_pad.l) > c->wmax)
|
||||
c->wmax = c->ln->x + c->ln->w + c->marginl + c->marginr - c->o->style_pad.l;
|
||||
c->ln->x = c->marginl + c->o->style_pad.l;
|
||||
if ((c->par->x + c->ln->x + c->ln->w + c->marginr - c->o->style_pad.l) > c->wmax)
|
||||
c->wmax = c->par->x + c->ln->x + c->ln->w + c->marginl + c->marginr - c->o->style_pad.l;
|
||||
}
|
||||
c->par->h += c->ln->h;
|
||||
c->par->w = c->w;
|
||||
c->par->h = c->ln->y + c->ln->h;
|
||||
if (c->ln->w > c->par->w)
|
||||
c->par->w = c->ln->w;
|
||||
if (add_line)
|
||||
_layout_line_new(c, fmt);
|
||||
}
|
||||
|
@ -2281,18 +2282,19 @@ _layout_text_item_new(Ctxt *c __UNUSED__, Evas_Object_Textblock_Format *fmt, con
|
|||
* or because of an error), cutoff index on success.
|
||||
*/
|
||||
static int
|
||||
_layout_text_cutoff_get(Ctxt *c, Evas_Object_Textblock_Format *fmt, Evas_Object_Textblock_Text_Item *ti)
|
||||
_layout_text_cutoff_get(Ctxt *c, Evas_Object_Textblock_Format *fmt,
|
||||
const Evas_Object_Textblock_Text_Item *ti)
|
||||
{
|
||||
if (fmt->font.font)
|
||||
{
|
||||
Evas_Coord x;
|
||||
x = c->w - c->o->style_pad.l - c->o->style_pad.r - c->marginl -
|
||||
c->marginr - c->x;
|
||||
if (x < 0)
|
||||
x = 0;
|
||||
return c->ENFN->font_last_up_to_pos(c->ENDT, fmt->font.font, ti->text,
|
||||
&ti->parent.text_props,
|
||||
c->w -
|
||||
c->o->style_pad.l -
|
||||
c->o->style_pad.r -
|
||||
c->marginl -
|
||||
c->marginr -
|
||||
c->x,
|
||||
0);
|
||||
&ti->parent.text_props, x, 0);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
|
@ -154,13 +154,6 @@ evas_common_font_ot_populate_text_props(void *_fn, const Eina_Unicode *text,
|
|||
props->ot_data->refcount = 1;
|
||||
|
||||
fi = fn->fonts->data;
|
||||
if (fi->src->current_size != fi->size)
|
||||
{
|
||||
FTLOCK();
|
||||
FT_Activate_Size(fi->ft.size);
|
||||
FTUNLOCK();
|
||||
fi->src->current_size = fi->size;
|
||||
}
|
||||
/* Load the font needed for this script */
|
||||
{
|
||||
/* Skip common chars */
|
||||
|
@ -173,6 +166,14 @@ evas_common_font_ot_populate_text_props(void *_fn, const Eina_Unicode *text,
|
|||
if (!*tmp && (tmp > text)) tmp--;
|
||||
evas_common_font_glyph_search(fn, &fi, *tmp);
|
||||
}
|
||||
evas_common_font_int_reload(fi);
|
||||
if (fi->src->current_size != fi->size)
|
||||
{
|
||||
FTLOCK();
|
||||
FT_Activate_Size(fi->ft.size);
|
||||
FTUNLOCK();
|
||||
fi->src->current_size = fi->size;
|
||||
}
|
||||
|
||||
if (len < 0)
|
||||
{
|
||||
|
@ -211,6 +212,7 @@ evas_common_font_ot_populate_text_props(void *_fn, const Eina_Unicode *text,
|
|||
}
|
||||
|
||||
hb_buffer_destroy(buffer);
|
||||
evas_common_font_int_use_trim();
|
||||
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
|
|
@ -305,14 +305,22 @@ evas_bidi_props_reorder_line(Eina_Unicode *eina_ustr, size_t start, size_t len,
|
|||
|
||||
/* Shaping must be done *BEFORE* breaking to lines so there's no choice but
|
||||
doing it in textblock. */
|
||||
{
|
||||
/* FIXME: Hack around fribidi altering embedding_levels */
|
||||
EvasBiDiLevel *emb_lvl;
|
||||
emb_lvl = malloc(len * sizeof(EvasBiDiLevel));
|
||||
memcpy(emb_lvl, props->embedding_levels, len * sizeof(EvasBiDiLevel));
|
||||
if (!fribidi_reorder_line (FRIBIDI_FLAGS_DEFAULT,
|
||||
props->char_types + start,
|
||||
len, 0, props->direction,
|
||||
props->embedding_levels + start,
|
||||
emb_lvl,
|
||||
ustr, v_to_l))
|
||||
{
|
||||
free(emb_lvl);
|
||||
goto error;
|
||||
}
|
||||
free(emb_lvl);
|
||||
}
|
||||
|
||||
|
||||
/* The size of fribidichar is different than eina_unicode, convert */
|
||||
|
|
Loading…
Reference in New Issue