On Fri, Mar 31, 2017 at 05:03:44PM +0200, Jean-Marc Lasgouttes wrote:
> commit da590925cd6749587b9f500ecdaa457e34bc0f4a
> Author: Jean-Marc Lasgouttes <lasgout...@lyx.org>
> Date:   Fri Mar 31 16:56:06 2017 +0200
> 
>     Work around bug in QTextLine::xToCursor
>     
>     With RtL text, the method can be non-monotonic wrt x value (which is a
>     Qt bug). To work around this, we check whether positions adjacent to
>     those returned by xToCursor look better. Depending on whether the new
>     x position is too small or too large, we look backward or forward for
>     a better solution.
>     
>     The performance is probably not great, but this is only needed for
>     user interactions, so the performance penalty should not be a problem.
>     
>     Fixes #10569.
> ---
>  src/frontends/qt4/GuiFontMetrics.cpp |   29 +++++++++++++++++++++++++++--
>  1 files changed, 27 insertions(+), 2 deletions(-)
> 
> diff --git a/src/frontends/qt4/GuiFontMetrics.cpp 
> b/src/frontends/qt4/GuiFontMetrics.cpp
> index 33df3cf..585933a 100644
> --- a/src/frontends/qt4/GuiFontMetrics.cpp
> +++ b/src/frontends/qt4/GuiFontMetrics.cpp
> @@ -272,9 +272,34 @@ int GuiFontMetrics::x2pos(docstring const & s, int & x, 
> bool const rtl,
>                            double const wordspacing) const
>  {
>       shared_ptr<QTextLayout const> tl = getTextLayout(s, rtl, wordspacing);
> -     int const qpos = tl->lineForTextPosition(0).xToCursor(x);
> +     QTextLine const & tline = tl->lineForTextPosition(0);
> +     int qpos = tline.xToCursor(x);
> +     int newx = static_cast<int>(tline.cursorToX(qpos));
> +     // The value of qpos may be wrong in rtl text (see ticket #10569).
> +     // To work around this, let's have a look at adjacent positions to
> +     // see whether we find closer matches.
> +     if (rtl && newx < x) {
> +             while (qpos > 0) {
> +                     int const xm = static_cast<int>(tline.cursorToX(qpos - 
> 1));
> +                     if (abs(xm - x) < abs(newx - x)) {
> +                             --qpos;
> +                             newx = xm;
> +                     } else
> +                             break;
> +             }
> +     } else if (rtl && newx > x) {
> +             while (qpos < tline.textLength()) {
> +                     int const xp = static_cast<int>(tline.cursorToX(qpos + 
> 1));
> +                     if (abs(xp - x) < abs(newx - x)) {
> +                             ++qpos;
> +                             newx = xp;
> +                     } else
> +                             break;
> +             }
> +     }
>       // correct x value to the actual cursor position.
> -     x = static_cast<int>(tl->lineForTextPosition(0).cursorToX(qpos));
> +     x = newx;
> +
>       /* Since QString is UTF-16 and docstring is UCS-4, the offsets may
>        * not be the same when there are high-plan unicode characters
>        * (bug #10443).

What are your thoughts on using pro-processor directives to keep track
of workarounds like this? For example, I really like the approach in
docstream.cpp for "WORKAROUND_ICONV_BUG". Are there disadvantages to
that approach?

Scott

Attachment: signature.asc
Description: PGP signature

Reply via email to