JMarc,

The following fixes the clipping of characters with negative bearing,
like the "f", at the end of a sentence. 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.

Ok ?

Vincent


 src/frontends/qt4/GuiPainter.cpp | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/src/frontends/qt4/GuiPainter.cpp b/src/frontends/qt4/GuiPainter.cpp
index 5730819..95ab52a 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);

-- 
2.1.2

Reply via email to