- /**
- * When boundary is true, position i is in the row element (pos, endpos)
- * if
- * pos < i <= endpos
- * whereas, when boundary is false, the test is
- * pos <= i < endpos
- * The correction below allows to handle both cases.
- */
- int const boundary_corr = (boundary && pos) ? -1 : 0;
-
- /** Early return in trivial cases
- * 1) the row is empty
- * 2) the position is the left-most position of the row; there
- * is a quirck herehowever: if the first element is virtual
- * (end-of-par marker for example), then we have to look
- * closer
- */
- if (row.empty()
- || (pos == row.begin()->left_pos()
- && pos != row.begin()->right_pos()))
- return row.left_margin;
-
- Row::const_iterator cit = row.begin();
- double x = row.left_margin;
- for ( ; cit != row.end() ; ++cit) {
- /** Look whether the cursor is inside the element's
- * span. Note that it is necessary to take the
- * boundary in account, and to accept virtual
- * elements, which have pos == endpos.
- */
- if (pos + boundary_corr >= cit->pos
- && (pos + boundary_corr < cit->endpos
- || cit->pos == cit->endpos)) {
- x += cit->pos2x(pos);
- break;
- }
- x += cit->full_width();
- }
-