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;
|
c->y += c->maxascent + c->maxdescent;
|
||||||
if (c->w >= 0)
|
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->w - c->ln->w -
|
||||||
c->o->style_pad.l - c->o->style_pad.r -
|
c->o->style_pad.l - c->o->style_pad.r -
|
||||||
c->marginl - c->marginr) * _layout_line_align_get(c));
|
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)
|
if ((c->par->x + 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->wmax = c->par->x + c->ln->x + c->ln->w + c->marginl + c->marginr - c->o->style_pad.l;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
c->ln->x = c->par->x + c->marginl + c->o->style_pad.l;
|
c->ln->x = c->marginl + c->o->style_pad.l;
|
||||||
if ((c->ln->x + c->ln->w + c->marginr - c->o->style_pad.l) > c->wmax)
|
if ((c->par->x + 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->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->h = c->ln->y + c->ln->h;
|
||||||
c->par->w = c->w;
|
if (c->ln->w > c->par->w)
|
||||||
|
c->par->w = c->ln->w;
|
||||||
if (add_line)
|
if (add_line)
|
||||||
_layout_line_new(c, fmt);
|
_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.
|
* or because of an error), cutoff index on success.
|
||||||
*/
|
*/
|
||||||
static int
|
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)
|
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,
|
return c->ENFN->font_last_up_to_pos(c->ENDT, fmt->font.font, ti->text,
|
||||||
&ti->parent.text_props,
|
&ti->parent.text_props, x, 0);
|
||||||
c->w -
|
}
|
||||||
c->o->style_pad.l -
|
|
||||||
c->o->style_pad.r -
|
|
||||||
c->marginl -
|
|
||||||
c->marginr -
|
|
||||||
c->x,
|
|
||||||
0);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -154,13 +154,6 @@ evas_common_font_ot_populate_text_props(void *_fn, const Eina_Unicode *text,
|
||||||
props->ot_data->refcount = 1;
|
props->ot_data->refcount = 1;
|
||||||
|
|
||||||
fi = fn->fonts->data;
|
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 */
|
/* Load the font needed for this script */
|
||||||
{
|
{
|
||||||
/* Skip common chars */
|
/* 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--;
|
if (!*tmp && (tmp > text)) tmp--;
|
||||||
evas_common_font_glyph_search(fn, &fi, *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)
|
if (len < 0)
|
||||||
{
|
{
|
||||||
|
@ -211,6 +212,7 @@ evas_common_font_ot_populate_text_props(void *_fn, const Eina_Unicode *text,
|
||||||
}
|
}
|
||||||
|
|
||||||
hb_buffer_destroy(buffer);
|
hb_buffer_destroy(buffer);
|
||||||
|
evas_common_font_int_use_trim();
|
||||||
|
|
||||||
return EINA_FALSE;
|
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
|
/* Shaping must be done *BEFORE* breaking to lines so there's no choice but
|
||||||
doing it in textblock. */
|
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,
|
if (!fribidi_reorder_line (FRIBIDI_FLAGS_DEFAULT,
|
||||||
props->char_types + start,
|
props->char_types + start,
|
||||||
len, 0, props->direction,
|
len, 0, props->direction,
|
||||||
props->embedding_levels + start,
|
emb_lvl,
|
||||||
ustr, v_to_l))
|
ustr, v_to_l))
|
||||||
{
|
{
|
||||||
|
free(emb_lvl);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
free(emb_lvl);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* The size of fribidichar is different than eina_unicode, convert */
|
/* The size of fribidichar is different than eina_unicode, convert */
|
||||||
|
|
Loading…
Reference in New Issue