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:
Tom Hacohen 2011-01-30 10:40:21 +00:00
parent 91456d3198
commit 48c9b3781e
3 changed files with 43 additions and 31 deletions

View File

@ -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)
return c->ENFN->font_last_up_to_pos(c->ENDT, fmt->font.font, ti->text, {
&ti->parent.text_props, Evas_Coord x;
c->w - x = c->w - c->o->style_pad.l - c->o->style_pad.r - c->marginl -
c->o->style_pad.l - c->marginr - c->x;
c->o->style_pad.r - if (x < 0)
c->marginl - x = 0;
c->marginr - return c->ENFN->font_last_up_to_pos(c->ENDT, fmt->font.font, ti->text,
c->x, &ti->parent.text_props, x, 0);
0); }
return -1; return -1;
} }

View File

@ -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;
} }

View File

@ -305,13 +305,21 @@ 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. */
if (!fribidi_reorder_line (FRIBIDI_FLAGS_DEFAULT,
props->char_types + start,
len, 0, props->direction,
props->embedding_levels + start,
ustr, v_to_l))
{ {
goto error; /* 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,
emb_lvl,
ustr, v_to_l))
{
free(emb_lvl);
goto error;
}
free(emb_lvl);
} }