More fixes to cursorX

In Row::Element::pos2x, handle the boundaries in a cleaner way.
This commit is contained in:
Jean-Marc Lasgouttes 2013-10-18 17:55:30 +02:00
parent 8649ac7fe6
commit 79014c7551
2 changed files with 18 additions and 11 deletions

View File

@ -36,17 +36,23 @@ using frontend::FontMetrics;
double Row::Element::pos2x(pos_type const i) const double Row::Element::pos2x(pos_type const i) const
{ {
LASSERT(i >= pos && i <= endpos, return 0);
bool const rtl = font.isVisibleRightToLeft(); bool const rtl = font.isVisibleRightToLeft();
// handle first the two bounds of the element int w = 0;
if ((!rtl && pos >= i) || (rtl && endpos <= i)) //handle first the two bounds of the element
return 0; if (i == pos)
if ((!rtl && endpos <= i) || (rtl && pos >= i)) w = 0;
return width(); else if (i == endpos)
w = width();
else {
LASSERT(type == STRING, return 0);
FontMetrics const & fm = theFontMetrics(font); FontMetrics const & fm = theFontMetrics(font);
// FIXME Avoid caching of metrics there? // FIXME Avoid caching of metrics there?
int const w = fm.width(str.substr(0, i - pos)); w = fm.width(str.substr(0, i - pos));
}
if (rtl) if (rtl)
return width() - w; return width() - w;
else else

View File

@ -1613,15 +1613,16 @@ int TextMetrics::cursorX(CursorSlice const & sl,
double x = row.x; double x = row.x;
/** /**
* When boundary is true, position is on the row element (pos, endpos) * When boundary is true, position i is in the row element (pos, endpos)
* if * if
* pos < pos <= endpos * pos < i <= endpos
* whereas, when boundary is false, the test is * whereas, when boundary is false, the test is
* pos <= pos < endpos * pos <= i < endpos
* The correction below allows to handle both cases. * The correction below allows to handle both cases.
*/ */
int const boundary_corr = (boundary && pos) ? -1 : 0; int const boundary_corr = (boundary && pos) ? -1 : 0;
//?????
if (row.empty() if (row.empty()
|| (row.begin()->font.isVisibleRightToLeft() || (row.begin()->font.isVisibleRightToLeft()
&& pos == row.begin()->endpos)) && pos == row.begin()->endpos))