Fix clipping of wave underline decoration on certain fonts
Limit the height of the the wave-pixmap so that fillRect doesn't clip it. At the same time the precision of the generated wave-pixmap is improved so it better fits the requested radius. Task-number: QTCREATORBUG-15851 Change-Id: If754387b20ab7b015857ecb0a0e8fe16de1d728a Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com> Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
This commit is contained in:
parent
4c6324b5a7
commit
ab06266e15
@ -6179,7 +6179,8 @@ static QPixmap generateWavyPixmap(qreal maxRadius, const QPen &pen)
|
|||||||
|
|
||||||
QString key = QLatin1String("WaveUnderline-")
|
QString key = QLatin1String("WaveUnderline-")
|
||||||
% pen.color().name()
|
% pen.color().name()
|
||||||
% HexString<qreal>(radiusBase);
|
% HexString<qreal>(radiusBase)
|
||||||
|
% HexString<qreal>(pen.widthF());
|
||||||
|
|
||||||
QPixmap pixmap;
|
QPixmap pixmap;
|
||||||
if (QPixmapCache::find(key, pixmap))
|
if (QPixmapCache::find(key, pixmap))
|
||||||
@ -6187,7 +6188,7 @@ static QPixmap generateWavyPixmap(qreal maxRadius, const QPen &pen)
|
|||||||
|
|
||||||
const qreal halfPeriod = qMax(qreal(2), qreal(radiusBase * 1.61803399)); // the golden ratio
|
const qreal halfPeriod = qMax(qreal(2), qreal(radiusBase * 1.61803399)); // the golden ratio
|
||||||
const int width = qCeil(100 / (2 * halfPeriod)) * (2 * halfPeriod);
|
const int width = qCeil(100 / (2 * halfPeriod)) * (2 * halfPeriod);
|
||||||
const int radius = qFloor(radiusBase);
|
const qreal radius = qFloor(radiusBase * 2) / 2.;
|
||||||
|
|
||||||
QPainterPath path;
|
QPainterPath path;
|
||||||
|
|
||||||
@ -6210,7 +6211,7 @@ static QPixmap generateWavyPixmap(qreal maxRadius, const QPen &pen)
|
|||||||
// due to it having a rather thick width for the regular underline.
|
// due to it having a rather thick width for the regular underline.
|
||||||
const qreal maxPenWidth = .8 * radius;
|
const qreal maxPenWidth = .8 * radius;
|
||||||
if (wavePen.widthF() > maxPenWidth)
|
if (wavePen.widthF() > maxPenWidth)
|
||||||
wavePen.setWidth(maxPenWidth);
|
wavePen.setWidthF(maxPenWidth);
|
||||||
|
|
||||||
QPainter imgPainter(&pixmap);
|
QPainter imgPainter(&pixmap);
|
||||||
imgPainter.setPen(wavePen);
|
imgPainter.setPen(wavePen);
|
||||||
@ -6263,14 +6264,15 @@ static void drawTextItemDecoration(QPainter *painter, const QPointF &pos, const
|
|||||||
if (underlineStyle == QTextCharFormat::WaveUnderline) {
|
if (underlineStyle == QTextCharFormat::WaveUnderline) {
|
||||||
painter->save();
|
painter->save();
|
||||||
painter->translate(0, pos.y() + 1);
|
painter->translate(0, pos.y() + 1);
|
||||||
|
qreal maxHeight = fe->descent().toReal() - qreal(1);
|
||||||
|
|
||||||
QColor uc = charFormat.underlineColor();
|
QColor uc = charFormat.underlineColor();
|
||||||
if (uc.isValid())
|
if (uc.isValid())
|
||||||
pen.setColor(uc);
|
pen.setColor(uc);
|
||||||
|
|
||||||
// Adapt wave to underlineOffset or pen width, whatever is larger, to make it work on all platforms
|
// Adapt wave to underlineOffset or pen width, whatever is larger, to make it work on all platforms
|
||||||
const QPixmap wave = generateWavyPixmap(qMax(underlineOffset, pen.widthF()), pen);
|
const QPixmap wave = generateWavyPixmap(qMin(qMax(underlineOffset, pen.widthF()), maxHeight / 2.), pen);
|
||||||
const int descent = (int) fe->descent().toReal();
|
const int descent = qFloor(maxHeight);
|
||||||
|
|
||||||
painter->setBrushOrigin(painter->brushOrigin().x(), 0);
|
painter->setBrushOrigin(painter->brushOrigin().x(), 0);
|
||||||
painter->fillRect(pos.x(), 0, qCeil(width), qMin(wave.height(), descent), wave);
|
painter->fillRect(pos.x(), 0, qCeil(width), qMin(wave.height(), descent), wave);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user