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.
This commit is contained in:
Vincent van Ravesteijn 2015-01-06 18:48:19 +01:00
parent be22665ceb
commit c313b1c8eb

View File

@ -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);