From: Vincent van Ravesteijn Date: Tue, 6 Jan 2015 17:48:19 +0000 (+0100) Subject: str_metrics: Prevent clipping of chars with negative bearing X-Git-Tag: 2.2.0alpha1~1382 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=c313b1c8eb01c85775e62a8675fa569d2c2aac2c;p=features.git str_metrics: Prevent clipping of chars with negative bearing This happens when part of the word is selected. To reproduce: 1. Start a new document 2. Type "af" 3. Select 'a' 4. Observe that the right part of the 'f' is clipped away. This patch uses QRegion to set a clip region that is everything except the part that is drawn in another color. Fixes: #9223. --- diff --git a/src/frontends/qt4/GuiPainter.cpp b/src/frontends/qt4/GuiPainter.cpp index 5730819a02..95ab52a98f 100644 --- a/src/frontends/qt4/GuiPainter.cpp +++ b/src/frontends/qt4/GuiPainter.cpp @@ -465,15 +465,16 @@ int GuiPainter::text(int x, int y, docstring const & str, Font const & f, // First the part in other color Color const orig = fi.realColor(); fi.setPaintColor(other); - setClipRect(QRect(x + xmin, y - ascent, xmax - xmin, height)); + QRegion const clip(x + xmin, y - ascent, xmax - xmin, height); + setClipRegion(clip); int const textwidth = text(x, y, str, fi, rtl); // Then the part in normal color - // Note that in Qt5, it is not possible to use Qt::UniteClip + // Note that in Qt5, it is not possible to use Qt::UniteClip, + // therefore QRegion is used. fi.setPaintColor(orig); - setClipRect(QRect(x, y - ascent, xmin, height)); - text(x, y, str, fi, rtl); - setClipRect(QRect(x + xmax, y - ascent, textwidth - xmax, height)); + QRegion region(viewport()); + setClipRegion(region - clip); text(x, y, str, fi, rtl); setClipping(false);